2

转储表并将其导入另一个 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

4

3 回答 3

2

文档中:

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

因此,您有一些公认的不吸引人的选择:

  1. 您可以手动重建约束,特别是如果您仍然拥有创建它们的 DDL。
  2. 您可以pg_dump对文本进行数据库范围的处理,从那里获取约束 DDL,请参见步骤 1。
  3. 你可以做一个数据库范围pg_dump,并完全恢复它。
于 2015-06-12T14:40:26.980 回答
2

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

于 2017-11-28T06:22:02.813 回答
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 命令在每次匹配后获取 line + 1。

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

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

于 2020-04-17T17:22:57.687 回答