3

我在数据库上运行 pg_dump,并使用 pg_restore 恢复到一个新的、完全为空的数据库中,但出现错误:

pg_restore: [archiver (db)] could not execute query: ERROR:  could not create unique index "bibleverses_userversestatus_pkey"
DETAIL:  Table contains duplicated values.

检查恢复后的表会显示重复的主键值,这会阻止创建索引。

然而,检查 pg_dump 来自的原始数据库并没有显示这个重复的行 - 一切都是它应该的(并且必须是,因为约束)。

这怎么会发生,如何解决?

(这是一个持续性错误,而不是一个错误 - 再次运行 pg_dump 并不能修复它)。

编辑:抱歉,完全忘记了版本信息:pg_dump/postgres 8.3.11,pg_restore 9.1.6

4

2 回答 2

0

首先要弄清楚这一点,您将不得不花一些时间处理转储文件并找出发生了什么。我的直接猜测是,也许两个备份正在连接在一起。但这里有一些事情要看:

  1. 给定表的 COPY 或 INSERT 语句是否多次出现?

  2. 你能证明数据在给定的 COPY 或 INSERT 运行中被复制了吗?

  3. 你可以用 --inserts 和没有那个来复制它吗?

如果您可以证明它不是由将备份连接在一起引起的,那么我建议此时执行两个步骤:

  1. 将PostgreSQL升级到最新的9.1,再次测试,如果仍然出现

  2. 写一个详细的案例并跟进 pgsql-bugs 电子邮件列表。

我敢打赌它就像将备份连接在一起一样,但我不能根据斯巴达式的结论排除可能存在错误的可能性。

于 2013-05-12T07:38:26.057 回答
0

在 psql 还原期间必须撤销与该数据库的所有会话,否则将产生重复条目问题

从特定数据库撤消会话的命令:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE  pid <> pg_backend_pid() AND datname = 'db_name' ;
于 2020-01-16T06:19:55.960 回答