5.8.2 备份与恢复自动化脚本

备份与恢复自动化脚本#

1. 目标与适用场景#

  • 保障业务数据可恢复、可验证、可审计,满足RPO/RTO要求
  • 适用对象:系统配置、应用发布包、日志归档、数据库与中间件数据
  • 关键指标:RPO/RTO、备份频率、保留策略、校验与演练

原理草图(备份与恢复闭环):

文章图片

2. 备份策略设计(含示例)#

  • 备份类型:全量/增量/差异
  • 备份周期:日/周/月组合
  • 保留与清理:本地+异地、版本号、生命周期管理
  • 校验策略:hash校验、恢复演练、告警通知

示例:保留策略与目录规范

# 目录规范:/data/backup/<业务>/<类型>/<日期>
/data/backup/app/config/2024-05-01/
# 文件命名:<业务>-<类型>-<时间>.tar.gz
app-config-20240501_0100.tar.gz

3. 通用备份脚本框架(含可执行示例)#

脚本路径:/usr/local/bin/backup_common.sh

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

# ===== 参数区 =====
APP_NAME="${1:-app}"
SRC_DIR="${2:-/etc}"
BACKUP_DIR="${3:-/data/backup/${APP_NAME}/config}"
RETENTION_DAYS="${4:-14}"
DATE_TAG="$(date +%F_%H%M)"
PKG="${BACKUP_DIR}/${APP_NAME}-config-${DATE_TAG}.tar.gz"
LOG_FILE="/var/log/backup_${APP_NAME}.log"

# ===== 函数区 =====
log() { echo "[$(date +'%F %T')] $*" | tee -a "$LOG_FILE"; }

precheck() {
  command -v tar >/dev/null || { log "tar not found"; exit 1; }
  [ -d "$SRC_DIR" ] || { log "SRC_DIR not exists: $SRC_DIR"; exit 1; }
  mkdir -p "$BACKUP_DIR"
}

do_backup() {
  log "Start backup $SRC_DIR -> $PKG"
  tar -czf "$PKG" -C "$SRC_DIR" .
  sha256sum "$PKG" > "${PKG}.sha256"
  log "Backup done: $PKG"
}

cleanup() {
  log "Cleanup older than ${RETENTION_DAYS} days"
  find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +${RETENTION_DAYS} -print -delete
  find "$BACKUP_DIR" -type f -name "*.sha256" -mtime +${RETENTION_DAYS} -print -delete
}

main() {
  precheck
  do_backup
  cleanup
}

main "$@"

运行与预期:

chmod +x /usr/local/bin/backup_common.sh
/usr/local/bin/backup_common.sh app /etc /data/backup/app/config 7
# 预期:生成 .tar.gz 与 .sha256,日志写入 /var/log/backup_app.log

4. 文件与配置备份脚本示例(命令解释)#

  • tar -czf:打包并gzip压缩
  • find -mtime:清理过期文件
  • sha256sum:生成校验文件

示例:独立命令链

# 1) 打包压缩
tar -czf /data/backup/app/config/app-config-$(date +%F_%H%M).tar.gz -C /etc .

# 2) 生成校验文件
sha256sum /data/backup/app/config/app-config-*.tar.gz > /data/backup/app/config/latest.sha256

# 3) 清理14天前的备份
find /data/backup/app/config -type f -name "*.tar.gz" -mtime +14 -delete

5. MySQL 备份与恢复脚本要点(安装/示例/排错)#

安装工具:

# Ubuntu/Debian
apt-get update && apt-get install -y mysql-client

# CentOS/RHEL
yum install -y mysql

逻辑备份脚本示例(mysqldump):

#!/usr/bin/env bash
set -euo pipefail
DB_HOST=127.0.0.1
DB_USER=backup
DB_PASS='Backup@123'
DB_NAME=appdb
OUT_DIR=/data/backup/mysql
DATE_TAG=$(date +%F_%H%M)

mkdir -p "$OUT_DIR"
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" \
  --single-transaction --routines --events --triggers \
  "$DB_NAME" > "${OUT_DIR}/${DB_NAME}-${DATE_TAG}.sql"

gzip -f "${OUT_DIR}/${DB_NAME}-${DATE_TAG}.sql"
sha256sum "${OUT_DIR}/${DB_NAME}-${DATE_TAG}.sql.gz" > "${OUT_DIR}/${DB_NAME}-${DATE_TAG}.sql.gz.sha256"

恢复命令示例与解释:

# 1) 解压
gunzip /data/backup/mysql/appdb-2024-05-01_0100.sql.gz

