Mariadb:delete造成的主从延迟

Posted 数据库技术杂谈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mariadb:delete造成的主从延迟相关的知识,希望对你有一定的参考价值。

现象:mysql主从延迟上万秒

分析:

1. 多次执行:show slave status\G;

 

发现一直卡在delete操作。

现在需要知道哪张表的delete操作这么慢。

2. 从库执行:show open tables where in_use>0;

 

Mariadb:delete造成的主从延迟

多次执行,发现这张表一直存在,随怀疑是该表的delete操作引起从库延迟。

现在需要找出这张表在做啥操作。

3. 从库执行:show slave status\G;

 

通过执行的主库日志位置,查找当前从库在执行的sql

4. 主库执行:show binlog events in 'mysql-bin.007232' from 305625037 limit 10;

 

找到导致主从延迟的sql语句后,需要找开发沟通,sql是做什么的,为什么这么大的删除量。

5. 和开发人员沟通结果:

A. 该表是质检表,每20分钟会从其他表中导入近3天的数据进行分析,并更新该表上的时间字段为当前时间;

B. 为避免数据主键冲突,导入前会把之前导入的数据全部delete

整个过程是这样的:删除表中近3天的数据,导入近3天的数据到该表中,并更新时间字段,每20分钟重复一次;

C. 每天最后一次只导入数据进行分析,不对数据进行删除,保留作为历史数据存在;

沟通完YLMB,还有这种操作,每三天的数据有几十万条,还这么任性的循环着玩。数据库压力大的时候延迟根本没法避免。丫丫的,问题总归是问题,还得想办法解决。

6. 解决分析:

A. 每天只会分析近3天的数据,这样可以单独建立一张表专门作为数据分析用,导入数据,分析完,删除数据,这么每20分钟循环一次。这时候的删除就不能用delete了,效率低。可以改为truncate整张表,这样速度会非常快;

B. 建立另一张表存放历史数据,每天最后一次分析完后,把数据导入历史数据表;

C. 完美

D. 解决方案有了后,就是改程序,抽个时间窗口导数据建表了。

 

7. 额外说明:

有些人可能会想到,使用分区表,按天做分区,每次truncate分区。这样做理论上可以,但是,我们出现过问题,在truncate分区的时候,整张表锁了很长时间没法操作。后怕,只能退而求其次。不过这方案也挺perfect的。


以上是关于Mariadb:delete造成的主从延迟的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB主从半同步复制详解

mariadb集群配置(主从和多)

MySQL主从复制延迟解决方案

MySQL主从延迟现象及原理分析详解

MySQL主从复制原理

怎样解决MySQL数据库主从复制延迟的问题?