mysql如何进行增量备份_mysql增量备份实现思路

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。

执行全量备份作为基准

增量备份必须基于一次可靠的全量备份。推荐使用 mysqldumpPercona 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="2025-06-01 09:00:00" \
             --stop-datetime="2025-06-01 12:00:00" \
             /var/lib/mysql/mysql-bin.000005 > inc_20250601_am.sql

恢复时按顺序应用

恢复流程为:全量恢复 → 按序重放增量 binlog

  1. 导入全量备份:mysql
  2. 重放增量 binlog:mysqlbinlog inc_20250601_am.sql | mysql
  3. 如需精确到某条语句,可用 --start-position--stop-position 控制范围

注意:恢复前确保目标库的 binlog 已关闭(避免重复写入),或使用 SET sql_log_bin = 0; 临时禁用。