移动PostgreSQL数据库时出现错误

3
我将尝试把一个数据库从一个主机转移到另一个主机,且在不同的用户中使用,它们都使用PostgreSQL 9.4。
我已经按照多个答案所建议的步骤进行了操作,但我仍然对其中一部分感到困惑。
我使用以下命令导出原始数据库:
pg_dump -d test --clean --no-owner -f test.sql

在目标机器上,在清除启动(initdb)后,我执行以下操作:
1. 创建用户test: createuser test 2. 创建数据库test并将其所有者设置为test: createdb -O test test 3. 现在,如果我执行 psql -l 命令,会显示test - test作为名称和所有者。
4. 现在,如果我尝试使用以下命令进行导入:psql -U test -d test -f test.sql,则会出现大量错误。
ERROR:  relation "public.x" does not exist
ERROR:  index "y" does not exist
ERROR:  sequence "z" does not exist
ERROR:  table "u" does not exist
ERROR:  must be owner of extension plpgsql
ERROR:  must be owner of schema public
ERROR:  schema "public" already exists

然而,即使存在所有这些错误,导入似乎已经完成,对目标机器进行转储最终得到了与源文件相同的SQL文件(除了最后两行超级用户行)。

我应该担心这些错误吗?为什么会出现这种情况,我应该怎样做才能避免这些错误?这是在服务器/用户之间移动数据库的推荐方法吗?


1
请使用 psql -v ON_ERROR_STOP=1 ... 重新运行以查看第一个错误。 - Craig Ringer
在根据@alexius的建议添加了--if-exists选项后,这行代码停在“必须是扩展plpgsql的所有者”。 - hyperknot
1个回答

0

这是正常行为,因为您使用了 --clean 选项进行备份。在这种情况下,SQL 脚本会尝试在创建数据库对象之前删除它们,但找不到任何对象。

您可以忽略这些错误,或者创建一个没有 --clean 选项或带有额外的 --if-exists 选项的转储文件(不确定是否会删除所有错误)。


谢谢,添加--if-exists 似乎已经清除了几乎所有的错误,现在停在第一个错误上,会出现一个“必须是扩展plpgsql的所有者”的错误。 - hyperknot
最有可能是尝试重新创建plpgsql扩展,您可以忽略它,没有什么大不了的。或者在postgres用户下运行。 - alexius
实际上,“--clean”选项很少使用,只有在您想将现有数据与转储数据合并时才需要使用它,否则重新创建数据库会更容易。 - alexius
是的,我得出了同样的结论,dropdb + createdb比--clean --if-exists更好。 - hyperknot
是的,这是PG中仍然存在的一个错误:http://www.postgresql.org/message-id/flat/E1VuYH7-0008Rz-SV@wrigleys.postgresql.org - hyperknot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接