备份脚本完整规范
核心概念 生产环境备份脚本完整规范,涵盖数据库备份、文件备份、日志轮转、告警通知。 适用于运维、AIOps、私有云、MySQL/ClickHouse/文件系统备份,分安全、可靠性、可观测、容错、恢复、合规六大核心要点
1. 前置安全规范(最高优先级,防止删库、泄露、越权)
- 最小权限运行
- 禁止 root 直接跑脚本,创建专用备份用户
backup,仅授予只读权限; - MySQL 仅分配
SELECT, LOCK TABLES, RELOAD,无 drop/alter;文件目录仅读权限; - 密钥、数据库密码禁止明文硬编码写入脚本。
- 敏感信息加密存储
- 账号密码、AK/SK、数据库凭证存入独立加密配置文件(
.env+ 权限 600); - 配置文件
chmod 600 .backup.env,仅脚本所有者可读; - 禁止打印密码、密钥到日志、标准输出。
- 高危操作防护
- 所有删除、清理旧备份逻辑增加确认判断;路径变量强制校验,防止路径注入;
- 禁止
rm -rf ${DIR}/*裸写,先判断目录非空、变量不为空; - 备份前不自动清理旧文件,保留多副本,设置自动过期删除而非即时清理。
- 禁止命令注入拼接系统命令、SQL 语句时,变量全部双引号包裹;使用
subprocess时采用列表传参,禁用shell=True。
2. 备份逻辑可靠性(保证备份文件可用、完整)
2.1. 前置校验,不盲目执行备份
- 校验磁盘剩余空间:预留至少单份备份 1.5 倍容量,空间不足直接退出并告警;
- 校验源服务状态:MySQL、ClickHouse、业务进程存活检测,数据库离线直接终止;
- 校验目标存储挂载:NAS、对象存储、异地磁盘挂载状态,挂载失效告警;
- 校验依赖工具:mysqldump、tar、rclone、xz、pigz 是否安装。
2.2. 一致性备份(核心,避免损坏备份)
- 数据库
- InnoDB:使用
mysqldump --single-transaction实现热备,避免锁表; - 大数据量库:分库分表备份,单文件不超过 20G,防止压缩失败;
- 支持二进制日志 binlog 增量备份,实现时间点恢复。
- 文件系统
- 业务运行目录:临时创建快照/文件锁,规避备份中文件读写截断;
- 日志、动态写入文件排除或延迟备份。
- 压缩优化
- 并行压缩 pigz/xz,兼顾速度与压缩率;
- 大文件分卷压缩,避免单文件损坏全部失效;
- 压缩完成后强制校验完整性(md5sum/sha256sum)。
2.3. 多副本、异地分层存储(防机器磁盘损坏)
三层存储策略:
- 本地磁盘临时备份(当天快速恢复);
- 同机房 NAS/共享存储(短期留存 7~30 天);
- 跨机房对象存储/异地服务器(长期归档,3~12 个月);
- 本地与异地双上传,任一存储上传失败触发告警。
2.4. 自动过期清理,控制存储成本
- 分层保留策略示例:本地7天、NAS30天、异地归档90天;
- 清理逻辑先校验备份文件 md5 合法,仅删除完整备份;
- 清理操作记录日志,输出被删除文件名称,方便追溯。
3. 容错与异常处理(脚本不能静默失败)
- 严格捕获所有错误
Shell 脚本:set -euo pipefail,任意命令失败直接终止;
Python 脚本:全流程 try-except 捕获异常,区分空间不足、连接失败、压缩失败。 - 超时控制,防止死锁卡死
- 数据库导出、上传对象存储设置 timeout;
- rclone/scp 传输超时强制杀死进程,释放句柄,避免僵尸进程。
- 临时文件自动回收备份产生的临时 sql、缓存文件写入
/tmp,脚本结束/异常退出自动清理;
使用trap捕获 SIGINT/SIGTERM 信号,异常时清理残留文件。 - 断点续传
上传至 COS/OSS/NAS 使用 rclone/rsync 断点续传,网络中断后无需全量重传。
4. 可观测性:日志、告警、审计(生产必备,出问题可追溯)
4.1. 标准化日志
- 独立日志文件,按日期切割,日志留存至少 90 天;
- 每条日志包含时间戳、执行步骤、耗时、文件大小、md5 值;
- 区分 INFO/WARN/ERROR 日志级别;
- 禁止打印敏感凭证,只打印文件名、存储路径。
4.2. 全链路告警机制(失败必须主动通知)
任意异常触发告警渠道(多渠道冗余):
- 企业微信/钉钉机器人;
- 邮件;
- AIOps 监控平台上报指标;
告警触发场景:
- 脚本执行失败、导出报错;
- 磁盘空间不足;
- 异地上传失败;
- 备份文件 md5 校验不匹配(文件损坏);
- 备份耗时远超历史平均值(业务异常)。
4.3. 输出监控指标(对接监控面板)
输出关键指标供 Prometheus/监控采集:
- 本次备份耗时;
- 备份文件大小;
- 当日备份是否成功(0失败/1成功);
- 本地/异地存储剩余容量。
5. 恢复验证(绝大多数脚本缺失,生产致命短板)
只备份、不校验恢复=无效备份
- 自动完整性校验
每次备份完成生成 md5 校验文件,下次执行脚本自动校验历史备份包哈希; - 定期自动恢复测试
每周/每月定时拉取一份旧备份,解压导入测试库,验证表数量、数据行数; - 输出标准化恢复文档
日志内打印完整恢复命令:解压、导入数据库、挂载路径、binlog 恢复步骤; - 保留备份目录结构,恢复时目录层级与原环境一致。
6. 定时、并发、运维规范
- 定时任务管控
crontab 增加锁文件/var/lock/backup.lock,防止上一轮未完成,并发重复执行;
避开业务高峰,凌晨低负载时段执行; - 版本与变更管理
脚本纳入 git 管理,每次修改记录变更说明、修改人;
线上脚本只读权限,禁止随意编辑; - 输出标准化命名规范
备份文件名携带:业务名_库名_日期_时分_备份类型(全量/增量).sql.xz
示例:tax_goldenship_mysql_20260705_0200_full.sql.xz - 增量+全量搭配
每日增量 binlog,每周一次全量备份,兼顾备份速度与恢复效率。
7. Python 备份脚本额外注意点(你常用subprocess)
- 使用
subprocess.run加 timeout 参数,防止阻塞; shell=False列表传参,杜绝注入;- Popen 进程必须 wait() 回收,避免僵尸进程;
- 捕获
CalledProcessError/TimeoutExpired区分报错类型; - 文件操作全部使用
with open()上下文自动释放句柄; - 上传大文件使用流式读写,不一次性加载全文件到内存。
8. 极简生产脚本检查清单(上线前逐项核对)
- 无明文账号密码,配置文件权限600
- 运行用户为低权限backup,非root
- 磁盘空间前置校验,不足直接告警退出
- 备份完成生成md5校验文件
- 本地+异地双副本存储
- 锁文件防止并发执行
- 超时控制,异常自动清理临时文件
- 完整日志记录,分级输出
- 失败自动钉钉/企业微信告警
- 定期自动恢复校验机制
- 分层过期自动清理策略
- 脚本纳入版本管理,禁止随意修改
- 所有外部命令调用增加异常捕获
关联文档