共98行
2026-04-03 11:09:54
查看 MySQL Binlog 主要分为两步:先定位文件,再解析内容。根据你的需求(是看文件名还是看具体SQL),操作路径有所不同。
登录 MySQL 后,执行以下命令查看当前正在写入的 binlog 文件及位置:
SHOW MASTER STATUS;输出示例:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | | |
+------------------+----------+--------------+------------------+
这里 mysql-bin.000001 就是当前的 binlog 文件名。
SHOW BINARY LOGS;这会列出服务器上所有的 binlog 文件,帮助你确定需要解析的历史文件。
binlog 文件通常位于 MySQL 的数据目录(datadir)下。通过以下命令找到数据目录路径:
SHOW VARIABLES LIKE 'datadir';然后结合第一步得到的文件名(如 mysql-bin.000001),即可在服务器文件系统中定位到完整路径(如 /var/lib/mysql/mysql-bin.000001)。
注意:Binlog 是二进制格式,不能直接用 cat 或 vim 查看,必须使用官方工具 mysqlbinlog 进行解析。
mysqlbinlog 是 MySQL 自带的命令行工具,通常在 MySQL 的 bin 目录下。
基础用法(在服务器上执行):
# 解析指定的 binlog 文件
mysqlbinlog /var/lib/mysql/mysql-bin.000001
# 解析并解码为可读的 SQL 语句(推荐)
mysqlbinlog --base64-output=DECODE-ROWS -v /var/lib/mysql/mysql-bin.000001--base64-output=DECODE-ROWS:解码行事件(ROW格式的binlog必须加此参数)。-v 或 --verbose:输出更详细的信息,将行事件伪造成SQL显示。按时间范围查询:
# 只查看 2026-04-03 当天的日志
mysqlbinlog --start-datetime="2026-04-03 00:00:00" --stop-datetime="2026-04-03 23:59:59" mysql-bin.000001按位置范围查询:
mysqlbinlog --start-position=4 --stop-position=123 mysql-bin.000001你也可以在 MySQL 会话中使用 SHOW BINLOG EVENTS,但它通常只用于查看事件概览,不适合查看详细的SQL内容。
SHOW BINLOG EVENTS IN 'mysql-bin.000001' FROM 4 LIMIT 10;binlog_format 可能设置为 ROW 或 MIXED。在 ROW 格式下,实际数据变化是以 Base64 编码的。--base64-output=DECODE-ROWS -v 参数才能看到伪SQL。bin 文件夹下(如 /usr/bin/mysqlbinlog 或 /usr/local/mysql/bin/mysqlbinlog)。默认的 binlog 只记录 SQL 语句,不记录执行用户(除非你开启了 binlog_rows_query_log_events 或使用审计插件)。如果需要审计用户,通常需要借助中间件或开启全量日志审计功能。
| 场景 | 命令 |
|---|---|
| 看当前文件 | SHOW MASTER STATUS; |
| 看文件列表 | SHOW BINARY LOGS; |
| 找文件路径 | SHOW VARIABLES LIKE 'datadir'; |
| 解析为SQL | mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 |
| 按时间过滤 | mysqlbinlog --start-datetime="2026-04-03 00:00:00" mysql-bin.000001 |