6.9.3 备份与恢复自动化方案

在MySQL运维中,备份与恢复自动化是保障数据安全与业务连续性的核心能力。本节从方案设计、工具选型、流程编排、演练与校验等维度,给出可落地的自动化实践,并补充安装、命令示例、排错与练习。

目标与原则#

  • RPO/RTO明确:根据业务等级制定恢复点与恢复时间目标,区分全量、增量、日志级别策略。
  • 可验证性:所有备份必须可恢复,定期自动化校验。
  • 最小化影响:在线备份减少对主库性能影响,尽量在从库执行。
  • 安全与合规:备份数据加密、权限最小化、合规留存。

原理草图与架构#

文章图片

自动化备份方案设计#

备份类型组合#

  • 全量备份:定期执行,作为基线。
  • 增量备份:提高频率,降低窗口。
  • Binlog持续备份:提供时间点恢复能力(PITR)。

典型策略示例#

  • 每周全量备份 + 每日增量 + 实时binlog归档。
  • 高峰业务仅做binlog与轻量增量,低峰执行全量。

工具选型与适配#

  • 物理备份:XtraBackup(热备、速度快)。
  • 逻辑备份:mysqldump(小库/结构变更)。
  • 备份管理:自研脚本/Ansible/Airflow/Cron统一调度。
  • 存储:本地 + 远端对象存储(S3/OSS/MinIO)双副本。

安装与环境准备(示例:Ubuntu)#

# 1) 安装 XtraBackup
sudo apt update
sudo apt install -y percona-xtrabackup-80

# 2) 创建备份用户
mysql -uroot -p -e "
CREATE USER 'backup'@'%' IDENTIFIED BY 'B@ckupPass!';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT, BACKUP_ADMIN ON *.* TO 'backup'@'%';
FLUSH PRIVILEGES;
"

# 3) 准备目录与权限
sudo mkdir -p /data/backup/{full,inc,binlog}
sudo chown -R mysql:mysql /data/backup

命令解释
- percona-xtrabackup-80:物理备份工具。
- BACKUP_ADMIN:MySQL 8.0备份权限。
- /data/backup:统一备份目录,便于自动化与清理。

自动化流程编排#

流程步骤#

  1. 前置检查:主从延迟、磁盘空间、权限检查。
  2. 执行备份:优先从库;全量/增量/日志备份。
  3. 上传归档:本地校验后上传远端。
  4. 索引登记:写入备份元数据表或备份清单。
  5. 结果通知:邮件/IM/告警系统推送。

备份元数据表(示例)#

CREATE DATABASE IF NOT EXISTS ops;
CREATE TABLE IF NOT EXISTS ops.backup_meta (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  backup_type VARCHAR(20),
  start_time DATETIME,
  end_time DATETIME,
  gtid_set TEXT,
  binlog_pos VARCHAR(64),
  size_bytes BIGINT,
  checksum VARCHAR(64),
  path VARCHAR(255),
  status VARCHAR(20)
);

关键命令与脚本示例#

1) 全量备份脚本(XtraBackup)#

文件路径:/opt/ops/bin/full_backup.sh

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/data/backup/full/$(date +%F_%H%M%S)"
MYSQL_USER="backup"
MYSQL_PASS="B@ckupPass!"
SOCKET="/var/run/mysqld/mysqld.sock"

# 前置检查:磁盘空间
df -h /data | awk 'NR==2{print "Disk:",$4}'

# 执行全量备份
xtrabackup --backup \
  --user="$MYSQL_USER" --password="$MYSQL_PASS" --socket="$SOCKET" \
  --target-dir="$BACKUP_DIR"

# 准备备份
xtrabackup --prepare --target-dir="$BACKUP_DIR"

# 生成校验和
cd "$BACKUP_DIR"
sha256sum *.xbstream 2>/dev/null || true

命令解释
- --backup:执行备份阶段。
- --prepare:应用redo日志,使备份可恢复。
- --target-dir:备份目录。

2) 增量备份脚本(基于上一次全量)#

文件路径:/opt/ops/bin/inc_backup.sh

#!/usr/bin/env bash
set -euo pipefail

BASE_DIR="/data/backup/full/latest"
INC_DIR="/data/backup/inc/$(date +%F_%H%M%S)"
MYSQL_USER="backup"
MYSQL_PASS="B@ckupPass!"
SOCKET="/var/run/mysqld/mysqld.sock"

xtrabackup --backup \
  --user="$MYSQL_USER" --password="$MYSQL_PASS" --socket="$SOCKET" \
  --target-dir="$INC_DIR" --incremental-basedir="$BASE_DIR"

