我仔细阅读了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
我不明白为什么会出现这种错误。首先,它没有任何意义,因为显然没有重复的密钥,否则常规插入将失败(并且手动检查确认了这一点)。
我插入的数据库是空的。它已经使用模式初始化(我们正在从中转储相同的模式),就是这样。
或许值得注意的是,主键在过去已被修改过。它们都增加了一个设定的数字,这需要暂时删除主键约束。但这不应该使数据无效(并且纯文本格式的工作原理显示数据有效)。