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

技术分享 | MySQL binlog 日志解析

作者:xuty

本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


很多时候,当我们的业务数据产生了不正常的变化,但却无法得知这类操作是在哪里进行,并且如何进行,单单从程序当面排查很费力。那么就需要通过分析数据库日志来得到历史执行 SQL,根据 SQL 执行逻辑来确认代码位置,进而确认是否是 BUG,亦或是误操作等。

一 、binlog 简介

binlog 是 MySQL Server 层记录的二进制日志文件,用于记录 MySQL 的数据更新或者潜在更新(比如 DELETE 语句执行删除而实际并没有符合条件的数据),select 或 show 等不会修改数据的操作则不会记录在 binlog 中。

通常在 binlog_format =  ROW 的环境下,我们可以通过 binlog 获取历史的 SQL 执行记录,前提是必须开启 binlog_rows_query_log_events 参数(默认关闭,建议开启),该参数可以通过 rows_query_event 事件记录原始的 SQL,如果不开启的话,则只能获取 SQL 对应的行数据。

二、binlog 解析

由于 binlog 是二进制文件,所以无法直接使用文本打开,需要使用对应的解析工具才可以查看具体内容。

2.1 show binlog events

show binlog events 方式可以解析指定 binlog 日志,但不适宜提取大量日志,速度很慢,不建议使用。


2.2 mysqlbinlog

mysqlbinlog 是 mysql 原生自带的 binlog 解析工具,速度快而且可以配合管道命令过滤数据,适合解析大量 binlog 文件,建议使用。

由于 windows 下面无法使用管道命令如此简洁的提取出 SQL,所以这边就只写 Linux 下的使用方法。我平时的做法会将 windows 下面的 binlog 拷贝到 Linux 下,再利用 Linux 的管道命令解析。

个人常用的 Linux 下解析命令:

mysqlbinlog /data/mysql_data/bin.000008  --database EpointFrame  --base64-output=decode-rows -vv  --skip-gtids=true |grep  -C 1 -i "delete from  Audit_Orga_Specialtype" > /opt/sql.log

  • /data/mysql_data/bin.000008:需要解析的 binlog 日志。

  • database:只列出该数据库下的行数据,但无法过滤 Rows_query_event。

  • base64-output=decode-rows -vv:显示具体 SQL 语句。

  • skip-gtids=true:忽略 GTID 显示。

  • grep  -C 1  -i  "delete from dataex_trigger_record":通过管道命令筛选出所需 SQL 及执行时间。

  • /opt/sql.log:将结果导入到日志文件,方便查看。

结果示例:

小贴士:

1. 如果不确定 SQL 格式或是无法筛选到数据,比如因为 delete from 中间冷不丁多一个空格出来,可以使用 grep 多次过滤筛选,比如 grep  -C 1 -i "Rows_query" |grep -C 1    -i "Audit_Orga_Specialtype" |grep -C 1 -i "delete" 筛选对应表上的 delete 操作。

2. 触发器执行的 SQL 不会记录在 Rows_query_event 中,只会记录对应的行数据。

3. --database 是无法过滤 Rows_query_event 的,只可以过滤行数据。

三、解析方式对比

对于常见的数据库(SQL Server、Oracle、MySQL)来说,都具有类似相同的日志来记录历史 SQL,不同的只是日志的记录方式和解析方法:


相关文章推荐:

故障分析 | MySQL 优化案例 - select count(*)

故障分析 | MySQL 优化案例 - 字符集转换

社区近期动态

QQ群号:763628645

QQ群二维码如下, 添加请注明:姓名+地区+职位,否则不予通过

订阅我的微信公众号“杨建荣的学习笔记”,第一时间免费收到文章更新。别忘了加星标,以免错过新推送提示。

相关文章:

  • 工作中的半成品
  • 基于Maxwell的MySQL数据传输服务整体设计
  • 迁移到MySQL的语法转换工具初步设计
  • MySQL空间报警后的一揽子解决方案
  • 超12万人申请北京积分落户,顺带分析了一波近年的数据
  • MySQL中insert阻塞问题的分析
  • MySQL数据延迟跳动的问题分析
  • 彻底取代Redis+数据库架构,京东618稳了!
  • 一个扭蛋的故事
  • 做一次完美的数据迁移
  • 招贤纳士-第16期,来自北京和成都的职位
  • MySQL安装部署,从半成品状态的改进
  • 从SQL Server到TiDB的架构设计及对数据中台的思考
  • 近期的状态小结和最近要做的一些事情
  • 一次完整的JVM堆外内存泄漏故障排查记录
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 「面试题」如何实现一个圣杯布局?
  • Android优雅地处理按钮重复点击
  • Apache Spark Streaming 使用实例
  • Django 博客开发教程 16 - 统计文章阅读量
  • exports和module.exports
  • gops —— Go 程序诊断分析工具
  • Gradle 5.0 正式版发布
  • k个最大的数及变种小结
  • Laravel Mix运行时关于es2015报错解决方案
  • Markdown 语法简单说明
  • pdf文件如何在线转换为jpg图片
  • SpringBoot几种定时任务的实现方式
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 工程优化暨babel升级小记
  • 基于组件的设计工作流与界面抽象
  • 我有几个粽子,和一个故事
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (3)nginx 配置(nginx.conf)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (java)关于Thread的挂起和恢复
  • (办公)springboot配置aop处理请求.
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (汇总)os模块以及shutil模块对文件的操作
  • (剑指Offer)面试题34:丑数
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ./configure、make、make install 命令
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net IE10 _doPostBack 未定义
  • .NET NPOI导出Excel详解
  • .Net 高效开发之不可错过的实用工具
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题