MySQL的binlog二进制日志记录了数据库所有的增删改操作,当发生数据误删、错误更新等异常情况时,我们可以通过mysqlbinlog命令解析binlog日志,提取需要恢复的SQL语句来完成数据恢复。binlog日志有三种格式,分别是STATEMENT、ROW和MIXED,其中ROW格式能更精准地记录每行数据的变化,是恢复场景下的推荐配置。

前置准备:开启binlog日志
首先确认MySQL是否已经开启binlog日志,登录MySQL执行以下命令查看:
-- 查看binlog是否开启 SHOW VARIABLES LIKE 'log_bin'; -- 查看binlog格式 SHOW VARIABLES LIKE 'binlog_format';
如果log_bin的值为OFF,需要修改MySQL配置文件my.cnf(Windows下为my.ini),添加以下配置后重启MySQL服务:
[mysqld] # 开启binlog日志 log_bin=mysql-bin # 设置binlog格式为ROW binlog_format=ROW # 设置binlog过期时间为7天,避免日志占满磁盘 expire_logs_days=7
mysqlbinlog命令基础用法
mysqlbinlog是MySQL安装目录bin下的自带工具,基本语法如下:
mysqlbinlog [选项] binlog文件路径
常用的选项参数说明:
- --start-datetime:指定恢复起始时间,格式为YYYY-MM-DD HH:MM:SS
- --stop-datetime:指定恢复结束时间
- --start-position:指定恢复起始位置点
- --stop-position:指定恢复结束位置点
- -d:指定要恢复的数据库名
- --base64-output=DECODE-ROWS:解析ROW格式的binlog时,将行事件转换为可读的SQL语句
完整恢复流程演示
步骤1:定位误操作的时间或位置点
首先查看当前所有的binlog日志文件:
SHOW BINARY LOGS;
假设我们误删了test库的user表数据,操作发生在2024-05-20 14:30:00左右,先解析对应时间段的binlog日志:
mysqlbinlog --base64-output=DECODE-ROWS -v --start-datetime="2024-05-20 14:25:00" --stop-datetime="2024-05-20 14:35:00" /var/lib/mysql/mysql-bin.000003 > /tmp/binlog_parse.txt
打开/tmp/binlog_parse.txt文件,找到误删除操作的对应位置点,比如找到DELETE语句对应的位置范围是start-position=1234,stop-position=1567。
步骤2:提取恢复所需的SQL语句
根据定位到的位置点,提取该时间段内的所有SQL语句,排除误操作的DELETE语句,或者如果是需要回滚删除操作,可以直接提取对应的反向SQL:
mysqlbinlog --start-position=1234 --stop-position=1567 -d test /var/lib/mysql/mysql-bin.000003 > /tmp/recover_sql.sql
步骤3:执行恢复操作
登录MySQL,切换到对应的test库,执行提取出来的恢复SQL文件:
mysql -u root -p test < /tmp/recover_sql.sql
如果是需要恢复整个binlog文件到某个时间点,也可以直接通过管道执行:
mysqlbinlog --stop-datetime="2024-05-20 14:29:59" /var/lib/mysql/mysql-bin.000003 | mysql -u root -p
注意事项
- 恢复前一定要先备份当前数据库,避免恢复操作出错导致数据进一步丢失
- 如果binlog格式是ROW,解析时必须加
--base64-output=DECODE-ROWS -v参数才能看到可读的SQL内容 - 恢复操作建议在测试环境先验证,确认SQL语句无误后再在生产环境执行
- 如果误操作后产生了新的binlog日志,恢复时只需要解析误操作对应的binlog文件即可,不需要处理后续的日志文件
常见问题解答
mysqlbinlog执行时报文件不存在怎么办
首先检查binlog文件路径是否正确,可以通过SHOW VARIABLES LIKE 'datadir';命令查看MySQL的数据目录,binlog文件默认存放在该目录下。
恢复后数据不一致怎么办
这种情况通常是位置点定位不准确,需要重新解析binlog日志,缩小时间范围或者调整位置点范围,重新提取SQL语句后再执行恢复。
mysqlbinlogMySQL恢复binlog日志数据库备份修改时间:2026-07-11 17:27:36