【问题标题】:pg_dump output contains duplicatespg_dump 输出包含重复项
【发布时间】:2013-03-19 22:48:11
【问题描述】:

我在一个数据库上运行了 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 二进制文件从旧版本转储数据
  • 您使用的是哪个版本的 Postgresql?存在与重复密钥违规相关的错误,例如:postgresql.org/message-id/…
  • 开发人员如何在提供他使用的版本的情况下提出这样的问题?打败我。
  • 抱歉,版本信息已添加。

标签: postgresql pg-dump


【解决方案1】:

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

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

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

【讨论】:

  • 错了。 pg_dump 在数据启动时创建一致的数据快照。之后发生的事务对 pg_dump 是不可见的
  • 但是,当我首先在新数据库上创建架构然后在恢复数据之前,我的 aws lambda 与我的数据库创建了一个会话并执行了一个条目时,我遇到了同样的问题。由于双重输入,它不会让我创建唯一索引。毫无疑问,情况因人而异,我只是向其他社区暗示了这一点。
【解决方案2】:

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

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

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

  3. 您能否使用 --inserts 和不使用 --inserts 来复制它?

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2020-10-26
    • 2019-01-05
    相关资源
    最近更新 更多