MySQL增量备份依赖binlog,需先启用log-bin并设唯一server-id;以全量备份为基准,用mysqldump加--flush-logs和--master-data=2记录起点;定期拷贝新增binlog或用mysqlbinlog提取指定时段SQL;恢复时先全量导入,再按序重放增量日志。

MySQL 增量备份的核心是依赖二进制日志(binlog),它记录了所有对数据库的修改操作(INSERT、UPDATE、DELETE、DDL 等),只要开启并合理管理 binlog,就能实现基于时间点或位置的增量恢复。
确认并启用二进制日志
增量备份的前提是 MySQL 必须开启 binlog。检查当前配置:
SHOW VARIABLES LIKE 'log_bin';
若返回 ON,说明已启用;否则需在 my.cnf(或 my.ini)中添加:
[mysqld] log-bin = mysql-bin server-id = 1 expire_logs_days = 7 # 推荐设置,自动清理过期日志
重启 MySQL 生效。注意:server-id 必须唯一(主从复制场景下尤其重要),且不能为 0。
执行全量备份作为基准
增量备份必须基于一次可靠的全量备份。推荐使用 mysqldump 或 Percona XtraBackup(物理备份,支持热备):
- 用 mysqldump 做逻辑全备(适合中小数据量):
mysqldump --all-databases --single-transaction --flush-logs --master-data=2 > full_backup_$(date +%F).sql
关键参数说明:
- --single-transaction:保证 InnoDB 一致性快照(不锁表)
- --flush-logs:滚动 binlog,新日志从备份后开始记录
- --master-data=2:在备份文件中注释记录当前 binlog 文件名和位置(即增量起点)
备份完成后,记下生成的 binlog 文件名(如 mysql-bin.000005)和起始 position(如 198)——这是后续增量恢复的起点。
定期保存新增的 binlog 文件
全量备份之后,所有变更都写入新的 binlog。只需按需拷贝新增的 binlog 文件即可完成“增量”:
- 查看当前 binlog 列表:
SHOW BINARY LOGS;
- 将自上次全备以来产生的新 binlog 拷出(例如从 mysql-bin.000005 开始):
cp /var/lib/mysql/mysql-bin.000005 /backup/inc/ cp /var/lib/mysql/mysql-bin.000006 /backup/inc/
也可用 mysqlbinlog 提取指定时间段或位置的 SQL:
mysqlbinlog --start-datetime="2024-06-01 09:00:00" \
--stop-datetime="2024-06-01 12:00:00" \
/var/lib/mysql/mysql-bin.000005 > inc_20240601_am.sql恢复时按顺序应用
恢复流程为:全量恢复 → 按序重放增量 binlog:
- 导入全量备份:
mysql - 重放增量 binlog:
mysqlbinlog inc_20240601_am.sql | mysql - 如需精确到某条语句,可用
--start-position和--stop-position控制范围
注意:恢复前确保目标库的 binlog 已关闭(避免重复写入),或使用 SET sql_log_bin = 0; 临时禁用。










