我如何在heroku上获得纯文本postgres数据库转储?

izkcnapc  于 2022-11-13  发布在  其他
关注(0)|答案(8)|浏览(186)

由于我的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
uttx8gqw

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>
接下来,在命令行上运行以下命令:

pg_dump --host=<host_name> --port=<port> --username=<username> --password --dbname=<dbname> > output.sql

终端将询问您的密码,然后运行该密码并将其转储到output.sql中。
然后导入:

psql -d my_local_database -f output.sql
yiytaume

yiytaume2#

假设您的环境中配置了一个DATABASE_URL,那么有一个简单得多的方法:

heroku run 'pg_dump $DATABASE_URL' > my_database.sql

这将在您的容器中运行pg_dump,并将内容通过管道传输到一个本地文件my_database.sql。**单引号很重要。**如果使用双引号(或根本不使用引号),则将在本地而不是在您的容器中计算DATABASE_URL
如果您的全部目的是将内容加载到本地数据库中,那么您最好直接将其传输到本地数据库:

createdb myapp_devel  # start with an empty database
heroku run 'pg_dump -xO $DATABASE_URL' | psql myapp_devel

-xO的添加避免了转储GRANTREVOKEALTER OWNER语句,这些语句可能不适用于本地数据库服务器。如果您的任何COPY命令失败并出现错误ERROR: literal carriage return found in data(我的命令也出现了),请参阅this answer
很有可能这在两年半前当这个问题最初被问到的时候是不起作用的,但是对于那些寻找一种方法来轻松地转储你的Heroku Postgres数据库的人来说,这似乎是今天最简单的可能方法。

pokxtpni

pokxtpni3#

Heroku的PGBackups actually uses pg_dump behind the scenes,而“自定义格式”实际上是pg_dump's custom format ( -Fc parameter),而不是Heroku自己的自定义格式。
这意味着您可以使用pg_restore(Postgres的一部分)将Heroku备份直接恢复到另一个数据库中:

pg_restore -d mydatabase my_dump_file.dump

此外,if you call pg_restore without specifying a database to restore to, it'll print SQL statements to standard out,因此您可以将Heroku备份转换为SQL文件,方法如下:

pg_restore my_dump_file.dump > sql_statements.sql

UPDATE:在postgres的更新版本中,需要以下命令(感谢PatKilg的评论)

pg_restore latest.dump -f - > sql_statements.sql
4ioopgfo

4ioopgfo4#

对于像我这样在2020年遇到这个问题的人来说:

heroku pg:backups:capture -a app-name
heroku pg:backups:download -a app-name

该工具实际上会告诉您在捕获后使用什么命令。

pg_restore -f sqldump.sql latest.dump

就是这样。

z9zf31ra

z9zf31ra5#

以下是对我有效的方法:

heroku pg:backups:capture
heroku pg:backups:download
pg_restore latest.dump -f latest.sql
psql -f 'latest.sql' -d '<DEV_DB_NAME>'

说明:
1.首先,我们在Heroku上创建数据库的快照
1.然后,我们将快照下载为“latest.dump”(可以使用-o '<name>.dump'更改名称)
1.将二进制转储转换为纯SQL,可以导入该纯SQL而无需引发“pg_dump:错误:由于服务器版本不匹配而中止”
1.将文件导入本地数据库
当然,如果您运行的postgresql版本与Heroku的兼容,heroku pg:pull DATABASE_URL <DEV_DB_NAME>更容易输入和记忆。

vwkv1x7d

vwkv1x7d6#

Heroku pg:backups:capture
Heroku pg:backups:download

取自https://devcenter.heroku.com/articles/heroku-postgres-import-export。现在你有了一个二进制文件。要获得纯文本格式的文件,下面的代码对我很有效。注意:您需要安装PostgreSQL。

pg_restore latest.dump > latest.sql
2admgd59

2admgd597#

您可以下载Heroku转储文件并将其转换为纯文本格式。
在较新的版本中,直接将pg_restore的输出重定向到SQL文件将不起作用。这样做将产生错误:

pg_restore my_dump_file.dump > my_dump_file.sql
pg_restore: error: one of -d/--dbname and -f/--file must be specified

相反,要以纯文本格式输出结果,应使用-f

pg_restore my_dump_file.dump -f my_dump_file.sql

这会将heroku的“自定义数据库转储格式”转换为“纯文本格式”。
然后导入此文件:

psql -d my_local_database -f my_dump_file.sql
pftdvrlh

pftdvrlh8#

pg_dump接受一个连接字符串,因此您不需要像下面提到的那样手动解构它:https://stackoverflow.com/a/22896985/3163631
假设您的连接字符串如下所示(我随机化了用户名和密码,并为其余部分添加了填充符。连接字符串的“形状”是正确的):

postgres://Nb6n8BTA4rPK5m:DzEPtwZUkJfgbMSdYFUbqupvJeEekihiJNzqGXa3wN2pmYRGcLQ8Sa69ujGn2RSkb@ec2-00-000-000-000.compute-1.amazonaws.com:5432/j4aaaaaaaaaam1

即使它是postgres://<username>:<password>@<host_name>:<port>/<dbname>,您也可以直接使用它,如下所示:

pg_dump postgres://Nb6n8BTA4rPK5m:DzEPtwZUkJfgbMSdYFUbqupvJeEekihiJNzqGXa3wN2pmYRGcLQ8Sa69ujGn2RSkb@ec2-00-000-000-000.compute-1.amazonaws.com:5432/j4aaaaaaaaaam1 > output.sql

也许在2014年Alex(https://stackoverflow.com/users/3457661/alex)回答时,pg_dump不可能做到这一点。

相关问题