Shell

备份脚本完整规范

·8 分钟阅读·3036 字

备份脚本完整规范 的详细笔记

📋 目录

备份脚本完整规范

核心概念 生产环境备份脚本完整规范,涵盖数据库备份、文件备份、日志轮转、告警通知。 适用于运维、AIOps、私有云、MySQL/ClickHouse/文件系统备份,分安全、可靠性、可观测、容错、恢复、合规六大核心要点

1. 前置安全规范(最高优先级,防止删库、泄露、越权)

  1. 最小权限运行
  • 禁止 root 直接跑脚本,创建专用备份用户 backup,仅授予只读权限;
  • MySQL 仅分配 SELECT, LOCK TABLES, RELOAD,无 drop/alter;文件目录仅读权限;
  • 密钥、数据库密码禁止明文硬编码写入脚本。
  1. 敏感信息加密存储
  • 账号密码、AK/SK、数据库凭证存入独立加密配置文件(.env + 权限 600);
  • 配置文件 chmod 600 .backup.env,仅脚本所有者可读;
  • 禁止打印密码、密钥到日志、标准输出。
  1. 高危操作防护
  • 所有删除、清理旧备份逻辑增加确认判断;路径变量强制校验,防止路径注入;
  • 禁止 rm -rf ${DIR}/* 裸写,先判断目录非空、变量不为空;
  • 备份前不自动清理旧文件,保留多副本,设置自动过期删除而非即时清理。
  1. 禁止命令注入拼接系统命令、SQL 语句时,变量全部双引号包裹;使用 subprocess 时采用列表传参,禁用 shell=True

2. 备份逻辑可靠性(保证备份文件可用、完整)

2.1. 前置校验,不盲目执行备份

  • 校验磁盘剩余空间:预留至少单份备份 1.5 倍容量,空间不足直接退出并告警;
  • 校验源服务状态:MySQL、ClickHouse、业务进程存活检测,数据库离线直接终止;
  • 校验目标存储挂载:NAS、对象存储、异地磁盘挂载状态,挂载失效告警;
  • 校验依赖工具:mysqldump、tar、rclone、xz、pigz 是否安装。

2.2. 一致性备份(核心,避免损坏备份)

  1. 数据库
  • InnoDB:使用 mysqldump --single-transaction 实现热备,避免锁表;
  • 大数据量库:分库分表备份,单文件不超过 20G,防止压缩失败;
  • 支持二进制日志 binlog 增量备份,实现时间点恢复。
  1. 文件系统
  • 业务运行目录:临时创建快照/文件锁,规避备份中文件读写截断;
  • 日志、动态写入文件排除或延迟备份。
  1. 压缩优化
  • 并行压缩 pigz/xz,兼顾速度与压缩率;
  • 大文件分卷压缩,避免单文件损坏全部失效;
  • 压缩完成后强制校验完整性(md5sum/sha256sum)。

2.3. 多副本、异地分层存储(防机器磁盘损坏)

三层存储策略:

  1. 本地磁盘临时备份(当天快速恢复);
  2. 同机房 NAS/共享存储(短期留存 7~30 天);
  3. 跨机房对象存储/异地服务器(长期归档,3~12 个月);
  • 本地与异地双上传,任一存储上传失败触发告警。

2.4. 自动过期清理,控制存储成本

  • 分层保留策略示例:本地7天、NAS30天、异地归档90天;
  • 清理逻辑先校验备份文件 md5 合法,仅删除完整备份;
  • 清理操作记录日志,输出被删除文件名称,方便追溯。

3. 容错与异常处理(脚本不能静默失败)

  1. 严格捕获所有错误
    Shell 脚本:set -euo pipefail,任意命令失败直接终止;
    Python 脚本:全流程 try-except 捕获异常,区分空间不足、连接失败、压缩失败。
  2. 超时控制,防止死锁卡死
  • 数据库导出、上传对象存储设置 timeout;
  • rclone/scp 传输超时强制杀死进程,释放句柄,避免僵尸进程。
  1. 临时文件自动回收备份产生的临时 sql、缓存文件写入 /tmp,脚本结束/异常退出自动清理;
    使用 trap 捕获 SIGINT/SIGTERM 信号,异常时清理残留文件。
  2. 断点续传
    上传至 COS/OSS/NAS 使用 rclone/rsync 断点续传,网络中断后无需全量重传。

4. 可观测性:日志、告警、审计(生产必备,出问题可追溯)

4.1. 标准化日志

  • 独立日志文件,按日期切割,日志留存至少 90 天;
  • 每条日志包含时间戳、执行步骤、耗时、文件大小、md5 值;
  • 区分 INFO/WARN/ERROR 日志级别;
  • 禁止打印敏感凭证,只打印文件名、存储路径。

4.2. 全链路告警机制(失败必须主动通知)

任意异常触发告警渠道(多渠道冗余):

  1. 企业微信/钉钉机器人;
  2. 邮件;
  3. AIOps 监控平台上报指标;
    告警触发场景:
  • 脚本执行失败、导出报错;
  • 磁盘空间不足;
  • 异地上传失败;
  • 备份文件 md5 校验不匹配(文件损坏);
  • 备份耗时远超历史平均值(业务异常)。

4.3. 输出监控指标(对接监控面板)

输出关键指标供 Prometheus/监控采集:

  • 本次备份耗时;
  • 备份文件大小;
  • 当日备份是否成功(0失败/1成功);
  • 本地/异地存储剩余容量。

5. 恢复验证(绝大多数脚本缺失,生产致命短板)

只备份、不校验恢复=无效备份

  1. 自动完整性校验
    每次备份完成生成 md5 校验文件,下次执行脚本自动校验历史备份包哈希;
  2. 定期自动恢复测试
    每周/每月定时拉取一份旧备份,解压导入测试库,验证表数量、数据行数;
  3. 输出标准化恢复文档
    日志内打印完整恢复命令:解压、导入数据库、挂载路径、binlog 恢复步骤;
  4. 保留备份目录结构,恢复时目录层级与原环境一致。

6. 定时、并发、运维规范

  1. 定时任务管控
    crontab 增加锁文件 /var/lock/backup.lock,防止上一轮未完成,并发重复执行;
    避开业务高峰,凌晨低负载时段执行;
  2. 版本与变更管理
    脚本纳入 git 管理,每次修改记录变更说明、修改人;
    线上脚本只读权限,禁止随意编辑;
  3. 输出标准化命名规范
    备份文件名携带:业务名_库名_日期_时分_备份类型(全量/增量).sql.xz
    示例:tax_goldenship_mysql_20260705_0200_full.sql.xz
  4. 增量+全量搭配
    每日增量 binlog,每周一次全量备份,兼顾备份速度与恢复效率。

7. Python 备份脚本额外注意点(你常用subprocess)

  1. 使用 subprocess.run 加 timeout 参数,防止阻塞;
  2. shell=False 列表传参,杜绝注入;
  3. Popen 进程必须 wait() 回收,避免僵尸进程;
  4. 捕获 CalledProcessError/TimeoutExpired 区分报错类型;
  5. 文件操作全部使用 with open() 上下文自动释放句柄;
  6. 上传大文件使用流式读写,不一次性加载全文件到内存。

8. 极简生产脚本检查清单(上线前逐项核对)

  • 无明文账号密码,配置文件权限600
  • 运行用户为低权限backup,非root
  • 磁盘空间前置校验,不足直接告警退出
  • 备份完成生成md5校验文件
  • 本地+异地双副本存储
  • 锁文件防止并发执行
  • 超时控制,异常自动清理临时文件
  • 完整日志记录,分级输出
  • 失败自动钉钉/企业微信告警
  • 定期自动恢复校验机制
  • 分层过期自动清理策略
  • 脚本纳入版本管理,禁止随意修改
  • 所有外部命令调用增加异常捕获

关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro