Postgresql pg_还原后缺少约束

Postgresql pg_还原后缺少约束,postgresql,pg-dump,pg-restore,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

在转储一个表并将其导入另一个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,来自:

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

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

  • 您可以手动重新生成约束,特别是如果您仍然拥有创建约束的DDL
  • 您可以对文本执行数据库范围的
    pg_dump
    ,从中获取约束DDL,请参见步骤1
  • 您可以执行数据库范围的
    pg_dump
    ,并完全恢复它

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

    参加聚会有点晚,但这里有一些可能会有所帮助

    如果要从大型转储文件还原单个表,并且在使用pg_restore获取索引时遇到问题(-t不执行索引和约束)

    您还需要在索引和约束匹配后的下一行。上面的awk命令在每次匹配后获得第+1行

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

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

    尝试
    pg_restore--schema only
    ,不使用目标数据库将DDL转储到标准输出。这应该可以解决“文件是二进制的”问题。
     pg_restore db_dump_file.dump | awk '/table_name/{nr[NR]; nr[NR+1]}; NR in nr' > table_name_indexes_tmp.psql