备份体系的交付物不是一堆文件,而是“在约定时间内,把数据恢复到约定时间点”的确定能力。先定业务目标,再决定工具、频率、保留周期和演练方式。
一、先定义 RPO 与 RTO
| 指标 | 要回答的问题 | 会影响什么 |
|---|---|---|
| RPO | 最多允许丢失多长时间的数据? | 备份频率、Binlog 保留与跨地域复制 |
| RTO | 故障后多久必须恢复服务? | 恢复介质、自动化程度、数据量与预热方案 |
“每天备份一次”不是业务目标。如果 RPO 要求 5 分钟,仅有每日全量备份显然不够;还必须持续保留并保护 Binlog,或采用更合适的数据保护方案。
二、建立分层备份
- 物理全量:承担大数据量下的快速完整恢复。
- 增量或差异:缩短备份窗口与传输时间,但增加恢复链复杂度。
- Binlog:用于时间点恢复,必须与全量备份的坐标信息关联。
- 逻辑备份:便于对象级恢复、迁移与抽样校验,不替代物理备份。
- 异地副本:应对机房、账号、误删除和勒索等同故障域风险。
副本不是备份
主库误删除会复制到从库;主从复制能提升可用性,但不能替代具备独立保留周期和访问控制的备份。
三、演练前准备
- 明确演练目标:完整恢复、单库恢复或时间点恢复
- 准备与生产隔离、容量足够的恢复环境
- 记录 MySQL 版本、参数、字符集、加密与密钥依赖
- 确认全量、增量与 Binlog 链完整且校验值一致
- 准备验收 SQL、业务抽样规则和计时表
- 指定执行人、观察人、审批人和回滚边界
四、完整恢复演练 Runbook
步骤 1:选定恢复点并冻结证据
记录目标时间、目标事务或业务事件,保留所需备份文件清单、校验值、Binlog 起止位置和依赖配置。不要在演练过程中让保留策略自动清理这些文件。
步骤 2:恢复并准备物理备份
# 示例:命令参数应按实际版本与备份策略调整
xtrabackup --prepare --target-dir=/restore/full
# 确认目标 datadir 已清空且权限正确后再复制
xtrabackup --copy-back --target-dir=/restore/full
物理恢复前必须核对版本兼容性、目录、属主、磁盘空间和启动参数。任何会覆盖数据目录的操作都只在隔离恢复环境执行。
步骤 3:启动隔离实例并完成基础校验
- 错误日志无崩溃恢复或表空间异常
- 核心库表、账号与权限存在
- 表数量、数据量和关键对象符合备份时间点
- 实例只能被演练网络访问,不接入生产流量
步骤 4:应用 Binlog 到目标时间点
mysqlbinlog \
--start-datetime='2026-08-07 01:00:00' \
--stop-datetime='2026-08-07 01:28:30' \
mysql-bin.000321 mysql-bin.000322 \
| mysql --socket=/restore/mysql.sock
实际演练应优先使用备份记录的精确位置或 GTID 范围,并避开导致故障的事务。时间点只是便于理解的示例,时区和跨文件边界都必须核对。
步骤 5:做数据库与业务双重校验
| 校验层 | 建议内容 |
|---|---|
| 实例 | 启动状态、错误日志、版本与关键参数 |
| 对象 | 库表、索引、视图、存储过程、账号权限 |
| 数据 | 行数、校验和、最大时间戳、核心金额与订单数量 |
| 业务 | 登录、查询、下单等只读或隔离验证流程 |
步骤 6:记录耗时并复盘
分别记录文件准备、数据复制、实例启动、Binlog 回放和业务验证耗时。把最长环节与人工等待找出来,才能判断实际 RTO 是否达标。
五、演练验收标准
通过条件
恢复点满足 RPO;总耗时满足 RTO;核心数据与业务校验通过;操作步骤可由非作者按文档复现;发现的问题已有负责人和截止时间。
六、建议的演练节奏
- 每日:自动检查备份任务、大小、耗时、校验值与 Binlog 连续性。
- 每周:抽取一份备份做自动化恢复与基础 SQL 校验。
- 每月或每季度:按重要性完成端到端人工演练,验证 RPO/RTO 与业务流程。
- 重大变更后:版本升级、存储迁移、加密调整或备份工具变更后立即专项验证。
七、一句话记忆
用业务 RPO/RTO 设计备份,用隔离恢复证明备份,用业务校验宣布成功,用定期演练保持这项能力有效。