6.5.1 备份策略与RPO/RTO设计

本节围绕备份策略与RPO/RTO设计展开,目标是把“恢复目标”落地为可执行的备份矩阵与恢复流程。先完成业务分级与SLA确认,再按RPO/RTO设定备份频率、介质层级和恢复路径,并结合演练持续校准。

文章图片

1. 业务分级与RPO/RTO目标#

示例:按业务价值制定RPO/RTO
- 核心交易:RPO≤5min,RTO≤15min
- 一般业务:RPO≤1h,RTO≤4h
- 可重建数据:RPO≤24h,RTO≤24h

示例表(备份矩阵)
- 核心交易:全量每日+binlog实时、异地同步
- 一般业务:全量每周+增量每日+binlog 1小时切换
- 可重建数据:全量每周

2. RPO设计:binlog与增量策略#

2.1 关键参数配置示例#

/etc/my.cnf 中启用binlog并设置ROW格式:

[mysqld]
server_id=1
log_bin=/data/mysql/binlog/mysql-bin
binlog_format=ROW
binlog_row_image=FULL
expire_logs_days=7
sync_binlog=1

解释
- log_bin:启用binlog并指定路径
- binlog_format=ROW:保证行级记录,便于精确回放
- sync_binlog=1:每次提交刷盘,降低RPO

2.2 binlog切换与保留#

# 手动切换binlog
mysql -uroot -p -e "FLUSH BINARY LOGS;"

# 查看binlog列表与大小
mysql -uroot -p -e "SHOW BINARY LOGS;"

预期效果:生成新的mysql-bin.00000X文件,旧日志按保留策略过期。

2.3 RPO校验(演示)#

# 查看最新binlog时间范围
mysqlbinlog /data/mysql/binlog/mysql-bin.000123 | head -n 20

用途:确认binlog是否连续,是否满足RPO窗口。

3. RTO设计:恢复路径与时间分解#

RTO由“获取备份+恢复数据+回放binlog+校验+切换”组成。关键点是减少每一步耗时:
- 全量备份周期合理,避免数据量过大
- 预置恢复环境,缩短启动时间
- 采用并行恢复和高速介质

恢复流程示例(含时间控制点)

文章图片

4. 可执行示例:备份策略脚本(全量+binlog归档)#

4.1 备份目录准备#

mkdir -p /backup/full /backup/binlog
chown -R mysql:mysql /backup

4.2 全量备份(mysqldump示例)#

#!/bin/bash
# /usr/local/bin/backup_full.sh
DATE=$(date +%F)
BACKUP_DIR=/backup/full/$DATE
mkdir -p $BACKUP_DIR

mysqldump -uroot -p'YourPass' \
  --single-transaction --master-data=2 \
  --routines --triggers --events \
  --all-databases > $BACKUP_DIR/full.sql

gzip -f $BACKUP_DIR/full.sql
echo "Full backup done: $BACKUP_DIR/full.sql.gz"

4.3 binlog归档#

#!/bin/bash
# /usr/local/bin/archive_binlog.sh
BINLOG_DIR=/data/mysql/binlog
ARCHIVE_DIR=/backup/binlog/$(date +%F)
mkdir -p $ARCHIVE_DIR

# 归档所有binlog
cp $BINLOG_DIR/mysql-bin.* $ARCHIVE_DIR/
echo "Binlog archive done: $ARCHIVE_DIR"

5. 恢复演练示例(验证RTO)#

5.1 还原全量备份#

gunzip -c /backup/full/2024-01-01/full.sql.gz | mysql -uroot -p

5.2 回放binlog到指定时间(PITR)#

mysqlbinlog /backup/binlog/2024-01-01/mysql-bin.000123 \
  --stop-datetime="2024-01-01 10:30:00" | mysql -uroot -p

预期效果:恢复到指定时间点,满足RPO。

6. 排错清单(常见问题)#

  1. binlog未生成
    - 检查log_bin是否开启
    - SHOW VARIABLES LIKE 'log_bin';
  2. binlog回放失败
    - 检查binlog文件是否完整
    - mysqlbinlog --verify-binlog-checksum
  3. 恢复耗时过长
    - 全量备份文件过大:缩短全量周期
    - IO瓶颈:使用SSD或并行恢复

7. 练习#

  1. 设计一份业务分级与RPO/RTO表,并给出对应备份矩阵。
  2. 实操完成一次全量备份与binlog归档。
  3. 在测试库执行一次PITR恢复,记录耗时并评估RTO。
  4. 人为删除一张表,使用备份+binlog恢复并验证一致性。