pg_dump输出包含重复项。

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。

你是否正在使用与 postgres 版本相同的 pg_dump?建议始终使用新的 pg_dump 二进制文件从旧版本中转储数据。 - mvp
你使用的Postgresql版本是哪个?有一些与重复键违规相关的错误,例如:http://www.postgresql.org/message-id/200704161728.l3GHSafh044711@wwwmaster.postgresql.org - Valentin V
4
开发者如何提出这样一个问题却没有说明他使用的版本,这让我感到困惑。 - Erwin Brandstetter
抱歉,现在已添加版本信息。 - spookylukey
2个回答

0

首先你需要花些时间研究转储文件并找出问题所在。我最初的猜测可能是两个备份被连接在一起了。但是有以下几点需要注意:

  1. 是否为给定表复制或插入语句重复出现?

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

  3. 您能否同时复制并不使用 --inserts 来重复此操作?

如果您能证明这不是由于连接备份而引起的,则建议采取以下两步:

  1. 升级 PostgreSQL 到最新的 9.1 版本,再次测试,如果仍然发生问题

  2. 编写详细的情况并跟进 pgsql-bugs 邮件列表。

我敢打赌这类问题像备份被连接在一起,但不能排除根据简单结论可能存在错误的情况。


如果备份实际上是连接在一起的,而且那些可能是我所拥有的最后一次备份,是否有办法恢复它们呢? - undefined

0

在进行psql恢复操作时,必须撤销与该数据库的所有会话,否则将会创建重复条目问题

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

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE  pid <> pg_backend_pid() AND datname = 'db_name' ;

那是错误的。pg_dump 在它开始时创建了数据的一致快照。之后发生的事务对 pg_dump 是不可见的。 - user330315
但是当我首先在新的数据库上创建了一个模式,然后在还原数据之前,我的AWS Lambda会话与我的数据库建立了连接并进行了条目时,我遇到了同样的问题。它不会让我创建唯一索引因为有重复条目。毫无疑问,情况各不相同,我只是向其他社区提供了这方面的提示。 - Jawad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接