Slony“重复键值违反唯一约束”错误

时间:2013-08-13 07:55:28

标签: postgresql slony

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

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

清理它的解决方法就是删除从站上的无效密钥(它遍布所有节点),它们全部再次运行。数据未损坏。但问题的根源仍未得到解决。

在googles中我发现没有任何与此问题相关的内容(我们没有在任何表上使用truncate,我们没有更改表的结构)。

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

2 个答案:

答案 0 :(得分:1)

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

  • 确保主表实际上具有约束

如果不是:

  • 清理桌子
  • 添加约束

否则:

  • 撤销所有客户 slony之外的复制表的写权限。

答案 1 :(得分:0)

正如Craig所说,这通常是对副本的写入事务。所以要做的第一件事就是验证权限。如果这种情况持续发生,您可以做的是开始记录副本的读者的连接并保持它们周围,以便在问题发生时,您可以追踪坏元组的来源。这可能会生成大量日志,因此您可能希望在何种程度上可以先缩小范围。你可能知道这是从哪个复制品开始,所以你可以从那里开始。

如果你有一个用户定义的写入函数,我会发现一个特别关注的领域。一个不经意的观察者可能不会在查询中发现它,也不会发现连接更加混乱。