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

use*_*534 41 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`
Run Code Online (Sandbox Code Playgroud)

......这给我的"自定义数据库的转储文件格式",而不是"纯文本格式",所以我不能够做到这一点:

$ psql -d my_local_database -f my_dump_file.sql
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 55

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

首先,使用你的postgres字符串heroku config:get DATABASE_URL.

寻找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
Run Code Online (Sandbox Code Playgroud)

终端将询问您的密码然后运行它并将其转储到output.sql.

然后导入它:

psql -d my_local_database -f output.sql
Run Code Online (Sandbox Code Playgroud)

  • 另一种方式:1)`heroku pgbackups:capture` 2)将其复制到剪贴板:`heroku pgbackups:url` 3)`curl -o latest.dump <paste pgbackups:url here>` (3认同)
  • heroku config:get给了我错误"Missing argument:KEY",但只是heroku config给出了这个URL信息 (2认同)

Lei*_*cki 26

Heroku的PGBackup 实际上在幕后使用了pg_dump,而"自定义格式"实际上是pg_dump的自定义格式(-Fc参数),而不是Heroku自己的自定义格式.

这意味着您可以使用pg_restorePostgres的一部分将Heroku备份直接恢复到另一个数据库中:

pg_restore -d mydatabase my_dump_file.dump
Run Code Online (Sandbox Code Playgroud)

此外,如果您pg_restore未指定要还原的数据库的情况下调用,则会将SQL语句打印到标准输出,因此您可以将Heroku备份转换为SQL文件:

pg_restore my_dump_file.dump > sql_statements.sql
Run Code Online (Sandbox Code Playgroud)

  • 这个答案应该是正确的答案.使用`pg_restore my_dump_file.dump`将为您提供纯文本sql语句.谢谢亚当! (3认同)
  • 这个答案的第二部分救了我! (3认同)
  • 现在生成sql的正确命令是`pg_restore my_dump_file.dump -f -&gt; sql_statements.sql` (3认同)

tob*_*lty 19

假设您DATABASE_URL在环境中配置了一个更简单的方法:

heroku run 'pg_dump $DATABASE_URL' > my_database.sql
Run Code Online (Sandbox Code Playgroud)

这将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
Run Code Online (Sandbox Code Playgroud)

添加的-xO避免了倾销GRANT,REVOKEALTER OWNER语句,这可能并不适用于您的本地数据库服务器.如果您的任何COPY命令因错误而失败ERROR: literal carriage return found in data(我的确如此),请参阅此答案.

很可能这个问题在两年半前最初被问到这个问题时没有用,但是对于那些寻找方法来轻松获取Heroku Postgres数据库的人来说,这似乎是最简单的方法.今天.

  • 我想加倍赞成,因为答案解决了我的所有问题,包括回车。但是,我想预处理原始转储(不带“--inserts”)以获得更好的恢复性能。有任何想法吗? (2认同)

小智 9

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

heroku pg:backups:capture -a app-name
heroku pg:backups:download -a app-name
Run Code Online (Sandbox Code Playgroud)

该工具实际上会告诉捕获后使用什么命令。要从文件中获取 SQL latest.dump

pg_restore -f sqldump.sql latest.dump
Run Code Online (Sandbox Code Playgroud)

就是这样。