一条更新操作引起的MySQL主从复制异常

作者介绍

康壮,大连楼兰科技股份数据库运维组负责人,主要负责集团内部MySQL、MongoDB、Redis数据库运维管理工作。曾在第三方数据库运维公司任职技术部经理,负责政府行业的Oracle数据库运维工作,具有Oracle OCP、OCM、MySQL OCP等相关认证、对数据库架构设计、故障处理、优化有深入的理解。

 

一、环境描述 
 

生产环境异地机房主从数据库,数据量过百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

 


 

4)异地从库报错

 

Slave 已经无法同步数据。

 

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

 

四、问题处理 
 

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

 

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

 

从节点执行(基于GTID)

 


 

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

 


 

五、解决方案 
 

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

 

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

 

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

 

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

 

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

 


 

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

原文发布时间为:2017-04-10

时间: 2024-05-21 05:08:35

一条更新操作引起的MySQL主从复制异常的相关文章

Mysql主从复制(master-slave)实际操作案例_Mysql

在这一章节里, 我们来了解下如何在 Mysql 中进行用户授权及主从复制   这里先来了解下 Mysql 主从复制的优点:   1. 如果主服务器出现问题, 可以快速切换到从服务器提供的服务 2. 可以在从服务器上执行查询操作, 降低主服务器的访问压力 3. 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务 注意一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得   在这里我们首先得完成用户授权, 目的是为了给从服务器有

MySql删除和更新操作对性能有影响吗_MsSql

删除和更新操作的开销往往比插入高,所以一个好的设计需要减少对数据库的更新和删除操作. 3.1更新操作 数据库的更新操作会带来一连串的"效应":更新操作需要记录日志(以便错误时回滚):更新可变长字段(如,varchar类型)会带来数据物理存储的变化(记录的移动):更新索引字段会导致索引重建:更新主键会导致数据重组等.这一切不但会造成更新操作本身效率低,而且由于磁片碎片的产生会造成以后查询性能的降低.为了应对这一情况,有两种策略:一.减少更新次数,把多个字段的更新写到同一个语句里:二.避免

MySQL中实现插入或更新操作(类似Oracle的merge语句)_Mysql

如果需要在MySQL中实现记录不存在则insert,不存在则update操作.可以使用以下语句: 更新一个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA) 更新多个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KE

MySQL表更新操作

1.  使用insert语句向表插入一条新记录,语法是:insert into 表名 [(字段列表)] values(值列表). 2.  使用set 语句更新操作与字符集,例如set character_set_client =latin1\gbk\utf8; 3.  使用delete语句删除表记录,例如 delete from 表名 where 条件表达式: 4.  使用insert语句可以一次性地向表中批量插入多条记录,语句是:insert  into 表名 [(字段名)]values (值

MySql删除和更新操作对性能有影响吗

删除和更新操作的开销往往比插入高,所以一个好的设计需要减少对数据库的更新和删除操作. 3.1更新操作 数据库的更新操作会带来一连串的"效应":更新操作需要记录日志(以便错误时回滚):更新可变长字段(如,varchar类型)会带来数据物理存储的变化(记录的移动):更新索引字段会导致索引重建:更新主键会导致数据重组等.这一切不但会造成更新操作本身效率低,而且由于磁片碎片的产生会造成以后查询性能的降低.为了应对这一情况,有两种策略:一.减少更新次数,把多个字段的更新写到同一个语句里:二.避免

MySQL主从复制的延迟监测

主从复制延迟的监测,我以前的做法是通过比较show slave status\G中的两个变量的差值(Read_Master_Log_Pos,Exec_Master_Log_Pos),将差值设置为一个自己认为合理的范围,Seconds_Behind_Master 没有适用过,今天做一次解析: Seconds_Behind_Master 是通过比较 SQL THREAD 接受 events事件的时间戳(timestamp) 与IO THREAD  执行事件 events时间戳的差值--秒数来确定sl

高可用架构-- MySQL主从复制的配置

环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168.1.205     主机名:edu-mysql-01 从节点IP:192.168.1.206     主机名:edu-mysql-02 主机配置:4核CPU.4G内存   依赖课程 <高可用架构篇--第13节--MySQL源码编译安装(CentOS-6.6+MySQL-5.6)>   MySQL主从复制官方文档 http://dev.

MySQL主从复制中常见的3个错误及填坑方案

一.问题描述    主从复制错误一直是MySQL DBA一直填不完的坑,如鲠在喉,也有人说mysql主从复制不稳定云云,其实MySQL复制比我们想象中要坚强得多,而绝大部分DBA却认为只要跳过错误继续复制就好啦,接下来不发生错误就好了,其实跳过错误就会有数据不一致的风险,数据不一致可能还会越来越严重,而我就复制错误中反复出现的1045.1032和1062错误引起的数据库主从不一致的的现象进行深入分析及给出一套完善的解决方案.   (1) [ERROR]1452:无法在外键的表插入参考主键没有的数

关于mysql主从复制的概述与分类(转)

一.概述: 按照MySQL的同步复制特点,大体上可以分为三种类别: 1.异步复制: 2.半同步复制: 3.完全同步的复制: -------------------------------------------------------------------------------------------------- (一).异步复制: 1.概念 mysql的异步复制在业界中的叫法有很多,比如:AB复制.主从同步.mysql replication等等.说白了就是master和slave结构.