MySQL的binlog相信大家都有所耳闻,但是可能没有真正日常使用过。

因此,本文结合一个otter小坑的排查案例,来分享下binlog的日常使用方式。

重点了解下:binlog的导出方式

binlog的解析方式

结合案例分享下开源项目otter的一个小坑

1.案例背景

某个周末突然收到报警,发现线上多云数据库的数据同步任务挂起,显示日志写入数据失败。

错误原因非常明显:

唯一索引冲突。

查看了一下源库的数据内容,确实已经update完毕。而目标库的数据内容,确实存在冲突导致无法update。

2.排查过程

这个数据同步任务,使用了阿里开源的数据库同步项目otter。难道遇到了什么bug?otter项目是阿里巴巴开源的数据库同步系统。

基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库的一个分布式数据库同步系统。

直接开始排查问题。

2.1 表结构是否一致

为什么源库没有冲突,目标库会有冲突呢?

是不是表结构不一致?

或者是源库发生了表结构变更没有同步到目标库?

确认了下源库的表结构和目标库表结构是一致的,且都有对应的唯一索引udx_position。

2.2 排查源库binlog

那源库到底是怎么更新成功的?只能捞一下binlog了。

首先导出线上正在使用的binlog文件。

在数据库上执行

flush logs这个命令会关闭当前正在写入的binlog文件,然后生成一个序号加1的新的binlog文件让mysql server继续使用。

等待几分钟,让当前的binlog落盘为日志文件,本案例中为xxxx_binlog_mysqlbin.000005。

然后下载到本地。

通过mysqlbinlog命令解析,输出为指定文件xxx.binlog,如下:

mysqlbinlog --start-datetime='2020-11-20 18:17:00' --stop-datetime='2020-11-20 18:21:01' --base64-output=decode-rows -v -d db xxxx_binlog_mysqlbin.000005 > xxx.binlogbinlog格式binlog_format采用row模式。仅保存记录被修改细节,不记录sql语句上下文相关信息优点:能非常清晰的记录下每行数据的修改细节,不需要记录上下文相关信息,因此不会发生某些特定情况下的procedure、function、及trigger的调用触发无法被正确复制的问题,任何情况都可以被复制,且能加快从库重放日志的效率,保证从库数据的一致性。

通过 --start-datatime和--stop-datetime指定解析的起止时间

row模式生成的sql编码需要解码,不能用常规的办法去生成,需要加上相应的参数(--base64-output=decode-rows -v)才能显示出sql语句

binlog的内容解析后sql的过程如下(为了更好地看清过程,这里不展示binlog原文,而是一个逻辑过程):

我们能清楚地看到,源库通过一个事务中,交换position(唯一索引的列)的值,达到更新唯一索引而不造成冲突的目的。

那目标库为什么会冲突呢?

2.3 查看目标库的sql审计

由于数据同步失败挂起,所以目标库的同步数据暂时不会写入对应的binlog记录。

因此,我们需要通过sql审计来查看目标库的写入情况。

这里同样展示sql审计中捞出的相关过程:

Oh~ My~ God!

事务中间的update交换过程居然被合并了!!

所以造成了唯一索引冲突,更新失败。

3.求证

重新去翻了一遍otter的wiki,看到了关于《otter数据入库算法》说明。

确实存在操作合并的情况。

这样做许多好处:insert/行记录update 执行merge sql,解决重复数据执行

合并算法执行后,单pk主键只有一条记录,减少并行load算法的复杂性(比如batch合并,并行/串行等处理)

同步速度相比于mysql的复制,抛弃了强一致性,约有5倍左右的性能提升

找了下源码,定位到DbLoadAction类

令人遗憾的是,我们发现竟然没有开关可以控制。

4.解决方案。

到上面基本已经水落石出,找到了问题的根本原因。由于otter对事务内的update操作进行了合并,导致了目标库唯一索引冲突。

那怎么解决呢?

看到文档上有这么一句话

那么,对应到这个案例,或者说其他唯一索引的变更,只能通过 先删除,再插入,而不是通过update进行交换。

所以,如何使用binlog来排查问题,你学废了吗? :)

都看到最后了,原创不易,点个关注,点个赞吧~

知识碎片重新梳理,构建Java知识图谱:github.com/saigu/JavaK…(历史文章查阅非常方便)

