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


二、binlog 解析
由于 binlog 是二进制文件,所以无法直接使用文本打开,需要使用对应的解析工具才可以查看具体内容。
show binlog events 方式可以解析指定 binlog 日志,但不适宜提取大量日志,速度很慢,不建议使用。

2.2 mysqlbinlog
mysqlbinlog 是 mysql 原生自带的 binlog 解析工具,速度快而且可以配合管道命令过滤数据,适合解析大量 binlog 文件,建议使用。
/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 的,只可以过滤行数据。
三、解析方式对比

故障分析 | MySQL 优化案例 - select count(*)
社区近期动态

点一下“阅读原文”了解更多资讯
文章转载自爱可生开源社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。






