MySQL复制参数_slave_rows_search_algorithms及无主键表的处理

0.起因

线上MySQL实例,今天报大量延时,且卡住不动。(表现为seconds_behind_master不断上涨,从库gtid不动)

seconds_behind_master不断上涨

同时二级从库有复制SQL进程报错

[ERROR] [MY-010584] [Repl] Slave SQL for channel '': Could not execute Update_rows event on table 「表名」; Can't find record in '「表名」', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.000****, end_log_pos *******, Error_code: MY-001032

1.排查问题

排查问题时

set global slave_parallel_type=‘logical_clock’; set global slave_parallel_workers=4; start slave sql_thread;```

2.定位问题

通过上面的问题排查,已定位到无主键表的update 引起的复制同步报警。

3.slave_rows_search_algorithms参数

针对无主键表的复制MySQL5.6以后有个参数来调整从库定位数据的方法:slave_rows_search_algorithms

参考官方文档,

4.解决问题

针对我们的问题,做了以下处理。

alter table 表名 add index idx_表名_tmp(字段); set sql_log_bin=1;```

5.补充

继续跟踪这个问题,发现这个实例是从oracle上迁到MySQL上的,所以不止这一个表没有主键。只是其他的表这次没有大量的update所以没有暴发,一起补了索引。

所以

  1. MySQL的表一定要有主键的,这个规范不能放松(哪怕是异构迁移过来的实例)
  2. 已存在的无主键表,如果造成了复制卡住,可以临时加上普通索引(不用经过业务同意,dba自行选一个列做索引,先恢复故障)
  3. slave_rows_search_algorithms参数,可以加快无主键表的复制速度,但是不是万能的,需要慎用。
>> Home

51ak

2022/07/04

Categories: mysql mysql复制 故障处理 Tags: 原创

《数据库工作笔记》公众号
扫描上面的二维码,关注我的《数据库工作笔记》公众号