阿里开源mysql日志_使用过mysql的binlog吗?看看如何用binlog排查阿里开源项目otter的问题...相关推荐

  1. 解读mysql日志_全方位解读 MySQL 日志实现内幕(四)

    作者介绍 王竹峰,去哪儿网数据库专家,擅长数据库开发.数据库管理及维护,一直致力于 MySQL 数据库源码的研究与探索,对数据库原理及实现具有深刻的理解.曾就职于达梦数据库,多年从事数据库内核开发的工 ...

  2. java 读取mysql日志_如何在MySQL中查看日志文件?

    我已经读过Mysql服务器创建了一个日志文件,它记录了所有活动 - 比如何时执行查询和执行什么查询 . 谁能告诉我我的系统中存在哪些内容?我怎么读呢? 基本上,我需要使用不同的输入备份数据库[两个日期 ...

  3. docker mysql 日志_在docker mysql容器中启用日志记录

    连接到容器并创建3个文件后,将它们切换到mysql并重新启动容器,日志记录按预期工作. 指向主机卷权限问题.当你从一个容器映射到主机时,没有用户标识映射,附加到容器内的uid的名字可能与外部有很大不同 ...

  4. 删除部分mysql日志_正确删除MYSQl日志方法

    1.查找当 mysql> show binary logs; +------+---–+ | Log_name | File_size | +------+---–+ | mysql-bin.0 ...

  5. mysqlbinlog查看日志_一个分布式 MySQL Binlog 存储系统的架构设计

    1. kingbus简介 1.1 kingbus是什么? kingbus是一个基于raft强一致协议实现的分布式MySQL binlog 存储系统.它能够充当一个MySQL Slave从真正的Mast ...

  6. 宝塔清mysql主从日志_宝塔面板Mysql主从日志文件mysql-bin文件清除方法

    今天遇到这个问题,转载一篇不错的文章! 今天发现有台服务器的硬盘满了,这个服务器只放置了一个在线客服软件和10几个MySQL数据库加起来也就几百M的占用,后来查了一遍发现原来是MySQL日志的锅. 发 ...

  7. sql入侵 mysql日志_服务器入侵日志分析(一)——mysql日志位置确定

    安全应急响应工作中,一项重要任务就是要对mysql数据库的日志进行分析.我们通过对mysql日志记录的审计,发现攻击行为,进而追溯攻击源.在工作中遇见的各种服务器上,由于mysql安装方式不同,其日志 ...

  8. docker mysql日志_面试官问:了解Mysql主从复制原理么?我呵呵一笑

    搭建Mysql主从同步之前,我们先来说他们之间同步的过程与原理: 同步复制过程 献上一张图,这张图诠释了整个同步过程 主从复制过程: slave节点与主节点进行连接,建立主从关系,并把从哪开始同步,及 ...

  9. 定义mysql日志_请教:如何查看mysql数据定义操作的日志

    展开全部 一.错误日志 错误日志在e69da5e887aa3231313335323631343130323136353331333363366164Mysql数据库中很重要,它记录着mysqld启动 ...

最新文章

  1. 初识LVS(二)——LVS的DR工作模式
  2. mysql报错2_MySQL基于报错注入2
  3. 记一次MBR锁机病毒分析
  4. hibernate.validator验证参数
  5. linux下如何在线添加和移除scsi磁盘?
  6. easyui 1.4.3 窗口创建或拖动超过父元素 边界 BUG 解决方法
  7. SeDebugPrivilege
  8. Ubuntu18.04 下安装TIM
  9. Android 高仿QQ空间广告位 ——— 一个位置来回切换两张广告图
  10. 代码女神利用Python网络爬虫爬取淘宝评论区数据(用小本本记下来)
  11. 国内云市场,腾讯云、阿里云、华为云,谁能更胜一筹呢?
  12. python 转换数字为中文的大写
  13. 输出教师信息c语言作业,C语言教师管理系统代码(最新整理)
  14. Canva在线免费图表制作工具
  15. 从达沃斯世界经济论坛,看区块链和数字货币的三大发展趋势
  16. oracle 触发器管理(以及行级触发器中有两个伪变量 :new 与 :old 的使用方法)(三个谓词inserting、deleting、updating的使用方法)
  17. 运算放大器基础知识:什么是运算放大器?
  18. 自然语言处理之-----Word2Vec
  19. flutter创建/导入区块链钱包,获取余额
  20. 如何针对商品抢购活动展示效果做功能测试?

热门文章

  1. Yaml spring boot 二维数组写法
  2. WCF编程系列(六)以编程方式配置终结点
  3. [转] Java内部类详解
  4. centos 5.x 大硬盘管理
  5. python3+xlrd解析Excel
  6. 接口jdk1.8与jdk1.9新特性
  7. 基于docker的spark-hadoop分布式集群之二: 环境测试
  8. asp数据分页显示技术(上下页版)
  9. C 语言实例 - 计算 int, float, double 和 char 字节大小
  10. 【52.55%】【BZOJ 4520】K远点对