当前位置: 首页 > news >正文

MySQL复制问题的分析

s这是学习笔记的第 2031 篇文章


  最近有个业务的MySQL复制问题还是比较多,做了事务降维之后,把一些敏感操作和线上环境隔离起来,整体的效果好了许多,不过今天在外面的时候,又收到一条报警短信,让我心里咯噔一下。 

  这个环境是一个中间件的分布式环境,有8个物理节点(主库),即有6个主库+8个从库,我查看了下邮件,发现报错的这个环境是昨天同事帮忙新建的从库,到今天才这么短的时间,而且是基于GTID复制的模式,又出现了这类问题,我的心里还是比较忐忑的,因为如果我再收到几条其他环境类似的复制错误,那么毫无疑问就属于一起计划外的故障了。

   故障离我们很近,但是在不同的时间有不同的理解。因为这段时间的做了数据迁移的一些高可用测试,压力测试,数据重构,整体该做的工作都做差不多了,到了临门一脚的时候,出现一些频繁的问题,我让我有所措手不及,而问题能够定位可控,很容易理解,可以查漏补缺,而如果问题是集中出现,那就说明之前的工作没有做到位,一旦发现严重的bug导致服务不可用,如果反复出现,不管过程如何,结果就是不合格的。这种感觉就好比是高速公路给汽车换轮胎,时间紧,任务重。

  所幸的是,我等了一会没有再收到其他环境的问题,所以一个基本的定位:不是很严重。 

  等我回到酒店之后,开始处理的时候,脑海里一直在琢磨,到底是一条什么样的SQL语句会导致这样奇怪的问题。

  很快就查到了相关的描述信息:

   LAST_ERROR_MESSAGE: Worker 0 failed executing transaction 'db8f9860-8202-11e9-991e-005056b7f69e:854286845' at master log mysqlbin.000601, end_log_pos 936077509; Could not execute Update_rows event on table dbo_testdb.dbo_testdata; Can't find record in 'dbo_testdata', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysqlbin.000601, end_log_pos 936077509

看起来问题是在binlog日志000601的偏移量936077509附近,看到这个偏移量心里一纠,可以看到文件已经超过900M了,解析起来已经有一些性能问题了。 

查看show slave status的结果:

             Slave_IO_Running: Yes

            Slave_SQL_Running: No

可以看到IO_thread依然可用,说明复制的过程中整体的数据传输是OK的,是在应用的时候出现了问题 。 

我使用如下的语句开始解析这个偏移量附近的一些错误。 

/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysqlbin.000601 | grep -A '10' 936077509

得到了如下的结果:

#190705 19:27:15 server id 211  end_log_pos 936077509 CRC32 0x590574c3  Update_rows: table id 599753 flags: STMT_END_F

### UPDATE `dbo_testdb`.`dbo_testdata`

### WHERE

###   @1=748890203 /* LONGINT meta=0 nullable=0 is_null=0 */

###   @2=60 /* INT meta=0 nullable=0 is_null=0 */

###   @3=13 /* INT meta=0 nullable=0 is_null=0 */

###   @4='2019-07-05 19:27:15' /* DATETIME(0) meta=0 nullable=0 is_null=0 */

###   @5='2019-07-05 19:27:15' /* DATETIME(0) meta=0 nullable=0 is_null=0 */

###   @6=0 /* LONGINT meta=0 nullable=0 is_null=0 */

### SET

###   @1=748890203 /* LONGINT meta=0 nullable=0 is_null=0 */

--

# at 936077509

#190705 19:27:15 server id 211  end_log_pos 936077540 CRC32 0x78404313  Xid = 221915192

COMMIT/*!*/;

# at 936077540

#190705 19:27:15 server id 211  end_log_pos 936077605 CRC32 0x6e307159  GTID    last_committed=1762227  sequence_number=1762248

SET @@SESSION.GTID_NEXT= 'db8f9860-8202-11e9-991e-005056b7f69e:854286846'/*!*/;

