mysql 主从delete 引起的卡住和延迟的问题

mysql 主从delete 引起的卡住和延迟的问题

一、环境描述

生产环境异地机房主从数据库,数据量过百G,数据库版本社区版本5.6.25。

二、问题描述

同事根据开发提供的SQL在Master节点执行了一个大表的的全表更新操作,导致从节点Slave IO线程中断。

三、问题分析

1)相关参数

my.cnf中有两个参数设置:

expire_logs_days = 7 #binlog保留时间7天

max_binlog_size = 1G #binlog大小

2)表大小,执行SQL

Table: v_clda 5.8G

Sql: update v_clda set uploadtime =now(); 主库执行成功

3)主库,大事物产生的binlog

-rw-rw---- 1 mysql mysql 1.1G Mar 16 02:49 mysql-bin.000159

-rw-rw---- 1 mysql mysql 8.0G Mar 16 15:28 mysql-bin.000160

-rw-rw---- 1 mysql mysql 7.4G Mar 16 18:13 mysql-bin.000161

-rw-rw---- 1 mysql mysql 1.1G Mar 16 23:55 mysql-bin.000162

-rw-rw---- 1 mysql mysql 1.1G Mar 17 12:15 mysql-bin.000163

-rw-rw---- 1 mysql mysql 1.1G Mar 18 16:54 mysql-bin.000164

4)异地从库报错

[ERROR] Slave I/O: Unexpected master's heartbeat data: heartbeat is not compatible with local info;the event's data:og_file_name mysql-bin.000160<90>Ó°Y log_pos 121238917, Error_code: 1623

[ERROR] Slave I/O: Relay log write failure: could not queue event from master, Error_code: 1595

[Note] Slave I/O thread exiting, read up to log 'mysql-bin.000160', position 3626103968

[Note] Error reading relay log event: slave SQL thread was killed

Slave 已经无法同步数据。

一个事物只能写入一个binlog日志中,默认情况下,binlog日志达到设定值后(max_binlog_size),会自动生成一个新的日志文件,也会根据过期参数(expire_logs_days)设置自动删除binlog日志。如果生成了一个超大的binlog日志,很可能是由于大事物引起的。

四、问题处理

尝试从启slave线程,多次尝试后失败。

尝试跳过事物,具体方法如下:

从节点执行(基于GTID)

stop slave;

SET @@SESSION.GTID_NEXT= '498815d6-20a9-11e6-a7d6-fa163e5770cc:53'; --根据实际情况

BEGIN; COMMIT;

SET SESSION GTID_NEXT = AUTOMATIC;

START SLAVE;

show slave statusG; 主从复制恢复正常

从节点执行更新操作,同步数据

set session sql_log_bin=0;

update v_clda set uploadtime =now();

五、解决方案

在执行大事物前关闭 set session sql_log_bin=0; (默认是开启的),尤其是异地机房,网络带宽有限,而且VPN通道不是十分稳定的情况下。不允许它生成大量binlog日志。

如果像本例中,已经执行了,而且生成了大量的binlog,最终导致复制异常,可以考虑使用跳过事物的方法来解决这个问题。

最笨的方法就是重新搭建主从,由于数据量比较大,还是异地不可取。

根本解决方法还是要拆分大事物,进行批量提交操作。贺春旸老师的MySQL管理之道一书中第四章4.4节有具体的解决方法。

参考改为用存储过程,每删除10000条事务就提交一次,循环操作直至删除完毕。经过优化,行锁的范围变小了,性能也就变好了。相关代码如下:

DELIMITER $$

USE BIGDB$$

DROP PROCEDURE IF EXISTS BIG_table_delete_10k$$

CREATE PROCEDURE BIG_table_delete_10k(IN v_UserId INT)

BEGIN

del_10k:LOOP

delete from BIGDB.BIGTABLE where UserId = v_UserId limit 10000;

select row_count() into @count;

IF @count = 0 THEN

select CONCAT('BIGDB.BIGTABLE UserId = ',v_UserId,' is ',@count,' rows.') as BIGTABLE_delete_finish;

LEAVE del_10k;

END IF;

select sleep(1);

END LOOP del_10k;

END$$

DELIMITER ;

存储过程上线后,观察一段时间,同步复制时,Slave复制正常,问题解决。

更多尼泊尔内容

幽闭恐惧症:原因、症状和治疗
365提款验证

幽闭恐惧症:原因、症状和治疗

🗓️ 08-29 👁️ 9155
带泪的网名 关于泪的网名大全(精选100个)
mobile28365-365

带泪的网名 关于泪的网名大全(精选100个)

🗓️ 07-08 👁️ 7278
纹绣营销:如何宣传、包装、推广?
365提款验证

纹绣营销:如何宣传、包装、推广?

🗓️ 10-06 👁️ 1975
正在阅读:差异性不大?WP8旗舰之HTC 8X体验评测差异性不大?WP8旗舰之HTC 8X体验评测
庄子是哪个派的代表人物
mobile28365-365

庄子是哪个派的代表人物

🗓️ 08-05 👁️ 3965
微信群营销:从建立到活跃的完整指南
365bet娱乐在线

微信群营销:从建立到活跃的完整指南

🗓️ 10-04 👁️ 2034
议价的意思
365提款验证

议价的意思

🗓️ 09-28 👁️ 2288
ol是什么(OfficeLady(简称OL))
365bet娱乐在线

ol是什么(OfficeLady(简称OL))

🗓️ 07-24 👁️ 6515
电子相册软件有哪些好用 常用的电子相册软件排行
mobile28365-365

电子相册软件有哪些好用 常用的电子相册软件排行

🗓️ 07-21 👁️ 7504