pg_restore 后缺少约束

Constraints missing after pg_restore

转储 table 并将其导入另一个 postgres 数据库后,缺少约束。

我用这个来转储:

    pg_dump --host=local --username=user -W --encoding=UTF-8 -j 10 --file=dump_test --format=d -s --dbname=mydb -t addendum

要导入的内容:

    pg_restore -d myOtherdb --host=local -n public --username=user -W --exit-on-error --format=d -j 10 -t addendum dump_test/

我在结果 toc.dat 中看到的是这样的:

    ADD CONSTRAINT pk_addendum PRIMARY KEY (addendum_id);
    >   ALTER TABLE ONLY public.addendum DROP CONSTRAINT pk_addendum;

这看起来像是在创建和销毁 PK,但我不确定我的解释是否正确,因为文件是二进制文件。

编辑:我使用的是 PostgreSQL 9.3

来自documentation

Note: When -t is specified, pg_dump makes no attempt to dump any other database objects that the selected table(s) might depend upon. Therefore, there is no guarantee that the results of a specific-table dump can be successfully restored by themselves into a clean database.

因此你有一些公认的没有吸引力的选择:

  1. 您可以手动重建约束,尤其是当您仍然拥有创建约束的 DDL 时。
  2. 您可以对文本执行数据库范围的 pg_dump,从那里获取约束 DDL,请参阅步骤 1。
  3. 您可以在数据库范围内执行 pg_dump,然后将其完全还原。

我曾遇到 table 已经存在但使用 pg_restore 删除了 table 的约束的情况。 已经有一个可接受的答案,但我会尝试为要恢复的 table 已经可用的情况提供答案。在这种情况下,只有当您尝试删除并重新创建 table(-c 或 -C)时,才会删除约束。而如果您只想要转储中的数据,则可以执行删除 table 上的所有记录(从 table 名称中删除),然后使用带有 -a 标志的 pg_restore。因此,您可以从 pg_restore 命令中排除 -c 或 -C 标志。

聚会有点晚了,但这里有一些东西可能会有所帮助。

如果您从大型转储文件中恢复单个 table 并且在使用 pg_restore 获取索引时遇到问题(-t 不执行索引和约束)

 pg_restore db_dump_file.dump | awk '/table_name/{nr[NR]; nr[NR+1]}; NR in nr' > table_name_indexes_tmp.psql

您还需要索引和约束匹配后的后续行。上面的 awk 命令在每次匹配后得到 line + 1。

此输出文件应包含您的索引(假设转储文件实际包含它们以及数据)。然后您可以将它们应用回您作为单独命令恢复的 table。

这不是一个完美的解决方案,但比尝试手动重新创建它们要好。