为什么 mysql INSERT ... ON DUPLICATE KEY UPDATE 会破坏主/主配置上的 RBR 复制
Why mysql INSERT ... ON DUPLICATE KEY UPDATE can break RBR replication on a master / master configuration
这是问题所在:
- 2 MySQL 5.5 个服务器
- 基于行的复制 + master master
- 写入在两台服务器上(均处于活动状态)
- autoinc 技巧(一台服务器奇数,另一台服务器偶数)
我有一个table喜欢
byUserDailyStatistics:
- id (PK + AUTO INC)
- 日期
- idUser
- 公制 1
- 公制2
- 唯一(idUser,日期)
所有请求都是
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
对同时写入您的两个副本。
- 一个客户端使用奇数主键写入 master1
- 在第一次写入同步之前,另一个客户端使用偶数主键写入 master2
- 服务器尝试相互同步
在最后一步中,同一对在不同的主键下存在于两个服务器上;不同的行,但辅助唯一键相同。
让我们更笼统地说:"Simultaneously acting on the same row in both Masters is unsafe." 不仅仅是IODKU。此外,INSERTing
行具有相同的唯一键(特别是如果它们在其他列中具有不同的值)将导致错误。
Galera 通过在 COMMIT
时间检查其他节点来避免这个问题。
NDB Cluster 通过实现 "eventual consistency".
避免了这个问题
现成的Master-Master问题重重;你只确定了其中一个。大多数问题都可以避免,正如 Mike 指出的那样,但只能写给一位 Master。
这是问题所在:
- 2 MySQL 5.5 个服务器
- 基于行的复制 + master master
- 写入在两台服务器上(均处于活动状态)
- autoinc 技巧(一台服务器奇数,另一台服务器偶数)
我有一个table喜欢
byUserDailyStatistics:
- id (PK + AUTO INC)
- 日期
- idUser
- 公制 1
- 公制2
- 唯一(idUser,日期)
所有请求都是
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
对同时写入您的两个副本。
- 一个客户端使用奇数主键写入 master1
- 在第一次写入同步之前,另一个客户端使用偶数主键写入 master2
- 服务器尝试相互同步
在最后一步中,同一对在不同的主键下存在于两个服务器上;不同的行,但辅助唯一键相同。
让我们更笼统地说:"Simultaneously acting on the same row in both Masters is unsafe." 不仅仅是IODKU。此外,INSERTing
行具有相同的唯一键(特别是如果它们在其他列中具有不同的值)将导致错误。
Galera 通过在 COMMIT
时间检查其他节点来避免这个问题。
NDB Cluster 通过实现 "eventual consistency".
避免了这个问题现成的Master-Master问题重重;你只确定了其中一个。大多数问题都可以避免,正如 Mike 指出的那样,但只能写给一位 Master。