为什么 mysql INSERT ... ON DUPLICATE KEY UPDATE 会破坏主/主配置上的 RBR 复制

Why mysql INSERT ... ON DUPLICATE KEY UPDATE can break RBR replication on a master / master configuration

这是问题所在:

我有一个table喜欢

byUserDailyStatistics:

所有请求都是

INSERT INTO byEmailDailyStatistics
(date, idUser, metric1, metric2)
VALUES (:date, :user:, 1, 1)
ON DUPLICATE KEY UPDATE
metric1 = metric1 + 1,
metric2 = metric2 +1

有时,复制中断并显示类似

的消息
could not execute Write_rows event on table stats.byUserDailyStatistics; Duplicate entry '6447412-2016-01-06' for key 'UNIQUE', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.035580, end_log_pos 279798813

这个问题的根源是什么?

您正在尝试将相同的 idUser, date 对同时写入您的两个副本。

  1. 一个客户端使用奇数主键写入 master1
  2. 在第一次写入同步之前,另一个客户端使用偶数主键写入 master2
  3. 服务器尝试相互同步

在最后一步中,同一对在不同的主键下存在于两个服务器上;不同的行,但辅助唯一键相同。

让我们更笼统地说:"Simultaneously acting on the same row in both Masters is unsafe." 不仅仅是IODKU。此外,INSERTing 行具有相同的唯一键(特别是如果它们在其他列中具有不同的值)将导致错误。

Galera 通过在 COMMIT 时间检查其他节点来避免这个问题。

NDB Cluster 通过实现 "eventual consistency".

避免了这个问题

现成的Master-Master问题重重;你只确定了其中一个。大多数问题都可以避免,正如 Mike 指出的那样,但只能写给一位 Master。