Postgresql pg_还原后缺少约束
在转储一个表并将其导入另一个postgres后,缺少db约束 我用这个来转储: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
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不会尝试转储所选表可能依赖的任何其他数据库对象。因此,不能保证特定表转储的结果能够自己成功地恢复到干净的数据库中
因此,你有一些公认的没有吸引力的选择:
pg_dump
,从中获取约束DDL,请参见步骤1pg_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