# at 936077605

#190705 19:27:15 server id 211  end_log_pos 936077696 CRC32 0x00c8479d  Query   thread_id=854   exec_time=0     error_code=0

SET TIMESTAMP=1562326035/*!*/;

BEGIN

可以看到这是一条update语句,它的格式比较奇怪,如下:

update xxx

where userid=xxxx,value=xxxx

set userid=xxxx

从语句来看明显是不符合业务场景的,自己变更自己,明显不合理的。

我们来进一步验证。

主库端查看数据,把上面的update转义成select语句:

select * from `dbo_testdb`.`dbo_testdata`

WHERE

userid=748890203 and 

xxx=60 and

value=13 and

moddate='2019-07-05 19:27:15' and

crtdate='2019-07-05 19:27:15' and

modver=0 

发现主库端和从库端都不存在这条语句。 

所以这就牵扯出来两个问题:

1)如果MySQL在主库端的SQL语句没有发生数据变更,是否会依然产生binlog

2)一条update语句,在MySQL里的解析应该是类似如下的形式:

update xxxx set xxxxx  where 的形式,在这里明显没有走这种解析的方式。 

3)这条语句如何修复,因为后面的数据都等着这个断点。

4)如果后续还有这种问题,该如何预防。 

我们为了快速修复,经过评估,主从库端都没有相应的数据,说明这条语句是没有产生影响的,我们可以跳过这个事务。 

stop slave;

SET @@SESSION.GTID_NEXT= 'db8f9860-8202-11e9-991e-005056b7f69e:854286846';

begin;commit;

SET SESSION GTID_NEXT = AUTOMATIC;

start slave;

再次尝试这个问题暂时正常了,在反复验证中暂时没有发现问题。 

而后续的进一步验证得找下环境,会后续继续说明。

对于问题本身,也需要和研发团队做一下确认,这种操作的需求需要引导,后续不要再出现。

640?

相关文章:

  • 秦皇岛旅游归来
  • 《MySQL DBA工作笔记》前言
  • MySQL复制的奇怪问题跟进
  • MySQL高可用方案升级规划
  • 选择和努力
  • 无论是否“去O”,这些数据库选型与运维技巧你都该知道
  • MySQL周期表管理的设计
  • 推荐一些近期看过的电影和电视剧
  • 一个数据需求的讨论和分析
  • MySQL机房多活的初步设想
  • 《大江大河》观后感1
  • 基于中间件的负载均衡方案
  • 我的女儿二三事(十三)
  • 最近的一些计划
  • 运维日,说说曾经犯过的错误
  • ES6指北【2】—— 箭头函数
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • android图片蒙层
  • Facebook AccountKit 接入的坑点
  • flask接收请求并推入栈
  • java8 Stream Pipelines 浅析
  • Logstash 参考指南(目录)
  • passportjs 源码分析
  • RxJS: 简单入门
  • vue 个人积累(使用工具,组件)
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 如何使用 JavaScript 解析 URL
  • 我的zsh配置, 2019最新方案
  • 小试R空间处理新库sf
  • 译米田引理
  • 找一份好的前端工作,起点很重要
  • #NOIP 2014# day.2 T2 寻找道路
  • $forceUpdate()函数
  • $NOIp2018$劝退记
  • (27)4.8 习题课
  • (C#)一个最简单的链表类
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (poj1.3.2)1791(构造法模拟)
  • (python)数据结构---字典
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm码农论坛 毕业设计 231126
  • (转) Face-Resources
  • (转)程序员疫苗:代码注入
  • (转)树状数组
  • (转载)Linux网络编程入门
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • *Django中的Ajax 纯js的书写样式1
  • .bat文件调用java类的main方法
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET构架之我见
  • @html.ActionLink的几种参数格式
  • @Responsebody与@RequestBody
  • [1204 寻找子串位置] 解题报告