Postgresql “斯隆”;重复的键值违反了唯一约束;错误

Postgresql “斯隆”;重复的键值违反了唯一约束;错误,postgresql,slony,Postgresql,Slony,我的问题持续了很长时间。我使用slony将数据库从主服务器复制到从服务器,并从该从服务器复制到其他三台备份服务器。每2-3周就有一次关键的重复问题,它只发生在一个特定的表上(在数据库中是大的,但不是最大的) 像一年前一样,它开始出现在Postgres 8.4和slony 1上,我们切换到了2.0.1。后来我们将它升级到2.0.4,并成功地将slony升级到2.1.3,这是我们的当前版本。我们在同一台计算机上开始了新的复制,直到今天一切都很顺利。我们在同一个表上得到了相同的复制键错误(当然每次都有

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

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

清理它的解决方案就是删除从机上的无效密钥(它分布在所有节点上),然后所有的密钥都会重新工作。数据没有损坏。但问题的根源仍未解决

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


有什么办法吗?

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


我要指出的一个特别关注的领域是,如果您有一个用户定义的函数来编写代码,会发生什么情况。偶然的观察者可能在查询中看不到,连接池也看不到。

当我们的设置中出现此问题时,发现主数据库的架构比从数据库的架构旧,并且没有此特定列的
唯一
约束。因此,我的建议是:

  • 确保主表实际上具有约束
如果没有:

  • 打扫桌子
  • 添加约束
其他:

  • 撤消除slony之外的所有客户端对复制表的写入权限

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