RDS MySQL unique_checks参数导致复制中断

问题现象

在使用RDS MySQL的过程中,备实例或只读实例出现复制中断,提示如下错误:

[ERROR] [MY-010584] [Repl] Slave SQL for channel '': Worker 1 failed executing transaction 'XXX' at master log mysql-bin.XXX, end_log_pos XXX; Could not execute Write_rows_v1 event on table XXX.XXX; Duplicate entry 'XXX' for key 'xxx.xxx', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.XXX, end_log_pos XXX, Error_code: MY-001062

可能原因

将unique_checks设置为0时,可能造成上述错误。

unique_checks参数的取值含义:

  • 1:RDS MySQL会对InnoDB表中的唯一键进行唯一性检查。

  • 0:如果DML语句操作的数据不在buffer pool中,那么RDS MySQL不会通过读取磁盘上的主键和唯一键来对InnoDB表中的二级索引进行唯一性检查。此时,可以插入重复的唯一键。

当在主实例上,设置unique_checks为0时,如果DML语句操作的数据不在buffer pool中,那么RDS MySQL不会通过读取磁盘上的主键和唯一键来对InnoDB表中的二级索引进行唯一性检查,此时主实例将成功插入重复的唯一键。而在备实例上,设置unique_checks为0时,如果DML语句操作的数据存在于buffer pool中,RDS MySQL将会对DML语句所操作的二级索引进行唯一性检查,此时不允许插入重复的唯一键,从而发生复制中断。详情请参见MySQL官方Bug#106121

解决方案

  • 如果您确定插入的数据不会产生唯一键冲突,那么可以设置unique_checks为0,以加快数据的导入速度。

  • 如果您不确定插入的数据是否会产生唯一键冲突,那么请设置unique_checks为1。