由于我的postgres数据库在heroku(9.1)和我的本地安装(8.4)版本不兼容,我需要一个纯文本sql数据库转储文件,这样我就可以把我的生产数据的副本放在我的本地测试环境。
在heroku上,我似乎不能使用pg_dump进行转储,而只能这样做:
$ heroku pgbackups:capture
$ curl -o my_dump_file.dump `heroku pgbackups:url`
......这会给我“自定义数据库转储格式”,而不是“纯文本格式”,因此我无法执行此操作:
$ psql -d my_local_database -f my_dump_file.sql
8条答案
按热度按时间uttx8gqw1#
您可以直接从Heroku数据库创建自己的pg_dump。
首先,使用
heroku config:get DATABASE_URL
获取postgres字符串。查找Heroku Postgres URL(例如:
HEROKU_POSTGRESQL_RED_URL: postgres://user3123:passkja83kd8@ec2-117-21-174-214.compute-1.amazonaws.com:6212/db982398
),其格式为postgres://<username>:<password>@<host_name>:<port>/<dbname>
。接下来,在命令行上运行以下命令:
终端将询问您的密码,然后运行该密码并将其转储到output.sql中。
然后导入:
yiytaume2#
假设您的环境中配置了一个
DATABASE_URL
,那么有一个简单得多的方法:这将在您的容器中运行
pg_dump
,并将内容通过管道传输到一个本地文件my_database.sql
。**单引号很重要。**如果使用双引号(或根本不使用引号),则将在本地而不是在您的容器中计算DATABASE_URL
。如果您的全部目的是将内容加载到本地数据库中,那么您最好直接将其传输到本地数据库:
-xO
的添加避免了转储GRANT
、REVOKE
和ALTER OWNER
语句,这些语句可能不适用于本地数据库服务器。如果您的任何COPY
命令失败并出现错误ERROR: literal carriage return found in data
(我的命令也出现了),请参阅this answer。很有可能这在两年半前当这个问题最初被问到的时候是不起作用的,但是对于那些寻找一种方法来轻松地转储你的Heroku Postgres数据库的人来说,这似乎是今天最简单的可能方法。
pokxtpni3#
Heroku的PGBackups actually uses pg_dump behind the scenes,而“自定义格式”实际上是pg_dump's custom format (
-Fc
parameter),而不是Heroku自己的自定义格式。这意味着您可以使用
pg_restore
(Postgres的一部分)将Heroku备份直接恢复到另一个数据库中:此外,if you call
pg_restore
without specifying a database to restore to, it'll print SQL statements to standard out,因此您可以将Heroku备份转换为SQL文件,方法如下:UPDATE:在postgres的更新版本中,需要以下命令(感谢PatKilg的评论)
4ioopgfo4#
对于像我这样在2020年遇到这个问题的人来说:
该工具实际上会告诉您在捕获后使用什么命令。
就是这样。
z9zf31ra5#
以下是对我有效的方法:
说明:
1.首先,我们在Heroku上创建数据库的快照
1.然后,我们将快照下载为“latest.dump”(可以使用
-o '<name>.dump'
更改名称)1.将二进制转储转换为纯SQL,可以导入该纯SQL而无需引发“pg_dump:错误:由于服务器版本不匹配而中止”
1.将文件导入本地数据库
当然,如果您运行的postgresql版本与Heroku的兼容,
heroku pg:pull DATABASE_URL <DEV_DB_NAME>
更容易输入和记忆。vwkv1x7d6#
取自https://devcenter.heroku.com/articles/heroku-postgres-import-export。现在你有了一个二进制文件。要获得纯文本格式的文件,下面的代码对我很有效。注意:您需要安装PostgreSQL。
2admgd597#
您可以下载Heroku转储文件并将其转换为纯文本格式。
在较新的版本中,直接将
pg_restore
的输出重定向到SQL文件将不起作用。这样做将产生错误:相反,要以纯文本格式输出结果,应使用
-f
:这会将heroku的“自定义数据库转储格式”转换为“纯文本格式”。
然后导入此文件:
pftdvrlh8#
pg_dump
接受一个连接字符串,因此您不需要像下面提到的那样手动解构它:https://stackoverflow.com/a/22896985/3163631。假设您的连接字符串如下所示(我随机化了用户名和密码,并为其余部分添加了填充符。连接字符串的“形状”是正确的):
即使它是
postgres://<username>:<password>@<host_name>:<port>/<dbname>
,您也可以直接使用它,如下所示:也许在2014年Alex(https://stackoverflow.com/users/3457661/alex)回答时,
pg_dump
不可能做到这一点。