【问题标题】:Slony "duplicate key value violates unique constraint" errorSlony“重复键值违反唯一约束”错误
【发布时间】:2015-05-29 21:26:08
【问题描述】:

我有一个问题持续了很长时间。我使用 slony 将数据库从主服务器复制到从服务器,然后从该从服务器复制到其他三个备份服务器。每隔 2-3 周就会出现一个关键重复问题,该问题仅发生在一个特定的表上(数据库中的大但不是最大的)。

它像一年前在 Postgres 8.4 和 slony 1 上开始出现,我们切换到 2.0.1。后来我们把它升级到了2.0.4,我们成功地把slony升级到了2.1.3,这是我们现在的版本。我们在同一台计算机上开始了新的复制,直到今天一切顺利。我们在同一张表上遇到了相同的重复键错误(当然每次使用不同的键)。

清理它的解决方案只是删除从属服务器上的无效密钥(它分布在所有节点上),然后一切都恢复正常了。数据未损坏。但问题的根源仍未解决。

在谷歌中我没有发现任何与这个问题相关的东西(我们没有在任何表上使用截断,我们没有改变表的结构)。

有什么想法可以做些什么吗?

【问题讨论】:

  • 通常的罪魁祸首是应用程序更改了复制表中的一条记录。确保您的应用程序仅对副本上的复制表具有只读访问权限。

标签: postgresql slony


【解决方案1】:

当我们的设置中出现此问题时,事实证明主数据库的架构比从属数据库的架构更旧,并且对于该特定列没有UNIQUE 约束。所以,我的建议是:

  • 确保主表事实上的约束

如果没有:

  • 清理桌子
  • 添加约束

其他:

  • 撤销所有客户端的写权限除了复制表的slony。

【讨论】:

    【解决方案2】:

    正如 Craig 通常所说,这是对副本的写入事务。所以首先要做的是验证权限。如果这种情况持续发生,您可以做的是开始记录副本读取器的连接并保留它们,以便当问题发生时,您可以追踪坏元组的来源。但是,这会生成大量日志,因此您可能想先看看可以在多大程度上缩小范围。您大概知道这是从哪个副本开始的,因此您可以从那里开始。

    如果你有一个用户定义的函数来编写,我会发现一个特别关注的领域。不经意的观察者可能不会在查询中发现这一点,连接池也可能不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-15
      • 2016-07-27
      • 2011-10-17
      • 2012-03-03
      • 2018-08-26
      • 2021-10-23
      • 1970-01-01
      • 2016-10-24
      相关资源
      最近更新 更多