pg_dump的自定义格式会创建普通格式所没有的错误

时间:2014-11-20 05:10:26

标签: postgresql

我仔细阅读了pg_dump和pg_restore的文档,但没有找到任何表明自定义格式在某种程度上更具限制性的内容。事实上,一切似乎都表明相反。

我正在运行pg_dump,如:

pg_dump --host=example.com --username=xxx --dbname=xxx \
     --format=plain --table=ns_* --data-only > dump

用以下方法恢复:

cat dump | psql --host=example.com --username=xxx --dbname=xxx

这很好。没有错误,数据看起来完全符合预期。但是,如果我更改pg_dump以使用自定义语法,如下所示:

pg_dump --host=example.com --username=xxx --dbname=xxx \
     --format=custom --table=ns_* --data-only > dump

然后恢复:

pg_restore --host=example.com --username=xxx --dbname=xxx \
    --data-only --single-transaction dump

我收到错误:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2210; 0 1440417 TABLE DATA <table_name> <database_name>
pg_restore: [archiver (db)] COPY failed for table "<table_name>": ERROR:  duplicate key value violates unique constraint "<table_name>_pkey"
DETAIL:  Key (ex_id)=(7) already exists.
CONTEXT:  COPY <table_name>, line 1

我不明白为什么会出现这种错误。首先,它没有任何意义,因为显然没有重复的密钥,否则常规插入将失败(并且手动检查确认了这一点)。

我插入的数据库是空的。它已经使用模式初始化(​​我们正在从中转储相同的模式),就是这样。

或许值得注意的是,主键在过去已被修改过。它们都增加了一个设定的数字,这需要暂时删除主键约束。但这不应该使数据无效(并且纯文本格式的工作原理显示数据有效)。

0 个答案:

没有答案