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

时间:2016-01-13 14:28:10

标签: mysql replication on-duplicate-key

问题在于:

  • 2 MySQL 5.5服务器
  • 基于行的复制+主控主人
  • 写入两台服务器(均为活动)
  • autoinc技巧(1个服务器奇数,另一个服务器偶数)

我有一张像

这样的表格

byUserDailyStatistics:

  • id(PK + AUTO INC)
  • 日期
  • ID用户所
  • metric1
  • metric2
  • UNIQUE(idUser,date)

所有请求都是

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

这个问题可能是什么原因?

2 个答案:

答案 0 :(得分:3)

您正在尝试同时为同一个副本编写相同的idUser, date对。

  1. 一个客户端使用奇数主键
  2. 写入master1
  3. 在第一次写入同步之前,另一个客户端使用偶数主键写入master2
  4. 服务器尝试彼此同步
  5. 在最后一步中,同一对在不同主键下的两台服务器上都存在;不同的行但辅助唯一键是相同的。

答案 1 :(得分:2)

让我们的声明更加通用:“同时在两个主人的同一行上行动是不安全的。”它不仅是 IODKU 。此外,INSERTing行具有相同的唯一键(特别是如果它们在其他列中具有不同的值)将导致错误。

Galera通过在COMMIT时间与其他节点核对来避免此问题。

NDB Cluster通过实现“最终一致性”来避免这个问题。

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