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

时间:2014-04-05 22:11:37

标签: sql postgresql heroku

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

6 个答案:

答案 0 :(得分:53)

您可以直接从Heroku数据库创建自己的pg_dump。

首先,使用heroku config:get DATABASE_URL获取postgres字符串。

查找Heroku Postgres网址(示例: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

答案 1 :(得分:22)

Heroku的PGBackup actually uses pg_dump behind the scenes和&#34;自定义格式&#34;实际上是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

答案 2 :(得分:16)

假设您的环境中配置了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数据库的人来说,这似乎是最简单的方法今天这样做。

答案 3 :(得分:4)

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

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

该工具实际上会告诉您捕获后使用什么命令。要从您的latest.dump文件中获取SQL,请执行以下操作:

pg_restore -f sqldump.sql latest.dump

就是这样。

答案 4 :(得分:0)

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

取自https://devcenter.heroku.com/articles/heroku-postgres-import-export。 现在您有了一个二进制文件。要获取纯文本格式的文件,以下内容对我有用。注意:您将需要安装PostgreSQL。

pg_restore latest.dump > latest.sql

答案 5 :(得分:0)

您可以直接下载 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