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) 练习#

  1. 在测试环境生成一次全量备份与清单,并用 sha256sum -c 验证。
  2. 将备份恢复到隔离实例,执行 CHECKSUM TABLE 并记录结果。
  3. 模拟删除表后,使用 mysqlbinlog 做 PITR 恢复。
  4. 为校验脚本添加告警并写演练报告(耗时/问题/改进项)。