阿里开源mysql日志_使用过mysql的binlog吗?看看如何用binlog排查阿里开源项目otter的问题...
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的问题...相关推荐
- 解读mysql日志_全方位解读 MySQL 日志实现内幕(四)
作者介绍 王竹峰,去哪儿网数据库专家,擅长数据库开发.数据库管理及维护,一直致力于 MySQL 数据库源码的研究与探索,对数据库原理及实现具有深刻的理解.曾就职于达梦数据库,多年从事数据库内核开发的工 ...
- java 读取mysql日志_如何在MySQL中查看日志文件?
我已经读过Mysql服务器创建了一个日志文件,它记录了所有活动 - 比如何时执行查询和执行什么查询 . 谁能告诉我我的系统中存在哪些内容?我怎么读呢? 基本上,我需要使用不同的输入备份数据库[两个日期 ...
- docker mysql 日志_在docker mysql容器中启用日志记录
连接到容器并创建3个文件后,将它们切换到mysql并重新启动容器,日志记录按预期工作. 指向主机卷权限问题.当你从一个容器映射到主机时,没有用户标识映射,附加到容器内的uid的名字可能与外部有很大不同 ...
- 删除部分mysql日志_正确删除MYSQl日志方法
1.查找当 mysql> show binary logs; +------+---–+ | Log_name | File_size | +------+---–+ | mysql-bin.0 ...
- mysqlbinlog查看日志_一个分布式 MySQL Binlog 存储系统的架构设计
1. kingbus简介 1.1 kingbus是什么? kingbus是一个基于raft强一致协议实现的分布式MySQL binlog 存储系统.它能够充当一个MySQL Slave从真正的Mast ...
- 宝塔清mysql主从日志_宝塔面板Mysql主从日志文件mysql-bin文件清除方法
今天遇到这个问题,转载一篇不错的文章! 今天发现有台服务器的硬盘满了,这个服务器只放置了一个在线客服软件和10几个MySQL数据库加起来也就几百M的占用,后来查了一遍发现原来是MySQL日志的锅. 发 ...
- sql入侵 mysql日志_服务器入侵日志分析(一)——mysql日志位置确定
安全应急响应工作中,一项重要任务就是要对mysql数据库的日志进行分析.我们通过对mysql日志记录的审计,发现攻击行为,进而追溯攻击源.在工作中遇见的各种服务器上,由于mysql安装方式不同,其日志 ...
- docker mysql日志_面试官问:了解Mysql主从复制原理么?我呵呵一笑
搭建Mysql主从同步之前,我们先来说他们之间同步的过程与原理: 同步复制过程 献上一张图,这张图诠释了整个同步过程 主从复制过程: slave节点与主节点进行连接,建立主从关系,并把从哪开始同步,及 ...
- 定义mysql日志_请教:如何查看mysql数据定义操作的日志
展开全部 一.错误日志 错误日志在e69da5e887aa3231313335323631343130323136353331333363366164Mysql数据库中很重要,它记录着mysqld启动 ...
最新文章
- 初识LVS(二)——LVS的DR工作模式
- mysql报错2_MySQL基于报错注入2
- 记一次MBR锁机病毒分析
- hibernate.validator验证参数
- linux下如何在线添加和移除scsi磁盘?
- easyui 1.4.3 窗口创建或拖动超过父元素 边界 BUG 解决方法
- SeDebugPrivilege
- Ubuntu18.04 下安装TIM
- Android 高仿QQ空间广告位 ——— 一个位置来回切换两张广告图
- 代码女神利用Python网络爬虫爬取淘宝评论区数据(用小本本记下来)
- 国内云市场,腾讯云、阿里云、华为云,谁能更胜一筹呢?
- python 转换数字为中文的大写
- 输出教师信息c语言作业,C语言教师管理系统代码(最新整理)
- Canva在线免费图表制作工具
- 从达沃斯世界经济论坛,看区块链和数字货币的三大发展趋势
- oracle 触发器管理(以及行级触发器中有两个伪变量 :new 与 :old 的使用方法)(三个谓词inserting、deleting、updating的使用方法)
- 运算放大器基础知识:什么是运算放大器?
- 自然语言处理之-----Word2Vec
- flutter创建/导入区块链钱包,获取余额
- 如何针对商品抢购活动展示效果做功能测试?
热门文章
- Yaml spring boot 二维数组写法
- WCF编程系列(六)以编程方式配置终结点
- [转] Java内部类详解
- centos 5.x 大硬盘管理
- python3+xlrd解析Excel
- 接口jdk1.8与jdk1.9新特性
- 基于docker的spark-hadoop分布式集群之二: 环境测试
- asp数据分页显示技术(上下页版)
- C 语言实例 - 计算 int, float, double 和 char 字节大小
- 【52.55%】【BZOJ 4520】K远点对