2

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

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

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

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

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

4

2 回答 2

1

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

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

如果不:

  • 清理桌子
  • 添加约束

别的:

  • 撤销所有客户端的写权限,除了slony 对复制的表。
于 2015-05-29T13:26:08.497 回答
0

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

我会发现一个特别关注的领域是如果你有一个用户定义的函数来编写会发生什么。一个偶然的观察者可能不会在查询中发现它,连接池也可能不会。

于 2013-11-09T12:30:02.317 回答