备份脚本的通用健壮性模式
自研备份脚本的差别通常不在备份命令,而在周边:是否严格错误处理、是否有独立日志、是否防重入、产物是否带校验、失败是否有人知道。把这五件事做成固定骨架,rsync、tar、mysqldump 都能套用,脚本质量就不再取决于写脚本那天的状态。
基本信息
| 适用平台 | Bash 脚本(Linux / macOS / WSL),适用于各类备份工具封装 |
|---|---|
| 严格模式 | set -euo pipefail:未定义变量、管道中任一环节失败都会让脚本退出 |
| 锁与日志 | flock 防重入;日志按日期落盘并与备份同级保留 |
| 产物要求 | 备份文件必须附带校验文件,并记录体积与耗时 |
典型使用场景
- 统一多台机器的备份脚本:同一骨架复制到不同环境,只改参数
- 关键目录每日打包:打包后生成 sha256 并核对体积
- 数据库逻辑备份封装:导出后校验文件非空并记录结束位点
- 异地同步封装:同步完成后核对目标端文件数与体积
- 告警统一出口:所有脚本以同一格式上报成功或失败,便于集中监控
骨架模式(示例)
骨架模式(示例)
#!/usr/bin/env bash
set -euo pipefail
# 独立锁:手工执行与定时任务都受保护
exec 9>/var/lock/mybackup.lock
flock -n 9 || { echo "已有任务在运行"; exit 0; }
# 日志按日期落盘,标准输出与错误都进日志
LOG=/var/log/mybackup-$(date +%F).log
exec >>"$LOG" 2>&1
run() { echo "== $(date -Is) $* =="; "$@"; }
run tar -czf /backup/data-$(date +%F).tar.gz -C /srv data
# 产物校验:生成校验值并确认文件非空
run sha256sum /backup/data-$(date +%F).tar.gz > /backup/data-$(date +%F).tar.gz.sha256
test -s /backup/data-$(date +%F).tar.gz
echo "DONE $(date -Is)"骨架要素与失败后果
| 要素 | 作用 | 缺失后果 |
|---|---|---|
| set -euo pipefail | 任一步失败立即退出 | 中间步骤失败被忽略,产出残缺备份仍报成功 |
| flock 防重入 | 任务串行执行 | 任务叠加,产物互相覆盖 |
| 独立日志 | 保留执行痕迹与耗时 | 失败无迹可查,只能反复猜测原因 |
| 校验文件 | 验证副本完整性 | 损坏副本被当可用备份,恢复当天才暴露 |
| 统一告警出口 | 失败可见 | 备份长期静默失败而无人知晓 |
统一约定:非零退出视为失败并触发告警;产物必须带校验文件;日志与备份同级管理保留周期,避免日志本身把磁盘占满。
失败留下的半成品要与正式产物严格区分:写入临时文件名、校验通过后再改名,避免下游把未完成文件当作有效备份。