6.5.5 备份校验、演练与自动化
备份校验需覆盖完整性、可用性与一致性三方面,并在隔离环境验证可恢复性。以下为校验与演练的标准化流程、命令示例、排错与练习。
1) 备份校验:完整性/可用性/一致性#
1.1 备份清单与校验和#
示例:为每次备份生成清单与校验和(建议保存于 /data/backup/manifest)。
# 备份目录
BACKUP_DIR=/data/backup/mysql/2024-01-01
MANIFEST=/data/backup/manifest/2024-01-01.manifest
# 生成清单:记录实例、备份类型、binlog范围、大小、校验和
cat > "$MANIFEST" <<'EOF'
instance=prod-mysql-01
type=full
binlog_start=mysql-bin.000123:456789
binlog_end=mysql-bin.000124:987654
EOF
# 生成校验和(完整性)
find "$BACKUP_DIR" -type f -exec sha256sum {} \; >> "$MANIFEST"
# 验证校验和(预期无输出)
( cd / && sha256sum -c "$MANIFEST" | grep -v "OK" )
命令解释:
- sha256sum -c 会逐个校验备份文件的完整性,若全部通过无错误输出。
- 清单中必须包含 binlog 范围,便于 PITR 演练。
1.2 解压/解密可用性校验#
# 示例:解压 tar.gz 备份
tar -tzf /data/backup/mysql/2024-01-01/full.tar.gz >/tmp/backup_list.txt
# 示例:解密并检查(假设使用 openssl)
openssl enc -d -aes-256-cbc -in full.enc -out full.tar -k 'StrongPass'
tar -tf full.tar | head -5
1.3 一致性检查(隔离环境)#
恢复到隔离环境后进行一致性检查:
# 连接隔离实例
mysql -h 127.0.0.1 -P3307 -uroot -p
# 抽样一致性检查:行数与校验和
SELECT COUNT(*) FROM order_db.orders;
CHECKSUM TABLE order_db.orders;
2) 演练流程与恢复验证#
2.1 演练流程(可重复)#
sequenceDiagram
participant O as 运维
participant S as 备份存储
participant R as 隔离恢复实例
O->>S: 拉取备份+清单
O->>R: 恢复全量
O->>R: 应用binlog(PITR)
O->>R: 一致性检查
O->>O: 记录耗时/问题
2.2 全量恢复示例(XtraBackup)#
# 1) 解压
tar -xf /data/backup/mysql/2024-01-01/full.tar.gz -C /data/restore
# 2) 准备数据
xtrabackup --prepare --target-dir=/data/restore/full
# 3) 恢复到隔离实例
systemctl stop mysqld
rm -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/data/restore/full
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
预期效果: 隔离实例启动成功,mysql -e "SELECT 1;" 返回 1。
2.3 PITR 演练示例#
# 将 binlog 应用到隔离实例
mysqlbinlog --start-position=456789 --stop-position=987654 \
/data/backup/binlog/mysql-bin.000123 \
/data/backup/binlog/mysql-bin.000124 | \
mysql -h127.0.0.1 -P3307 -uroot -p
3) 自动化:脚本、告警与幂等#
3.1 自动化校验脚本(含日志、重试)#
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR=/data/backup/mysql/2024-01-01
MANIFEST=/data/backup/manifest/2024-01-01.manifest
LOG=/var/log/backup_verify.log
retry=0
max_retry=3
log(){ echo "[$(date '+%F %T')] $*" | tee -a "$LOG"; }
while (( retry < max_retry )); do
if sha256sum -c "$MANIFEST" >/tmp/verify.log 2>&1; then
log "校验成功"
exit 0
else
log "校验失败,重试 $((retry+1))/$max_retry"
retry=$((retry+1))
sleep 5
fi
done
log "校验失败,触发告警"
# 示例:发送告警
curl -X POST -H 'Content-Type: application/json' \
-d '{"msg":"MySQL备份校验失败,请检查"}' \
http://alertmanager.local/api/v1/alert
exit 1
3.2 计划任务示例#
# 每天 02:30 校验
30 2 * * * /usr/local/bin/backup_verify.sh
4) 常见排错#
- 校验失败:检查备份文件是否完整、是否被增量覆盖;重新拉取对象存储文件。
- 恢复启动失败:检查
my.cnf数据目录一致性与权限,确认chown -R mysql:mysql /var/lib/mysql。 - PITR 报错:确认
binlog范围与server_id,校验binlog文件是否完整。
5) 练习#
- 在测试环境生成一次全量备份与清单,并用
sha256sum -c验证。 - 将备份恢复到隔离实例,执行
CHECKSUM TABLE并记录结果。 - 模拟删除表后,使用
mysqlbinlog做 PITR 恢复。 - 为校验脚本添加告警并写演练报告(耗时/问题/改进项)。