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;

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

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

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

mysql decode语句_MySQL复制问题的分析相关推荐

  1. mysql decode语句_mysql数据灾难恢复方案

    数据库备份:将数据库中存在的现有数据,进行存放成为副本数据,可以解决数据容灾,提高系统的高可用性和灾难恢复性,数据崩溃时,以最小代价重新恢复数据.数据备份的分类: 物理备份:指对数据库操作系统的物理文 ...

  2. mysql 基于语句的复制_MySQL 复制 - 性能与扩展性的基石 1:概述及其原理

    1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他服务器保持同步.接下来,我们将从复制概述及原理.复制的配置.常 ...

  3. mysql 关闭in自动排序,mysql排序语句_mysql中的in排序 mysql按in中顺序来排序

    摘要 腾兴网为您分享:mysql中的in排序 mysql按in中顺序来排序,易订货,虚拟按键,享家,顺丰小哥等软件知识,以及方正证券小方,音基100,dwg转dwf,酷狗游戏盒,聊天宝客服聊天,kin ...

  4. mysql 查询语句_MySQL相关(一)- 一条查询语句是如何执行的

    前言 学习一个新知识最好的方式就是上官网,所以我先把官网贴出来 MySQL官网 (点击查阅),如果大家有想了解我没有说到的东西可以直接上官网看哈~目前 MySQL 最新大版本为8.0,但是鉴于目前应用 ...

  5. mysql set语句_MySQL Prepared语句简介

    之前的MySQL版本4.1,查询以文本格式发送到MySQL服务器. 之后,MySQL服务器使用文本协议将数据返回给客户端.MySQL必须完全解析查询,并将结果集转换为字符串,然后再将其返回给客户端. ...

  6. java mysql查询语句_Mysql查询语句执行过程

    Mysql查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注的是, ...

  7. 分析mysql日志文件_MySQL日志文件与分析

    1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记 ...

  8. mysql delete语句_MySQL ------ 触发器(TRIGGER)(二十七)

    MySQL 语句在需要时被执行,存储过程也是,但是你要是想要某条(或某些语句)在事件发生时自动执行,该怎么办触发器由此而来 触发器:某个表发生更改时自动处理.触发器是MySQL响应delete,ins ...

  9. mysql heartbeat 慢_Mysql 慢日志优化分析方法

    mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动的时候加入一些参数. 如果在my.cnf里面修改,需增加 ...

最新文章

  1. 如何让黑白图片恢复“生机”
  2. 在代码中设置RelativeLayout布局中标签的android:layout_toLeftOf、android:layout_toRightOf等属性...
  3. 清华团队率先抵达摩尔定律最后节点,0.34nm栅长晶体管研究登Nature,打破斯坦福纪录...
  4. PYTHON自动化Day3-列表/元组/切片/字典/字符串处理方法
  5. 17家中国域名解析商(国际域名)解析量报告(6月15日)
  6. Tomcat : IOException while loading persisted sessions: java.io.EOFException
  7. #6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)
  8. 使用 Visual Studio 编译 wget 为库文件
  9. 纠偏的意思_承压能力和纠偏能力,决定成长的高度
  10. vue2.0中vue-router使用总结
  11. SREng 使用指南(一)SREng简介
  12. 上市公司信用评级模型(因子分析法)
  13. java每五分钟执行_java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...
  14. 基于SpringBoot+Vue手表电商销售系统的设计与实现
  15. linux下挂载移动硬盘(ntfs格式),Linux下挂载移动硬盘(NTFS格式)
  16. JAVA网络协同办公自动化
  17. 金力股份冲刺科创板:拟募资13亿 比亚迪小米复星是股东
  18. Elasticsearch 新增字段
  19. Recyclerview的简介与使用
  20. 渗透测试工程师都需要什么工具呢?网络安全(一)

热门文章

  1. 云服务器虚拟主机区别,云服务器和虚拟主机的区别
  2. Java 练习:编写 Java 程序,输入年份和月份,使用 switch 结构计算对应月份的天数。月份为 1、3、5、7、8、10、12 时,天数为 31 天。月份为 4、6、9、11 时,天数为 3
  3. 熊猫的python小课账号_学习python中的pandas有没有好的教程推荐?
  4. oracle 实例死掉,Oracle 监听莫名死掉
  5. php 类分开写,自己前几天写的无限分类类_PHP教程
  6. mysql 工具 08s01_Mysql管理必备工具Maatkit详解之十四(mk-kill)
  7. linuxpython升级3.5_linux升级python3.5到3.6
  8. mqtt 发送消息过多_阿里云MQTT服务端注解式消息处理分发与同步调用实践小结
  9. Python二级笔记(6)
  10. html 复选框name值,HTML(5)表单元素以及对各个表单元素的name、value属性的理解