MySQL binlog 日志解析

2023-10-31

很多时候,当我们的业务数据产生了不正常的变化,但却无法得知这类操作是在哪里进行,并且如何进行,单单从程序当面排查很费力。那么就需要通过分析数据库日志来得到历史执行 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 中,只会记录对应的行数据。

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

三、解析方式对比

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


链接:https://www.jianshu.com/p/ec0796f95ec9
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL binlog 日志解析 的相关文章

随机推荐

  • 字符串分割的几种方法

    方法一 利用STL自己实现split 函数 常用 简单 直观 原型 vector
  • 转 欢迎使用CSDN-markdown编辑器

    https blog csdn net CSDNwei article details 51836182 Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义 谨记 声明可以多次 定义只能一次 函数的声明extern关键词是可
  • java正则表达式讲解

    工具集正则表达式 http www ostools net regex w w w w w w w w email邮箱 注 本文为转载文章本文实在是不错的 参考博客 http lavasoft blog 51cto com 62575 80
  • 【Jmeter服务器资源监控ServerAgent无法连接】

    问题 通过Jmeter对接口进行压测 需要监控服务器资源 但是发现PerfMon Metrics Collector一直提示ERROR java net ConnectException Connection refused connect
  • 【工作必备技能整理】openpyxl全套教程,提升工作效率【接力pandas】

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 openpyxl在我看来 就是用代码代替我们的双手 在EX
  • CocosCreator3.8研究笔记(一)windows环境安装配置

    一 安装Cocos 编辑器 1 下载Cocos Dashboard安装文件 Cocos 官方网站Cocos Dashboard下载地址 https www cocos com creator download9 下载完成后会得到CocosD
  • Git clone fetch-pack unexpected disconnect while reading sideband packet

    在执行 git clone 命令遇到以下错误 remote Enumerating objects 1252 done remote Counting objects 100 1252 1252 done remote Compressin
  • 原来牛客网练习题还能这么做?

    笔者最新更新牛客网练习题 笔者开头感想 如今大部分高校已经开学 当然笔者也不列外 但是由于疫情的原因 笔者被迫在家上网课学习 一脸忧愁 而这恰恰给了笔者自学的机会 相信笔者会加油滴 按照时间的步伐来追寻科班的脚步 C语言练习题集册见 1 牛
  • jsonp跨域,原生js和ajax实现百度,360,必应等浏览器搜索框的智能补全提示技术,带搜索功能的搜索框

    相信许多刚学前端的的同学 都曾对浏览器搜索框自动提示提示的功能挺好奇的 接下让我们一起揭露他的神秘面纱吧 相信学过javascript的同学都引用过外部的JavaScript吧 其实跨域就是动态的创建script标签 将script标签ur
  • Dynamics 365 APP -- 清晰定义你的系统职责范围

    今天我们来看看Dynamics 365 的一个新feature APP 对的 没错是APP 各位小伙伴肯定很诧异 难道Dynamics 365又推出了新版本的APP吗 如果各位这么想的话就中了博主的招了 因为博主故意放了一个烟雾弹 今天要讲
  • Windows下把CUDA程序生成dll库并在项目中调用dll中的函数

    如何把自己写的cuda代码生成dll库 方便集成到其他主项目中去进行调用呢 这里总结了一个基本流程 操作环境 Windows10 visual studio2017 cuda10 2 opencv4 2都已经安装并配置好了 主题1 cuda
  • 西门子PLC内部的数据类型大全

    西门子PLC的数据类型种类繁多 本文进行了收集 并指明了适用范围 长度 供需要进行数据采集和分析的朋友们参考 本表格整理自博图V14 不保证更高级版本不会新增数据类型 请使用中注意 类别 数据类型 长度 位 长度 字节 S7 300 400
  • php 递归面试题_8个PHP数组面试题,php数组试题

    8个PHP数组面试题 php数组试题 网上找的PHP数组题 准备自己做一遍并且记录下来 1 写函数创建长度为10的数组 数组中的元素为递增的奇数 首项为1 复制代码 代码如下 function arrsort first length ar
  • Python 十大装 B 语法【Python干货】

    Python 是一种代表简单思想的语言 其语法相对简单 很容易上手 不过 如果就此小视 Python 语法的精妙和深邃 那就大错特错了 本文精心筛选了最能展现 Python 语法之精妙的十个知识点 并附上详细的实例代码 如能在实战中融会贯通
  • Exception 处理之最佳实践

    作者 Gunjan Doshi 2003 11 19 译者注 本文算是一篇学习笔记 仅供学习参考使用 有不妥之处 还请指出 2003 12 04 本文是Exception处理的一篇不错的文章 从Java Exception的概念介绍起 依次
  • L3 Hive操作

    示例 1 建表 create table t dml detail id bigint sale date date province string city string product id bigint cnt double amt
  • Yarn的安装详解?Yarn的各种系统安装详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如何在不同系统环境中安装Yarn Yarn在各种系统的安装详解 Yarn的安装详细的教程 希望能帮助一些程序袁 工具 原料 电脑 Yarn Windows安装详解 1 可以
  • NJUPT南邮

    设计可用于该实验的进程控制块 进程控制块至少包括进程号 状态和要求服务时间 动态或静态创建多个进程 模拟操作系统四种进程调度算法 先进先出 短作业优先 高优先级优先 高相应比优先中的任意两种 调度所创建的进程并显示调度结果 package
  • matlab2021版关于csv文件读写的一些方法

    首先给出一些演示数据 直接给出来大家看起来都方便 完整代码在最后 有基础的可以直接看代码 下面是data csv的文件内容 可以看得出里面有文本也有数值 代码 名称 最新价 涨跌额 涨跌幅 买入 卖出 昨收 今开 最高 最低 成交量 成交额
  • MySQL binlog 日志解析

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