首页/数据/备份与容灾速查/备份脚本通用健壮性模式

备份脚本通用健壮性模式

自研备份脚本的通用骨架:严格模式、独立日志、锁防重入、结果校验与统一告警出口,适用于 rsync、tar、mysqldump 等各类工具。

备份与容灾速查数据更新于 2026-10-13

备份脚本的通用健壮性模式

自研备份脚本的差别通常不在备份命令,而在周边:是否严格错误处理、是否有独立日志、是否防重入、产物是否带校验、失败是否有人知道。把这五件事做成固定骨架,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 防重入任务串行执行任务叠加,产物互相覆盖
独立日志保留执行痕迹与耗时失败无迹可查,只能反复猜测原因
校验文件验证副本完整性损坏副本被当可用备份,恢复当天才暴露
统一告警出口失败可见备份长期静默失败而无人知晓
统一约定:非零退出视为失败并触发告警;产物必须带校验文件;日志与备份同级管理保留周期,避免日志本身把磁盘占满。
失败留下的半成品要与正式产物严格区分:写入临时文件名、校验通过后再改名,避免下游把未完成文件当作有效备份。

易错点

  • 脚本以 root 处理所有路径:权限过大,应按最小权限运行并限制处理目录范围
  • 失败留下的半成品与正式产物混放:下游程序误当有效备份使用,恢复时才发现内容不完整
  • 没有唯一的告警出口:每台机器各自写日志,失败无人汇总,问题被长期忽略
  • 日志无限增长:长期运行后日志占满磁盘,反过来让备份任务失败

数据来源与参考

  • Bash 手册(set -euo pipefail、exec)
  • man 1 flock
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