mysql 表无主键全表delete,slave延迟是否一定要重建?

今天监控告警某个slave延迟越来越大,且一直在增长,如果开了参数binlog_rows_query_log_events ,在binlog里就会保存原始的DML SQL,这样我们可以在slave上执行show processlist查看当前正在执行的事务SQL
在这里插入图片描述
发现是全表delete, show create table 查看表结构,发现没有主键,且没有索引,而且没有合适的字段来创建唯一索引
在这里插入图片描述
查看slave状态,此时的Seconds_Behind_Master值很大,并且在不断增加
在这里插入图片描述
以前,我们就经常是让开发在主库添加完成主键,如果是大表删除,从库就只能重建,现在发现有一个参数到了8.0时,默认值和5.7的变了,slave_rows_search_algorithms,在5.7时默认是TABLE_SCAN,INDEX_SCAN,在8.0后默认值是INDEX_SCAN,HASH_SCAN,在查阅了官网后了解到,这个是slave应用日志时查找数据所采取的算法。下表是参数组合时slave根据表的情况采取的数据查找算法
在这里插入图片描述
通过了解,我们发现其实table_scan这个算法可有可无,只需要index_scan,hash_scan就可以了。我们这个例子刚好符合hash全表扫描,表上没有索引,也没有主键,只需要扫描一次全表就可以完成slave应用
在这里插入图片描述
故我们修改一下这个参数,观察一下效果
在这里插入图片描述
等待了十分钟左右,期间我们观察时间不断增大,然后突然降为0,show processlist这个delete也执行完成了。真好,这个实例不用重建slave了。(PS:暂时没搞明白官方为什么5.7不用这两个算法),再补充一下,如果表上没有唯一字段,如果有一些相对重复值没那么高的字段,可以在从库上添加一个二级索引,并且设置slave_rows_search_algorithms为HASH_SCAN,INDEX_SCAN,此时会使用hash index scan,mysql会在创建hash结构时还会创建一个索引的set,可以加快扫描速度,如果重复值很高的字段就不建议了。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值