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;临时禁用。
