MySQL开启binlog日志,恢复数据教程

前言

误删了数据,有备份但太老了,怎么办?开启binlog可以恢复到任意时间点的数据。

一、什么是binlog

binlog是MySQL的二进制日志,记录所有写操作(增删改)。

作用:

  1. 数据恢复
  2. 主从复制

二、开启binlog

查看是否开启

SHOW VARIABLES LIKE 'log_bin';
Variable_name Value
log_bin OFF

OFF就是没开。

开启方法

改my.cnf:

[mysqld]
# 开启binlog
log_bin = /var/log/mysql/mysql-bin

# 服务ID
server_id = 1

# binlog格式(推荐row)
binlog_format = ROW

# 保留7天
expire_logs_days = 7

# 单个文件最大1G
max_binlog_size = 1G

重启MySQL:

systemctl restart mysqld

验证开启成功

SHOW VARIABLES LIKE 'log_bin';

显示ON就是开了。

三、查看binlog文件

SHOW BINARY LOGS;

输出:

Log_name File_size
mysql-bin.000001 123456
mysql-bin.000002 234567

四、恢复数据

场景:误删了表,要恢复

第一步:找到要恢复的位置

先看binlog内容:

mysqlbinlog /var/log/mysql/mysql-bin.000002

找到误操作的位置点(position)。

第二步:恢复到备份点

先恢复最近的全量备份:

mysql -u root -p < backup.sql

第三步:恢复binlog

从备份点开始,恢复binlog到误操作前:

mysqlbinlog --start-position=备份点position --stop-position=误操作前position /var/log/mysql/mysql-bin.000002 | mysql -u root -p

按时间恢复

mysqlbinlog --start-datetime="2026-10-08 07:00:00" --stop-datetime="2026-10-08 07:30:00" /var/log/mysql/mysql-bin.000002 | mysql -u root -p

五、常用操作

刷新binlog(新开一个文件)

FLUSH LOGS;

删除旧binlog

-- 删除指定文件之前的
PURGE BINARY LOGS TO 'mysql-bin.000010';

-- 删除7天前的
PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 7 DAY);

查看当前binlog位置

SHOW MASTER STATUS;

六、binlog格式

格式 说明 优缺点
STATEMENT 记录SQL语句 日志小,但可能不一致
ROW 记录每行变化 日志大,但精确
MIXED 混合 折中

推荐用ROW,最安全。

常见坑

坑1:binlog没开就想恢复

原因: 事前没开启binlog。

解决: 现在就去开,不然出事就晚了。

坑2:binlog格式不对

用STATEMENT格式,恢复后数据不一致。

解决: 用ROW格式。

坑3:binlog占满磁盘

binlog一直写,磁盘满了。

解决: 设 expire_logs_days = 7,自动删旧的。

坑4:恢复顺序错了

先恢复binlog再恢复备份,数据更旧了。

正确顺序: 先恢复全量备份 → 再恢复binlog增量。

坑5:mysqlbinlog命令找不到

原因: MySQL环境变量没配。

解决: 用全路径:

/usr/local/mysql/bin/mysqlbinlog

总结

开启binlog三步:

  1. 改my.cnf加 log_bin
  2. 重启MySQL
  3. 验证 SHOW VARIABLES LIKE 'log_bin'

记住: 生产环境一定要开binlog,不然出事就完蛋。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 07:50