【发布时间】:2018-10-12 07:24:10
【问题描述】:
问题在于标准 Mysql Master-Slave 设置(从属只读,二进制日志记录设置为 ROW),当在主表中插入一行时,主表具有自动递增主键,并且这一行,例如,得到ID 4288996,当在从站复制相同的插入时,同一行得到不同的ID 例如4289032(因为insert没有主键值,是自动生成的)。
现在在Master的这一行发出UPDATE语句时问题就出现了:
#180430 18:00:12 server id 1 end_log_pos 429933 CRC32 0xd0d85778
Update_rows: table id 260 flags: STMT_END_F
### UPDATE `cmon`.`simple_alarm`
### WHERE
### @1=4288996
### SET
### @13=1525104012
### @15=1
# at 429933
#180430 18:00:12 server id 1 end_log_pos 429964 CRC32 0xdc9f3fa4 Xid = 452035
因为Slave上不存在同一行(ID不同):
'无法在表 cmon.simple_alarm 上执行 Update_rows 事件;在“simple_alarm”中找不到记录,错误代码:1032;处理程序错误 HA_ERR_KEY_NOT_FOUND;事件的主日志 xxxxx_bin_log.000003, end_log_pos 429933'
我知道为什么会出现这个问题,但我不知道如何解决?
【问题讨论】:
-
主从具有不同的 auto_incremented P.K 本身是另一个问题。我认为您应该在调试此问题之前完全同步两个表,包括 P.K 字段及其 auto_increment 值。但是下面的答案可能会解决我强烈建议您创建与相同复制设置完全相同的新从属设备并尝试您的更新语句,看看它是否是泄漏的异步问题。
-
我刚刚发现每个从站单独决定是否调用更改。如果从属设备中已经存在新的 id,则无法调用更改
标签: mysql master-slave