真正可用的备份需确保可验证、可恢复、可追溯,核心是脚本健壮性、调度可靠、日志可观测、数据分级处理及恢复闭环验证。

保障生产数据高可用,定时备份不能只“跑起来”,而要确保每次备份都可验证、可恢复、可追溯。核心不是“有没有备份”,而是“出事时敢不敢直接还原”。关键落在脚本健壮性、调度可靠性、日志可观测性、数据分级处理和恢复闭环验证上。
写一个真正能跑通的备份脚本
脚本必须脱离终端环境独立运行,不依赖当前 shell 配置或路径:
- 用绝对路径调用命令,如
/bin/tar、/usr/bin/rsync、/usr/bin/find - 时间戳精确到分钟:
date +%Y%m%d_%H%M,避免同名覆盖 - 目标目录用
mkdir -p /backup确保存在,不因路径缺失中断 - 备份后立即校验:
tar -tzf "$BACKUP_DIR/$FILENAME" >/dev/null 2>&1 || { echo "Corrupted backup!"; exit 1; } - 自动清理旧备份:
find /backup -name "*.tar.gz" -mtime +7 -delete,防磁盘满
用 crontab 定时但不踩坑
crontab 不继承你的 PATH 和 HOME,照搬终端命令大概率静默失败:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 用
crontab -e编辑当前用户任务,避免 sudo 权限干扰 - 每行开头显式声明环境变量:
PATH=/usr/local/bin:/usr/bin:/bin HOME=/home/youruser - 时间格式严格为「分 时 日 月 周」,例如
0 2 * * * /home/user/backup.sh表示每天凌晨 2 点 - 务必使用脚本的绝对路径,crontab 不会 cd 到任何目录
- 末尾加日志重定向:
>> /var/log/backup.log 2>&1
按数据类型分级备份,不一刀切
系统配置、用户数据、数据库、日志的变更频率与恢复要求差异极大,需区别对待:
-
系统与配置:用
rsync -a /etc /boot+etckeeper跟踪每次修改,保留版本历史 - 业务数据:每日增量 rsync 到另一台机器,硬链接快照保留 7 天;小范围高敏目录(如密钥、证书)可配 inotify 实时触发
-
MySQL/PostgreSQL:全量用
mysqldump --single-transaction,增量靠 binlog 或 WAL 归档;备份后执行mysqlcheck或pg_isready验证连通性 -
日志类数据:不备份原始日志,而是定期归档压缩(如
logrotate配合gzip),保留最近 30 天即可
必须做恢复测试,否则等于没备
备份文件存在 ≠ 数据可用。每月至少一次在隔离环境还原完整链路:
- 选一个随机日期的增量备份,从最近全量开始逐级还原
- 检查关键路径权限、文件完整性(
sha256sum对比)、数据库表记录数是否一致 - 对 MySQL 执行
SELECT COUNT(*) FROM user;类简单查询,确认服务可读 - 记录每次测试结果,失败项立即回溯脚本或存储链路问题
- 建议用
restic或borg这类自带restic check/borg check的工具,降低验证成本

















