pg_restore后缺少约束

时间:2015-06-12 13:41:48

标签: postgresql pg-dump pg-restore

转储表并将其导入另一个postgres之后,db约束缺失。

我用它来转储:

    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

2 个答案:

答案 0 :(得分:1)

来自documentation

  

注意:当指定-t时,pg_dump不会尝试转储所选表可能依赖的任何其他数据库对象。因此,无法保证特定表转储的结果可以自行成功还原到干净的数据库中。

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

  1. 您可以手动重建约束,特别是如果您仍然使用创建它们的DDL。
  2. 您可以在数据库范围内pg_dump进行文本处理,从那里获取约束DDL,请参阅步骤1.
  3. 您可以执行数据库范围pg_dump,并将其完全还原。

答案 1 :(得分:0)

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

如果您要从大型转储文件中还原单个表,并且无法通过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命令都会获得第+1行。

此输出文件应包含您的索引(假设转储文件实际上包含它们以及数据)。然后,您可以将它们作为单个命令应用回还原的表中。

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