# 2) 导入
mysql -h 127.0.0.1 -u root -p -e "CREATE DATABASE IF NOT EXISTS appdb;"
mysql -h 127.0.0.1 -u root -p appdb < /data/backup/mysql/appdb-2024-05-01_0100.sql
# 预期:表结构与数据恢复完成

常见排错:
- Access denied:检查备份账号权限(至少 SELECT/LOCK TABLES/SHOW VIEW)
- mysqldump: Error 2013:加上 --single-transaction 或增大 net_read_timeout
- 恢复慢:关闭外键检查 SET FOREIGN_KEY_CHECKS=0;

6. Redis 备份与恢复脚本要点(示例/排错)#

安装工具:

# Ubuntu/Debian
apt-get install -y redis-tools

备份示例(RDB):

#!/usr/bin/env bash
set -euo pipefail
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
RDB=/var/lib/redis/dump.rdb
OUT_DIR=/data/backup/redis
DATE_TAG=$(date +%F_%H%M)

mkdir -p "$OUT_DIR"
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" BGSAVE
sleep 2
cp "$RDB" "${OUT_DIR}/dump-${DATE_TAG}.rdb"
sha256sum "${OUT_DIR}/dump-${DATE_TAG}.rdb" > "${OUT_DIR}/dump-${DATE_TAG}.rdb.sha256"

恢复步骤:

# 1) 停Redis
systemctl stop redis

# 2) 替换文件
cp /data/backup/redis/dump-2024-05-01_0100.rdb /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb

# 3) 启动
systemctl start redis
redis-cli -p 6379 ping
# 预期:返回 PONG

排错要点:
- MISCONF:检查磁盘空间与stop-writes-on-bgsave-error
- 启动失败:确认RDB权限与路径配置一致

7. Nginx/应用发布包备份要点(示例)#

备份配置与站点:

tar -czf /data/backup/nginx/nginx-$(date +%F_%H%M).tar.gz -C /etc/nginx .
sha256sum /data/backup/nginx/nginx-*.tar.gz > /data/backup/nginx/latest.sha256

恢复示例:

systemctl stop nginx
tar -xzf /data/backup/nginx/nginx-2024-05-01_0100.tar.gz -C /etc/nginx
nginx -t && systemctl start nginx

8. 备份上传与异地存储(示例/排错)#

rsync 上传示例:

rsync -avz --partial --progress /data/backup/app/ backup@10.0.0.5:/data/backup/app/
# 参数解释:
# --partial 保留未完成传输,支持断点续传

对象存储(S3/OSS)示例:

# 以AWS CLI为例
aws s3 cp /data/backup/app/config/app-config-2024-05-01_0100.tar.gz s3://backup-bucket/app/

排错:
- 连接超时:检查防火墙与端口
- 认证失败:校验密钥、权限策略

9. 恢复自动化脚本要点(含演练示例)#

恢复流程自动化脚本:

#!/usr/bin/env bash
set -euo pipefail
PKG="$1"
TARGET_DIR="/etc"
LOG="/var/log/restore.log"

echo "[restore] $(date) start restore $PKG" | tee -a "$LOG"
sha256sum -c "${PKG}.sha256"
tar -xzf "$PKG" -C "$TARGET_DIR"
echo "[restore] $(date) done" | tee -a "$LOG"

演练命令:

/usr/local/bin/restore.sh /data/backup/app/config/app-config-2024-05-01_0100.tar.gz
# 预期:校验通过,文件恢复成功

10. 监控与告警(示例)#

健康检测与告警触发:

# 检测备份文件是否生成(cron定时执行)
[ -f /data/backup/app/config/app-config-$(date +%F)_0100.tar.gz ] || \
  echo "backup missing" | mail -s "Backup Alert" ops@example.com

11. 安全与合规(示例)#

备份加密示例:

# 对称加密
gpg --batch --yes --passphrase 'StrongPass!' -c /data/backup/app/config/app-config-2024-05-01_0100.tar.gz
# 预期:生成 .gpg 文件

权限隔离:

chown -R root:backup /data/backup
chmod -R 750 /data/backup

12. 最佳实践清单 + 练习#

最佳实践:
- 备份前后自动校验
- 定期恢复演练与可用性报告
- 备份与清理任务严格分离
- 统一日志、统一告警、统一目录规范

练习:
1. 将通用备份脚本扩展为支持 --type=full|inc 参数
2. 使用 rsync 增量备份 /var/www 到异地
3. 编写一个恢复演练脚本,完成后输出OK/FAIL状态