pg_restore:错误:无法执行查询:错误:必须在架构"heroku_ext"中安装扩展"pg_stat_statements"



由于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的支持人员,他们提供了以下步骤来尝试手动修复问题。

以下是详细的步骤:

  1. 下载数据库备份
  2. 使用以下命令将转储文件转换为.sql文件:pg_restore-f
  3. 如果不存在,请修改CREATE EXTENSION命令以使用CREATE EXTENSIONextension_name WITH SCHEMA herokuext。您可以使用sed或文本编辑器来完成此操作由您选择
  4. 使用pg_Restore从您的应用程序将备份恢复到Heroku Postgres。扩展在您的生产数据库中,现在将由正确的模式拥有;将来迁移、备份和恢复应继续进行,而无需重复此操作过程

我已经按照步骤3修改了.sql文件,但我不知道如何将该.sql文件转换为要在Heroku应用程序上还原的.dump文件。

我尝试过heroku pg:psql --app <app> <sql_file>,但它不起作用,并引发错误。

有人能帮我把这个.sql文件导入到Heroku吗?

解决问题的步骤:

  1. 从Heroku下载DB转储文件
  2. 使用pgrestore将转储转换为.sql文件
  3. 使用pg:Reset重置Heroku数据库
  4. 使用pg:psql登录到DB,并在";herokuext";模式
  5. 现在使用pg:psql在DB上执行.sql文件并检查错误
  6. 修改导致错误的.sql文件行。大多数错误可以通过替换";"公共";用";herokuext";在那几行
  7. 修改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数据库转储

  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

我遇到了同样的问题,并在这个问题中找到了答案。https://stackoverflow.com/a/73773443/17517157

只需将--extensions 'postgis'添加到恢复命令中即可。

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

最新更新