MySQL开启binlog日志,恢复数据教程
前言
误删了数据,有备份但太老了,怎么办?开启binlog可以恢复到任意时间点的数据。
一、什么是binlog
binlog是MySQL的二进制日志,记录所有写操作(增删改)。
作用:
- 数据恢复
- 主从复制
二、开启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三步:
- 改my.cnf加
log_bin - 重启MySQL
- 验证
SHOW VARIABLES LIKE 'log_bin'
记住: 生产环境一定要开binlog,不然出事就完蛋。
遇到问题加QQ23979811 协助处理