我们在主机本地通过以下命令从 PostgreSQL v10 转储了一个 SQL 文件:
pg_dump \
"postgres://db_user:db_pass@localhost:5432/database" \
--file "pgsql-dump-v10.sql" \
--format=p --no-owner --no-privileges
我们将dump文件复制到另外一个v16的PostgreSQL中,在本地调用以下命令导入数据:
psql \
"postgresql://db_user:db_pass@localhost/database" \
--file pgsql-dump-v10.sql
并且,它会收到以下错误消息:
psql:/xxx/pgsql-dump-v10.sql:30: 错误:必须是扩展 plpgsql 的所有者
罪魁祸首是第 30 行,pssql-dump-v10.sql
如下所示:
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
该错误似乎并不严重,因此我们pg_dump
在 PostgreSQL v16 实例上调用相同的命令,并将两个转储进行比较,如下面的屏幕截图所示。
另外,在 PostgreSQL v16 上运行时pgsql-dump-v16.sql
,它没有任何错误。
我们的问题:
虽然不是关键问题,但我们希望解决设置扩展注释时的错误。并且,我们非常感谢任何提示和建议。
此外,如果错误实际上的影响比我们所看到的更大,也请提醒我们。我们正在为生产操作做准备。
谢谢。
该
plpgsql
模块早已默认安装,因此其所有者是创建 Postgres 实例的超级用户。在您的目标 v16 实例中,它已经存在。如果db_user
您在恢复转储时指定的不是创建目标实例的超级用户,则显然无法更新它不拥有的扩展上的注释。您可以执行以下任一操作(无特定顺序):
pg_dump 的行为随着版本 14而改变:
旧版本会在备份中转储所有扩展,因为版本 14 默认会转储目标数据库中的所有非系统扩展。您可以使用-e或--extension=覆盖此设置