由于heroku的更改,我无法恢复我的heroku Postgres备份。
还原时引发以下错误:
pg_restore:错误:无法执行查询:错误:扩展名"pg_stat_statements"必须安装在模式"中;herokuext";命令是:CREATE EXTENSION IF NOT EXISTS";pg_stat_statements"WITH SCHEMA";"公共";;pg_restore:错误:无法执行查询:错误:扩展名"pg_stat_statements"不存在命令是:COMMENT ON EXTENSION;pg_stat_statements"IS"跟踪所有已执行SQL语句的计划和执行统计信息";命令是:CREATE EXTENSION IF NOT EXISTS";postgis";WITH SCHEMA";"公共";;
任何许多这样的错误。
我联系了Heroku的支持人员,他们提供了以下步骤来尝试手动修复问题。
以下是详细的步骤:
- 下载数据库备份
- 使用以下命令将转储文件转换为.sql文件:pg_restore-f
- 如果不存在,请修改CREATE EXTENSION命令以使用CREATE EXTENSIONextension_name WITH SCHEMA herokuext。您可以使用sed或文本编辑器来完成此操作由您选择
- 使用pg_Restore从您的应用程序将备份恢复到Heroku Postgres。扩展在您的生产数据库中,现在将由正确的模式拥有;将来迁移、备份和恢复应继续进行,而无需重复此操作过程
我已经按照步骤3修改了.sql文件,但我不知道如何将该.sql文件转换为要在Heroku应用程序上还原的.dump文件。
我尝试过heroku pg:psql --app <app> <sql_file>
,但它不起作用,并引发错误。
有人能帮我把这个.sql文件导入到Heroku吗?
解决问题的步骤:
- 从Heroku下载DB转储文件
- 使用pgrestore将转储转换为.sql文件
- 使用pg:Reset重置Heroku数据库
- 使用pg:psql登录到DB,并在";herokuext";模式
- 现在使用pg:psql在DB上执行.sql文件并检查错误
- 修改导致错误的.sql文件行。大多数错误可以通过替换";"公共";用";herokuext";在那几行
- 修改sql后,再次执行步骤3至步骤7,直到修复所有错误
在尝试本地恢复Heroku数据库时遇到了相同的问题,通过运行以下两个命令解决了这个问题:
psql <db> -c "CREATE SCHEMA IF NOT EXISTS heroku_ext"
psql <db> -c "ALTER database <db> SET search_path TO heroku_ext,public"
然后继续恢复:
pg_restore --verbose --clean --no-acl --no-owner -h localhost -d <db> latest.dump
如何在非Heroku环境中恢复Heroku数据库转储
- 从heroku下载最新的数据库转储
heroku pg:backups:download --app <app>
- 删除本地数据库(如果存在(并创建一个新数据库
psql <db_url> -c "DROP DATABASE IF EXISTS <db_name>"
psql <db_url> -c "CREATE DATABASE <db_name> WITH ENCODING 'UTF8' TEMPLATE template0"
重要部分来了
- 在新创建的数据库中创建
heroku_ext
模式
psql <db_url><db_name> -c "CREATE SCHEMA IF NOT EXISTS heroku_ext AUTHORIZATION <db_user>"
- 在
heroku_ext
模式中创建扩展
psql <db_url><db_name> -c "CREATE extension IF NOT EXISTS <extension> WITH schema heroku_ext"
- 授予必要的权限,例如:
psql <db_url><db_name> -c "GRANT ALL ON SCHEMA heroku_ext TO public"
psql <db_url><db_name> -c "GRANT USAGE ON SCHEMA heroku_ext TO public"
- 将架构添加到
search_path
psql <db_url><db_name> -c "SET search_path TO heroku_ext,public"
- 将架构权限授予相关用户
psql <db_url><db_name> -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA heroku_ext TO <db_user>"
最后
- 还原数据库转储
pg_restore --no-acl --no-owner -h <db_host> -U <db_user> -d <db_name> ./latest.dump
我遇到了同样的问题,并在这个问题中找到了答案。https://stackoverflow.com/a/73773443/17517157
只需将--extensions 'postgis'
添加到恢复命令中即可。
您可以忽略错误,并在所需的模式中手动创建扩展。如果您想避免出现错误消息,请在转储扩展名之前将其删除到数据库中。这应该不是问题,因为数据库中的任何其他内容都不应该依赖于该扩展名。