由于我的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
答案 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
可以避免转储GRANT
,REVOKE
和ALTER 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