有关PLPGSQL的PostgreSQL 9.1 pg_restore错误

fur*_*s12 66 postgresql plpgsql database-restore

我正在使用Postgres进行django项目,我目前正在实现一个数据库备份/恢复系统,当用户单击备份时,尽可能简单地执行pg_dump,然后在单击恢复备份时执行pg_restore.

所有看起来都很好和花花公子,直到它实际上尝试执行pg_restore,此时它给出了这个错误:

pg_restore:[archiver(db)]来自TOC条目3206的错误; 0 0 COMMENT EXTENSION plpgsql pg_restore:[archiver(db)]无法执行查询:ERROR:必须是扩展名plpgsql的所有者命令为:COMMENT ON EXTENSION plpgsql IS'PL/pgSQL procedureural language';

我已经研究了plpgsql是什么等我明白了,关于错误,我尝试手动设置"扩展的所有者"给执行脚本的用户并拥有数据库本身,但是没有改变,它真的很烦人,因为它试图设置所有事情的评论时出错

这都是由pg_dump自动创建的,因此注释行无法删除,并且没有标记可以禁用注释(我知道这一点),所以我真的不知道如何解决这个问题.

小智 115

似乎pg_restore试图恢复一些你不拥有的额外数据.尝试向-n publicpg_restore命令行添加选项.它将告诉pg_restore仅恢复公共模式的内容.你的命令行应该是这样的

pg_restore -U username -c -n public -d database_name
Run Code Online (Sandbox Code Playgroud)

  • 此选项是否涉及恢复后的信息丢失?也就是说,它会丢失任何重要数据吗? (8认同)
  • 它取决于C2H5OH.当您的数据库备份包含多个架构时,上述命令将仅导入架构"public"(=信息丢失).如果转储仅包含模式"public",那么您没有问题(请参阅:pg_dump --exclude-schema).要检查转储文件中的模式,请运行以下命令:pg_restore -l -F t dumpfile.tar | grep SCHEMA | awk -F""'{print $(NF-1)}' - (7认同)
  • 这解决了我尝试加载其他扩展的 `pg_restore` 问题,在我们的场景中这是不允许的。 (2认同)
  • 如果您使用大对象,您还需要小心,它们不会被恢复 (2认同)

小智 15

我在此页面上找到了以下解决方法:

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

我们的想法是使用pg_restore -l列出存档的内容,grep out用户无权恢复的扩展名,并在恢复时使用pg_restore -L来使用此省略列表.

例如:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用。不过有一个警告,第二个命令会将所有内容打印到`STDOUT`,因此您可能希望将其重定向到一个文件。 (2认同)

jab*_*lab 8

如果您运行的是Postgres 11(或更高)版本,pg_dump那么您可以利用新--no-comments标志。


Pet*_*ber 5

如果可能,建议您在创建任何转储之前删除无法恢复的注释。

您可以通过以下方式进行操作:

COMMENT ON EXTENSION plpgsql IS null;
Run Code Online (Sandbox Code Playgroud)

如果不想对每个新创建的数据库都这样做,请从名为template1的数据库中删除注释(CREATE DATABASE…复制此数据库。)

此后创建的转储应该没有错误地恢复。