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状态