一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

MySQL数据库如何做全量与增量备份?

时间:2026-07-09 10:29:51 编辑:袖梨 来源:一聚教程网

MySQL增量备份必须依赖binlog且以全量备份为前提,需启用log_bin=on、binlog_format=ROW、server-id唯一非0;全备须用--master-data=2记录binlog位点,增量通过归档mysql-bin.*并用mysqlbinlog按时间或位置解析,恢复须严格按全量→增量顺序执行。

全量备份必须带 --master-data=2--single-transaction,否则增量备份根本没法接上;增量不是“命令”,而是归档 mysql-bin.* 文件并用 mysqlbinlog 解析——漏掉一个文件或位置错一位,恢复就出数据错乱。

全量备份必须记录 binlog 位点,否则增量无从谈起

直接跑 mysqldump --all-databases 得到的只是快照,不包含该快照对应的 binlog 文件名和 position,后续增量无法定位起点。必须显式加 --master-data=2(生成带 # 的注释行,安全)或 --master-data=1(生成可执行语句,慎用)。--single-transaction 对 InnoDB 表是刚需,避免锁表;若库中含 MyISAM 表,得换 --lock-all-tables,不能省略锁参数。

常见错误现象:

  • --skip-lock-tables 或干脆不加锁参数 → 备份跨事务状态,恢复后主键冲突、外键断裂
  • 没配 --flush-logs → 全量备份写入的 binlog 位点可能被后续写入覆盖,导致增量起始点漂移
  • 备份时 MySQL 正在写入,又没设 innodb_lock_wait_timeout → 长事务卡住 --single-transaction,备份挂起或失败

增量备份本质是归档 binlog 文件,不是执行命令

MySQL 没有“增量备份命令”。所谓增量,就是定期把新产生的 mysql-bin.0000xx 文件拷走(如用 cprsync),再用 mysqlbinlog 转成 SQL 或 base64 格式存档。关键不在“转”,而在“归档时机”和“文件完整性”。

实操要点:

  • 全量备份后立即执行 FLUSH BINARY LOGS,让后续增量从新文件开始,避免混杂
  • 不要只拷最新一个 mysql-bin.0000xx → 必须确认该文件是否已 closed(SHOW BINARY LOGS 查看当前活跃列表)
  • mysqlbinlog --start-position=xxx --stop-position=yyy 截取区间,比整文件拷贝更精准,也避免误含未提交事务
  • 设置 expire_logs_daysbinlog_expire_logs_seconds,但必须配合磁盘监控——binlog 占满磁盘会直接导致 MySQL 停写

恢复必须严格按顺序重放,跳过或颠倒等于丢数据

全量恢复完,数据库停留在 dump 时刻;之后所有变更都在 binlog 里。恢复链是:先导入 mysqldump 输出,再按 mysql-bin.000001000002 → … 顺序,逐个用 mysqlbinlog | mysql 重放。任意跳过、重复、颠倒都会导致数据错乱。

容易踩的坑:

  • 全量备份记录的是 mysql-bin.00000512345,但增量脚本从 12346 开始 → 漏掉最后一条事务
  • 恢复时没停写,新请求写入正在重放的 binlog → 主键冲突或唯一键报错
  • mysqlbinlog 时没加 --base64-output=DECODE-ROWS -v(ROW 格式下),直接重放二进制内容 → 报错退出
  • 权限没单独备份 mysql 库 → 恢复后用户账号、权限丢失,连不上库

生产环境建议组合策略:每周全量 + 每日 binlog 归档

最小可行策略是:周一做一次带 --master-data=2--flush-logs 的全量,记录位点;周二到周日每天归档自上次全量起始位置以来的新 binlog,并用 mysqlbinlog --start-position=xxx 精确截取。这样既控制存储增长,又保证恢复链可控。

注意点:

  • 全量备份文件本身要压缩(如 gzip),但 binlog 归档建议先保留原始二进制格式,解析留到恢复时做,避免提前损坏
  • 所有备份脚本必须加 if [ $? -eq 0 ] 判断,失败立刻告警,不能静默忽略
  • server_id 必须非 0 且全局唯一,log_bin 必须开启,binlog_format 推荐设为 ROW —— 这三项不满足,增量备份就不可靠

真正麻烦的从来不是命令怎么写,而是位点对不对、文件全不全、顺序乱不乱。每次备份后,拿 grep "CHANGE MASTER" 全量备份.sql 确认位点存在,再用 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.0000xx | head -20 快速验一下头几条是不是可读 SQL —— 这两步省不得。

热门栏目