MySQL的binlog是数据库层面非常重要的日志文件,它完整记录了所有对数据的修改操作,其中DML语句(包括INSERT、UPDATE、DELETE)是业务操作的核心体现,统计这些语句可以帮助我们分析业务操作频率、排查异常数据变更、做数据审计等。下面介绍几种实用的统计方法。

方法一:使用mysqlbinlog结合命令行工具统计
mysqlbinlog是MySQL官方提供的binlog解析工具,我们可以将binlog文件解析为文本格式,再通过grep、awk等命令行工具过滤统计DML语句。
首先用mysqlbinlog解析binlog文件,命令如下:
# 解析指定binlog文件,输出为文本 mysqlbinlog /var/lib/mysql/binlog.000012 > binlog_parse.txt
解析后的文本中,DML语句会有对应的标识,我们可以通过关键字过滤统计:
# 统计所有DML语句总数 grep -E "^(INSERT|UPDATE|DELETE)" binlog_parse.txt | wc -l # 分别统计三种DML语句的数量 echo "INSERT数量: $(grep -c "^INSERT" binlog_parse.txt)" echo "UPDATE数量: $(grep -c "^UPDATE" binlog_parse.txt)" echo "DELETE数量: $(grep -c "^DELETE" binlog_parse.txt)"
这种方法的优势是简单快捷,不需要额外依赖,但是只能做粗粒度的统计,无法获取到语句对应的表、执行时间等更详细的信息。
方法二:解析binlog事件实现精细统计
如果需要统计DML语句对应的库名、表名、执行时间等信息,可以通过解析binlog的事件结构来实现,这里以Python为例,使用pymysqlreplication库解析binlog事件。
首先安装依赖库:
pip install pymysqlreplication
然后编写解析统计的脚本:
from pymysqlreplication import BinLogStreamReader
from pymysqlreplication.row_event import (
WriteRowsEvent,
UpdateRowsEvent,
DeleteRowsEvent
)
# MySQL连接配置
mysql_settings = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'passwd': 'your_password'
}
# 统计结果存储
dml_stats = {
'total': 0,
'insert': 0,
'update': 0,
'delete': 0,
'detail': [] # 存储详细的DML信息
}
# 创建binlog流读取器
stream = BinLogStreamReader(
connection_settings=mysql_settings,
server_id=100, # 自定义唯一server_id
blocking=True,
only_events=[WriteRowsEvent, UpdateRowsEvent, DeleteRowsEvent]
)
# 遍历binlog事件
for event in stream:
dml_stats['total'] += 1
# 判断事件类型并统计
if isinstance(event, WriteRowsEvent):
dml_type = 'INSERT'
dml_stats['insert'] += 1
elif isinstance(event, UpdateRowsEvent):
dml_type = 'UPDATE'
dml_stats['update'] += 1
elif isinstance(event, DeleteRowsEvent):
dml_type = 'DELETE'
dml_stats['delete'] += 1
# 记录详细信息
dml_stats['detail'].append({
'type': dml_type,
'schema': event.schema,
'table': event.table,
'timestamp': event.timestamp
})
stream.close()
# 输出统计结果
print(f"DML语句总数量: {dml_stats['total']}")
print(f"INSERT数量: {dml_stats['insert']}")
print(f"UPDATE数量: {dml_stats['update']}")
print(f"DELETE数量: {dml_stats['delete']}")注意事项
- 统计前需要确认binlog的格式,如果是STATEMENT格式,DML语句会直接记录在binlog中,解析更方便;如果是ROW格式,binlog记录的是行的变更,需要通过事件解析获取对应的操作类型。
- 如果binlog文件较多,需要指定要统计的binlog范围,避免解析过多无用文件浪费资源。
- 线上环境操作binlog时,建议先备份相关文件,避免误操作导致日志损坏。
| 方法 | 适用场景 | 优势 | 不足 |
|---|---|---|---|
| mysqlbinlog+命令行 | 快速统计DML总数、类型分布 | 无需额外依赖,操作简单的 | 无法获取库表、时间等详细信息 |
| 解析binlog事件 | 需要详细统计DML的库、表、时间等信息 | 统计维度丰富,可自定义统计规则 | 需要编写代码,依赖第三方库 |
如果统计的binlog是ROW格式,且需要精确到每行变更的数量,可以在解析事件时统计event.rows的长度,每行变更对应一次实际的行操作。
日常使用中可以根据自己的需求选择合适的方法,简单的统计优先考虑第一种方法,需要多维度分析则选择第二种方法。
MySQLbinlogDML语句统计方法mysqlbinlog修改时间:2026-06-04 02:19:53