加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MySQL主从复制大事务卡住分析

(2018-10-26 12:00:15)
分类: MySQL
线上实例从库复制延迟,show slave status发现复制卡在一个位点不会动,如下图:
于是怀疑是主库上有大事务,在从库回放卡住了。之前一直以为,要查看是否卡在大事务上,需要到主库上去查看binlog,但是往往在主库上查看binlog,刷屏很久都看不到具体执行了什么大事务SQL。今天学到一种新方法,直接在从库上查看relay log,看卡在哪个地方(看Relay_Log_File和Relay_Log_Pos):

 show relaylog events in 'relay-bin.267885' from 18842859 limit 10;
可以看出,relay log卡在一个delete的事务,delete的表是:airbus_dw.app_serv_goods_inconfor_30d_d 这张表.
show create table发现这张表并没有主键,并且该实例的日志格式是ROW行模式的!这样带来的后果是在备库执行的delete的SQL执行效率会低,甚至可能是全表扫描,具体是不是全表扫描,需要分析具体的SQL.

那为什么说,如果添加了主键(比如和业务无关的自增ID),在binlog格式为row格式下,会降低主从复制延迟呢?其实道理很简单,row模式下,一个sql,比如:delete from a where stat = 100

如果不添加主键,那么这个SQL在binlog为行格式下,会被拆解为多条delete语句在备库执行,形如:
####DELETE FROM  `***.***`
###WHERE
###@1=***
###@2=***
###@3=***

####DELETE FROM  `***.***`
###WHERE
###@1=***
###@2=***
###@3=***


那如果我添加了主键,比如添加了和业务无关的自增长列id,此时binlog解析的SQL语句就是形如:

####DELETE FROM  `***.***`
###WHERE
###@1=***
###@2=***
###@3=***
###@4=1        

####DELETE FROM  `***.***`
###WHERE
###@1=***
###@2=***
###@3=***
###@4=2

这里多了第四列@4(主键列id),可以看到binlog会根据主键id的值来进行delete,可以提高SQL的执行效率.

解决方案:
1、在表创建的时候,就应该要设计主键;
2、如果延迟已经发生,那么应该要在从库上为这个表添加主键或者索引.






0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有