pg_restore后缺少约束条件

3
在将表导出并导入到另一个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文件中看到类似以下内容:

在toc.dat文件中,我所能看到的内容如下:

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

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

编辑:我正在使用PostgreSQL 9.3


1
尝试使用pg_restore --schema-only命令,不指定目标数据库,将DDL转储到标准输出。这应该首先清除“文件是二进制”的问题。 - Daniel Vérité
3个回答

3

这是从文档中得出的:

注意:当指定了 -t 参数时,pg_dump 不会试图转储所选表所依赖的任何其他数据库对象。因此,无法保证特定表的转储结果可以成功地单独恢复到一个干净的数据库中。

因此,您有一些明显不太理想的选择:

  1. 手动重建约束条件,特别是如果您仍然拥有创建它们的 DDL。
  2. 对整个数据库进行pg_dump导出为文本,从中获取约束条件 DDL,然后执行步骤 1。
  3. 对整个数据库进行pg_dump备份,并完全还原它。

2

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


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。
这个输出文件应该包含你的索引(假设转储文件实际上包含它们,以及数据)。然后你可以将它们作为单独的命令应用到恢复的表中。
虽然不是完美的解决方案,但比手动重新创建要好得多。

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