问题在于:
我有一张像
这样的表格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
这个问题可能是什么原因?
答案 0 :(得分:3)
您正在尝试同时为同一个副本编写相同的idUser, date
对。
在最后一步中,同一对在不同主键下的两台服务器上都存在;不同的行但辅助唯一键是相同的。
答案 1 :(得分:2)
让我们的声明更加通用:“同时在两个主人的同一行上行动是不安全的。”它不仅是 IODKU 。此外,INSERTing
行具有相同的唯一键(特别是如果它们在其他列中具有不同的值)将导致错误。
Galera通过在COMMIT
时间与其他节点核对来避免此问题。
NDB Cluster通过实现“最终一致性”来避免这个问题。
现成的Master-Master充满了问题;你只确定了其中一个。正如迈克指出的那样,大多数问题都可以避免,但只能写给一位主人。