pg_restore:错误:无法执行查询:错误:扩展“pg_stat_statements”必须安装在模式“heroku_ext”中

o2gm4chl  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(431)

由于此change by heroku,我无法恢复我的Heroku Postgres备份。
还原时引发以下错误:
pg_restore:错误:无法执行查询:错误:扩展“pg_stat_statements”必须安装在架构“heroku_ext”中命令为:如果不存在,则创建扩展。“pg_恢复:错误:无法执行查询:错误:扩展名“pg_stat_statements”不存在命令为:COMMENT ON EXTENSION“pg_stat_statements”IS '跟踪所有已执行SQL语句的计划和执行统计信息';命令是:如果不存在,则创建扩展“postgis”,并使用模式“public”;
任何许多这样的错误。
我联系了Heroku支持部门,他们已经提供了以下步骤来尝试手动修复这个问题。
以下是详细的步骤:
1.下载数据库的备份。
1.使用以下命令将转储文件转换为.sql文件:pg_恢复-f
1.修改CREATE EXTENSION命令以使用CREATE EXTENSION IF NOT EXISTS extension_name WITH SCHEMA heroku_ext。您可以使用sed或您选择的文本编辑器来执行此操作。
1.使用pg_restore将备份从您的应用还原到Heroku Postgres。生产数据库中的扩展现在将归正确的架构所有;以后的迁移、备份和还原无需重复此过程即可继续。
我已经按照步骤3修改了.sql文件,但我无法找到如何将此.sql文件转换为.dump文件以在Heroku应用程序上还原。
我已经尝试了heroku pg:psql --app <app> <sql_file>,但它不工作,并抛出错误。
有人能帮我把这个.sql文件导入Heroku吗?

jdgnovmf

jdgnovmf1#

解决此问题所遵循的步骤:
1.从Heroku下载数据库转储文件。
1.使用pg_restore将转储转换为.sql文件。
1.使用pg:reset重置Heroku数据库
1.使用pg:psql登录到数据库,并在“heroku_ext”模式中安装扩展
1.现在,使用pg:psql在DB上执行.sql文件并检查错误
1.修改导致错误的.sql文件行。大多数错误可以通过将该行中的“public”替换为“heroku_ext”来解决。
1.修改sql后,再次执行步骤3到步骤7,直到修复所有错误。

dhxwm5r4

dhxwm5r42#

如何在非Heroku环境中还原Heroku数据库转储

1.从heroku下载最新的数据库转储

heroku pg:backups:download --app <app>

1.删除本地数据库(如果存在)并创建一个新数据库

psql <db_url> -c "DROP DATABASE IF EXISTS <db_name>"
psql <db_url> -c "CREATE DATABASE <db_name> WITH ENCODING 'UTF8' TEMPLATE template0"

重要的部分来了
1.在新创建的数据库中创建heroku_ext模式

psql <db_url><db_name> -c "CREATE SCHEMA IF NOT EXISTS heroku_ext AUTHORIZATION <db_user>"

1.在heroku_ext模式中创建扩展

psql <db_url><db_name> -c "CREATE extension IF NOT EXISTS <extension> WITH schema heroku_ext"

1.授予必要的权限,例如:

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"

1.将架构添加到search_path

psql <db_url><db_name> -c "SET search_path TO heroku_ext,public"

1.向相关用户授予对方案的权限

psql <db_url><db_name> -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA heroku_ext TO <db_user>"

终于...
1.恢复数据库转储

pg_restore --no-acl --no-owner -h <db_host> -U <db_user> -d <db_name> ./latest.dump
moiiocjp

moiiocjp3#

您可以忽略此错误,并在所需的方案中手动创建扩展。如果要避免出现错误消息,请在转储扩展之前将其从数据库中删除。这应该不是问题,因为数据库中的任何其他内容都不应依赖于该扩展。

相关问题