我正在尝试将我的生产 Heroku 数据库导入我的开发机器。
我的本地数据库是PostgreSQL。
首先,我将转储从 Heroku 导出到我的机器
curl -o latest.dump `heroku pgbackups:url`
然后,我尝试使用 rake db:drop
删除本地数据库,然后使用 rake db:create
再次创建空数据库。
我遇到的问题是实际尝试将转储导入数据库时
psql -d app_development -U myusername -f mydumpfile.sql
我开始看到这样的错误
psql:latest.dump:24: ERROR: syntax error at or near "PGDMP"
LINE 1: PGDMP
^
psql:latest.dump:28: ERROR: syntax error at or near ""
LINE 1: INCREMENT BY 1
^
psql:latest.dump:36: ERROR: syntax error at or near ""
LINE 1: id integer NOT NULL,
^
psql:latest.dump:40: ERROR: syntax error at or near ""
LINE 1: INCREMENT BY 1
^
psql:latest.dump:45: ERROR: syntax error at or near ""
LINE 1: id integer NOT NULL,
^
psql:latest.dump:49: ERROR: syntax error at or near ""
LINE 1: INCREMENT BY 1
...
psql:latest.dump:1601: invalid command S4???(?̭?A?|c?e0<00K?A?}FϚ?????A(??~?t?I?????G(? K???l??k"?H?ȁ?ͲS?,N*?[(@??a5J??j}
psql:latest.dump:1602: invalid command ??k???|??w???h?
psql:latest.dump:1603: invalid command =??????o?h?
psql:latest.dump:1609: invalid command ????^.?????????E???/-???+??>#?ؚE?.2)Ȯ&???? g????"7},_??]?:?f?Tr|o???)?p????h?KO?08[Rqu???|3?cW?ڮ?ahbm??H?H8??$???2?a?-أ
psql:latest.dump:1613: invalid command D!qVS???L??*??R??I!???
psql:latest.dump:1614: invalid command ??-?}Q
psql:latest.dump:12565: ERROR: invalid byte sequence for encoding "UTF8": 0xb0
知道发生了什么以及如何解决吗?
你会看到错误,因为 psql 试图解释 SQL 查询,而你实际上给了他一个压缩转储(这就是 heroku 使用的)。
虽然您无法读取转储,但pg_restore -O latest.dump
为您提供了有效的 SQL,您可以通过管道到 psql,但简单的解决方案如下:
pg_restore -O -d app_development latest.dump
笔记:
- 使用
-O
因为您可能不使用远程 heroku postgres db 的随机用户名。 - Heroku不建议使用水龙头,但我不知道它有多大风险。
在终端
(Heroku 开发人员中心)中遵循以下 4 个简单步骤:
-
创建数据库的备份副本:
$ heroku pg:backups capture DATABASE_NAME
-
使用 curl 从 Heroku 下载副本(到本地计算机):
$ curl -o latest.dump `heroku pg:backups public-url`
-
加载它*:
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U YOUR_USERNAME -d DATABASE_NAME latest.dump
- 获取YOUR_USERNAME并从
config/database.yml
文件中选择所需的数据库。 - DATABASE_NAME可以是您的开发/测试/生产数据库(例如 mydb_development)
- 获取YOUR_USERNAME并从
就是这样!
避免在我的本地机器上设置 Postgres(如果您只是在寻找快速说明,那么吹走并重新创建数据库是一种痛苦)。我整理了一些使用运行 Docker 的本地 Postgres 数据库执行此操作的确切说明。我在这里添加一个链接,因为谷歌一直给我带来这个问题(这是一个可能的解决方案,尽管可能不是你要找的):https://gist.github.com/locofocos/badd43131f14b3e40c760741d5a26471
Heroku 导出数据库的 .dump 扩展文件,通过具有自己的规范和条件导入到任何关系数据库中。将其导入本地 postgres 数据库时,首先将文件 latest.dump 下载到本地计算机中,然后运行
pg_restore -h localhost -p 5432 -U postgres_username -d db_name -v latest.dump
并重新启动 Rails 服务器。
2021 年末更新迄今为止投票最高的答案(效果很好):
$ rails db:drop db:create db:migrate
$ Heroku PG:备份捕获DATABASE_URL
$ curl -o latest.dump heroku pg:backups public-url
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U YOUR_USERNAME -d DATABASE_NAME latest.dump
-
在本地计算机上获取YOUR_USERNAME
-
DATABASE_NAME可以是 config/database.yml 文件中的开发/测试/生产数据库(例如 rails_react_bootstrap_development)。
-
DATABASE_URL不是您需要设置的变量或示例代码。这是一个有效的英雄选项