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

MySQL复制的奇怪问题跟进

这是学习笔记的第 2034 篇文章


  在前几天碰到了一个奇怪的复制问题,也做了简单的跟踪。

没想到今天在做压力测试的时候,又碰到了类似的问题,这个问题的紧要程度要排上了日程。 

从binlog日志的解析结果来看,是这样的语句:

#190709 17:18:04 server id 182  end_log_pos 398120311 CRC32 0x89d5a523  Update_rows: table id 5252840 flags: STMT_END_F

### UPDATE `tbo_db`.`tda_data_20190709`

### WHERE

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

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

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

###   @4='2019-07-09 17:18:04' /* DATETIME(0) meta=0 nullable=0 is_null=0 */

###   @5='2019-07-09 17:18:04' /* DATETIME(0) meta=0 nullable=0 is_null=0 */

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

### SET

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

--

 这个语句乍一看有些不合逻辑,所以按照输出的错误和问题发生的场景。如下的错误似乎也有一定的道理。  

Could not execute Update_rows event on table tbo_db.tda_data_20190709; Can't find record in 'tda_data_20190709',

修复的过程是常规的思路,从主库的binlog中解析得到相关的偏移量位置附近的语句,然后评估是否可以跳过,如果跳过则需要指向下一个GTID事务。 

我上次抛出了几个问题,我们来逐个做下验证:

如果使用类似的语句,在MySQL主库端会直接抛错。

>>update test where id=100 and name='aa' set id=100;  

ERROR 1064 (42000):

而如果改为update,set,where的句式,语句可以成功,尽管变更无法匹配到相关数据,但是会生成相关的binlog,从库的复制是正常的.

>>update test set id=100 , name='aa' where id=100;        

Query OK, 0 rows affected (0.00 sec)

我们再来看一个案例,首先我们看下数据情况:

select * from test;

+----+------+-------+

| id | name | memo1 |

+----+------+-------+

|  1 | aa   | NULL  |

|  2 | bb   | NULL  |

+----+------+-------+

2 rows in set (0.00 sec)

建表语句为:

CREATE TABLE `test` (

  `id` int(11) NOT NULL,

  `name` varchar(30) DEFAULT NULL,

  `memo1` varchar(30) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `idx_name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

我们接着使用正常的update做下变更。

>>update test set id=1  where id=1 and  name='aaa';

Query OK, 0 rows affected (0.00 sec)

这种情况下的变更结果显示为0,但是依然是正常执行的。

而查看binlog的状态,会发现生成的update语句也是正常的没有做任何的改变。

#190709 23:37:57 server id 213  end_log_pos 149605040 CRC32 0xc6a341aa  Query   thread_id=288594        exec_time=0     error_code=0

SET TIMESTAMP=1562686677/*!*/;

update test set id=1  where id=1 and  name='aaa'

/*!*/;

# at 149605040

#190709 23:37:57 server id 213  end_log_pos 149605120 CRC32 0x22ffd3a3  Query   thread_id=288594        exec_time=0     error_code=0

SET TIMESTAMP=1562686677/*!*/;

到了这里,我们基本有一个整体的印象了。我们再来回顾下那个update语句,会发现似乎where和set子句的顺序写反了。

应该是update set xxxxx where xxxx

而顺着这个思路往下思考,似乎这个问题也就解释的通了。 

对于我来说,对于这个问题的修复也是需要多方确认,首先需要排除应用端的一些高并发处理的异常情况。 

同时在MySQL中查看是否存在一些相关的复制bug,这个问题还会持续跟进。

640?

相关文章:

  • MySQL高可用方案升级规划
  • 选择和努力
  • 无论是否“去O”,这些数据库选型与运维技巧你都该知道
  • MySQL周期表管理的设计
  • 推荐一些近期看过的电影和电视剧
  • 一个数据需求的讨论和分析
  • MySQL机房多活的初步设想
  • 《大江大河》观后感1
  • 基于中间件的负载均衡方案
  • 我的女儿二三事(十三)
  • 最近的一些计划
  • 运维日,说说曾经犯过的错误
  • MySQL毫秒必争的优化场景
  • ClickHouse初识
  • 短期内不太看好智能运维
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【css3】浏览器内核及其兼容性
  • 【node学习】协程
  • 【知识碎片】第三方登录弹窗效果
  • 2017 年终总结 —— 在路上
  • android 一些 utils
  • Codepen 每日精选(2018-3-25)
  • ES学习笔记(12)--Symbol
  • exports和module.exports
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Octave 入门
  • php的插入排序,通过双层for循环
  • tab.js分享及浏览器兼容性问题汇总
  • Vue 2.3、2.4 知识点小结
  • 关于Java中分层中遇到的一些问题
  • 驱动程序原理
  • 说说动画卡顿的解决方案
  • 思维导图—你不知道的JavaScript中卷
  • 微信小程序实战练习(仿五洲到家微信版)
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)hibernate配置管理
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (蓝桥杯每日一题)love
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net MySql
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net 高效开发之不可错过的实用工具
  • .NET 命令行参数包含应用程序路径吗?