命令解释
- --incremental-basedir:指定增量基线目录。

3) Binlog 归档示例#

# 开启 binlog(my.cnf)
[mysqld]
log_bin = /var/lib/mysql/mysql-bin
binlog_format = ROW
server_id = 10

# 归档脚本(/opt/ops/bin/archive_binlog.sh)
#!/usr/bin/env bash
set -euo pipefail
mysql -uroot -p -e "FLUSH BINARY LOGS;"
rsync -av /var/lib/mysql/mysql-bin.* /data/backup/binlog/

命令解释
- FLUSH BINARY LOGS:切换新日志,便于归档。

4) 定时调度(Cron)#

# 每周日 02:00 全量,每天 02:00 增量
0 2 * * 0 /opt/ops/bin/full_backup.sh >> /var/log/full_backup.log 2>&1
0 2 * * 1-6 /opt/ops/bin/inc_backup.sh >> /var/log/inc_backup.log 2>&1

备份一致性与校验#

  • 一致性保证:使用事务隔离/FTWRL或XtraBackup一致性参数。
  • 自动校验
  • 校验文件hash/校验和。
  • 周期性在测试环境自动恢复验证。

示例:校验与记录元数据

CHECKSUM=$(sha256sum /data/backup/full/latest/backup-my.cnf | awk '{print $1}')
mysql -uroot -p -e "
INSERT INTO ops.backup_meta(backup_type,start_time,end_time,checksum,path,status)
VALUES('full', NOW()-INTERVAL 5 MINUTE, NOW(), '$CHECKSUM','/data/backup/full/latest','OK');
"

自动化恢复与演练#

恢复类型#

  • 全量恢复:最快恢复基线。
  • 全量+增量恢复:缩短RTO。
  • PITR恢复:基于binlog时间点恢复。

恢复步骤示例(全量+增量)#

# 1) 停止MySQL
sudo systemctl stop mysql

# 2) 清空数据目录
sudo rm -rf /var/lib/mysql/*

# 3) 恢复全量
xtrabackup --copy-back --target-dir=/data/backup/full/latest

# 4) 恢复增量(先 prepare 合并)
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full/latest
xtrabackup --prepare --target-dir=/data/backup/full/latest --incremental-dir=/data/backup/inc/2024-01-01_020000

# 5) 修复权限并启动
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql

命令解释
- --copy-back:将备份复制回数据目录。
- --apply-log-only:准备阶段合并增量。

PITR示例(时间点恢复)#

# 恢复到指定时间点
mysqlbinlog --start-datetime="2024-01-01 01:00:00" \
            --stop-datetime="2024-01-01 01:30:00" \
            /data/backup/binlog/mysql-bin.000123 \
| mysql -uroot -p

容灾与跨地域备份#

  • 异地备份:自动同步至异地存储。
  • 多版本留存:按天/周/月保留策略。

示例:同步到对象存储(MinIO)

mc alias set minio http://minio.local:9000 admin admin123
mc mb minio/mysql-backup
mc mirror /data/backup minio/mysql-backup

安全管理#

  • 备份文件加密(如AES/GPG)。
  • 访问控制与审计。
  • 备份介质与密钥分离管理。

示例:GPG加密

gpg --batch --yes --passphrase "StrongPass!" \
  -c /data/backup/full/latest/backup-my.cnf

排错与常见问题#

  1. 备份失败:权限不足
    - 现象:Access denied; you need (at least one of) the BACKUP_ADMIN
    - 解决:补充权限 GRANT BACKUP_ADMIN ...
  2. prepare失败:redo日志不完整
    - 现象:xtrabackup: Error: log file ./ib_logfile0
    - 解决:确认备份目录完整,备份中断需重做。
  3. 恢复后启动失败:权限错误
    - 现象:Permission denied
    - 解决:chown -R mysql:mysql /var/lib/mysql

运维最佳实践#

  • 备份窗口固定,避免与大促业务冲突。
  • 所有备份任务纳入监控与告警。
  • 恢复演练自动化与制度化,形成闭环。
  • 备份脚本标准化、支持参数化与多环境复用。

练习#

  1. 编写脚本实现“备份完成后自动写入 ops.backup_meta 表”。
  2. 在测试环境执行一次“全量+增量+PITR”恢复并记录耗时。
  3. 将备份文件同步到对象存储,并验证下载后校验和一致。

通过以上自动化方案,可实现备份可控、恢复可用、演练可验证的完整闭环,提升MySQL运维的安全性与可靠性。