这是《MySQL 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 备份是最后一道防线。高可用可以处理机器故障,却无法自动处理误删表、错误更新、逻辑 Bug、勒索加密和版本缺陷。备份的价值只有在成功恢复后才存在。
27.1 备份目标
设计备份前先明确:
| 指标 | 问题 |
|---|---|
| RPO | 最多接受丢多久数据 |
| RTO | 多久必须恢复业务 |
| 保留周期 | 天、周、月、年分别保留多久 |
| 恢复粒度 | 实例、库、表、行 |
| 恢复位置 | 原实例、临时实例、新集群 |
| 加密要求 | 备份和传输如何加密 |
| 演练频率 | 多久验证一次 |
没有恢复时间目标的备份方案只是文件堆积。
27.2 备份分类
| 类型 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 逻辑备份 | 导出 SQL 或数据行 | 可读、跨版本较灵活 | 恢复慢、体积可能较大 |
| 物理备份 | 复制数据文件和日志 | 恢复快、贴近生产 | 版本和平台要求严格 |
| 快照备份 | 存储层一致性快照 | 速度快 | 依赖存储语义 |
| 增量备份 | 只备份变化 | 体积小 | 恢复链路复杂 |
| Binlog | 记录增量变更 | 支持时间点恢复 | 不能单独作为全量 |
常见组合:
每日物理全量 + Binlog 持续归档
每周核心表逻辑备份
每月恢复演练
每年归档备份离线保存
27.3 mysqldump
适合中小库、表级恢复和跨环境迁移。
全库备份:
mysqldump -h127.0.0.1 -P3306 -uroot -p \
--single-transaction \
--source-data=2 \
--routines \
--triggers \
--events \
--all-databases \
> full_backup.sql
单库备份:
mysqldump -h127.0.0.1 -uroot -p \
--single-transaction \
--source-data=2 \
--routines --triggers --events \
shop > shop_backup.sql
只备份结构:
mysqldump -h127.0.0.1 -uroot -p --no-data shop > shop_schema.sql
只备份数据:
mysqldump -h127.0.0.1 -uroot -p --no-create-info shop > shop_data.sql
关键参数:
| 参数 | 说明 |
|---|---|
--single-transaction |
使用一致性快照,避免 InnoDB 长锁表 |
--source-data=2 |
输出备份位点为注释 |
--routines |
备份存储过程和函数 |
--triggers |
备份触发器 |
--events |
备份事件 |
--set-gtid-purged=OFF |
恢复到独立实例时可避免 GTID 干扰 |
注意:备份时不要加入无关业务流量;大库逻辑备份会拉长备份窗口并影响复制。
27.4 恢复 mysqldump
创建目标库:
CREATE DATABASE shop_recovery
DEFAULT CHARACTER SET utf8mb4;
恢复:
mysql -h127.0.0.1 -P3307 -uroot -p shop_recovery < shop_backup.sql
推荐恢复到临时实例,而不是直接覆盖生产库。恢复后验证:
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'shop_recovery';
抽样对比:
SELECT COUNT(*), SUM(total_amount)
FROM shop_recovery.orders
WHERE created_at >= '2026-08-01';
27.5 mydumper / myloader
大逻辑备份可以使用 mydumper:
mydumper \
--host=127.0.0.1 \
--user=root \
--password='...' \
--database=shop \
--threads=8 \
--trx-consistency-only \
--outputdir=/backup/shop
恢复:
myloader \
--host=127.0.0.1 \
--user=root \
--password='...' \
--directory=/backup/shop \
--threads=8
优点:
- 多线程导出导入;
- 表级文件分离;
- 便于压缩和并行恢复;
- 支持大库分片处理。
27.6 物理备份
XtraBackup
Percona XtraBackup 是常见开源物理备份工具:
xtrabackup \
--backup \
--target-dir=/backup/base \
--user=root \
--password='...' \
--socket=/var/lib/mysql/mysql.sock
准备备份:
xtrabackup --prepare --target-dir=/backup/base
恢复:
systemctl stop mysql
xtrabackup --copy-back --target-dir=/backup/base
chown -R mysql:mysql /var/lib/mysql
systemctl start mysql
物理备份必须与 MySQL 版号、页大小和平台兼容,恢复前阅读对应版本文档。
Clone Plugin
MySQL 8.0 官方克隆插件适合搭建从库:
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
CREATE USER 'clone_user'@'10.0.0.11' IDENTIFIED BY 'Clone123456!';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'10.0.0.11';
CLONE INSTANCE FROM
'clone_user'@'10.0.0.11':3306
IDENTIFIED BY 'Clone123456!';
查看状态:
SELECT * FROM performance_schema.clone_status;
SELECT * FROM performance_schema.clone_progress;
存储快照
云盘快照必须保证:
- InnoDB 处于一致性状态;
- 文件系统刷盘语义正确;
- 快照包含 Redo 和 Undo;
- Binlog 位点可追踪;
- 恢复后通过表校验。
不能假设任意时刻拷贝 .ibd 文件就是可用备份。
27.7 时间点恢复
流程:
1. 恢复全量备份到临时实例;
2. 找到备份对应 Binlog 位点或 GTID;
3. 重放 Binlog 到目标时间前;
4. 校验数据;
5. 导出需要恢复的表;
6. 人工确认后写回;
示例:
mysqlbinlog --no-defaults \
--start-position=154 \
--stop-position=987654 \
mysql-bin.000010 mysql-bin.000011 \
| mysql -h127.0.0.1 -P3307 -uroot -p shop_recovery
误操作恢复思路:
-- 在临时实例建反向表
CREATE TABLE orders_recovered LIKE orders;
从 Binlog 解析误删前的 Write_rows,或导出误删表快照,再按业务主键合并。
27.8 备份验证
每次恢复演练至少验证:
| 验证项 | 方法 |
|---|---|
| 实例可用 | SELECT 1 |
| 表结构 | SHOW CREATE TABLE |
| 行数 | 核心表 COUNT |
| 金额 | SUM / 对账 |
| 索引 | SHOW INDEX |
| 关键数据 | 抽样对比 |
| Binlog 位点 | SHOW BINARY LOG STATUS |
| 应用连通 | 应用影子环境连接 |
| 恢复耗时 | 全流程计时 |
| 备份完整性 | 校验和或压缩测试 |
自动化验证脚本应输出:
备份文件
大小
开始结束时间
源实例位点
恢复实例版本
核心表行数
校验结果
恢复耗时
负责人
27.9 备份安全
- 传输使用 TLS;
- 存储使用对象存储服务端加密和客户自主密钥;
- 备份账号只授予必要权限;
- 生产库凭据放密钥系统;
- 访问审计;
- 防止恢复脚本泄漏密码;
- 异地保存;
- 设置对象版本和防删锁;
- 定期清理但仍满足保留策略;
- 测试密钥可用性。
备份密码、云 KMS 权限和数据库凭据必须分开管理,避免一个账号同时能删数据和删备份。
27.10 备份调度
示例策略:
| 频率 | 内容 |
|---|---|
| 每 15 分钟 | Binlog 归档 |
| 每日 | 物理全量或快照 |
| 每周 | 核心库逻辑备份 |
| 每月 | 恢复演练 |
| 每季度 | 异地恢复演练 |
| 每年 | 合规归档 |
调度必须避开:
- 业务高峰;
- 大型批处理;
- DDL 窗口;
- 备份从库正在追赶复制;
- 其他备份任务重叠。
27.11 常见故障
| 问题 | 原因 | 处理 |
|---|---|---|
| 备份期间主从延迟 | IO 压力或大事务 | 低峰执行、限速、换专用从库 |
| 恢复到一半失败 | SQL 错误、字符集、权限 | 保存日志,先在临时实例重放 |
| Binlog 缺失 | 被提前清理 | 检查保留策略,寻找归档 |
| 备份文件损坏 | 传输或磁盘错误 | 校验和、多副本 |
| GTID 冲突 | 恢复实例已有事务 | 使用干净实例和正确参数 |
| 恢复后数据不一致 | 位点错误 | 重新确认备份位点 |
| 压缩无法解压 | 工具版本 | 保留工具版本记录 |
本章小结
备份方案应围绕 RPO 和 RTO 设计,常见组合是全量物理备份加 Binlog 归档。逻辑备份适合小库和表级恢复,物理备份适合快速重建实例。所有备份都必须恢复到临时环境并验证行数、金额、结构和位点,否则不能称为可用备份。
思考题
mysqldump --single-transaction的作用是什么?- 为什么不能直接拷贝运行中的
.ibd文件作为备份? - 时间点恢复需要哪些输入?
- 如何验证一个备份真的可恢复?
- 设计一个每日备份和月度演练的自动化流程。