多线程复制是MySQL 5.7提供的重要功能,对解决MySQL主从复制延迟有巨大帮助。一次偶然的机会,发现开启多线程复制,且主库有较高的写流量时,此时调整从库的super_read_only=ON,有一定概率导致从库多线程复制死锁。
操作系统:
CentOS 7.3
测试版本:
Community MySQL Server 8.0.16
Percona MySQL Server 5.7.26
配置:
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=16
slave_preserve_commit_order=ON
两张截图,看看复制死锁时的show processlist; 和 show slave status\G
show processlist
show slave status\G从图中可以看到复制线程全部阻塞,状态显示 Waiting for dependent transaction to commit,Waiting for global read lock,设置super_read_only=ON的连接也阻塞。如果没有人为介入处理,死锁会一直持续下去,从库的复制延迟 Seconds_Behind_Master 会一直增大。当手动kill super_read_only=ON的连接,多线程复制恢复。
复现步骤:
搭建MySQL 1主1从,开启多线程复制。在主库使用sysbench写数据。在从库上不断执行set global super_read_only=OFF;set global super_read_only=ON;运行几分钟,从库复制死锁,复制延迟不断增大,第3步设置super_read_only的连接卡住。强杀第3步的连接,从库复制恢复。