大规模数据备份需分而治之:按业务单元拆分任务、用split+rsync分片传输、错峰限流调度、加校验与资源限制、统一状态跟踪及精准清理。

大规模数据备份不能靠单次 tar 或 mysqldump 一把梭——容易失败、占满磁盘、阻塞服务。核心思路是“分而治之”:按目录/数据库/表拆分任务,再用定时机制逐批执行,兼顾可靠性与资源可控性。
按业务单元拆分备份目标
避免把整个 /var/lib/mysql 或 /data 打包成一个大文件。应识别出独立性强、恢复优先级不同的模块,例如:
- 用户中心库(
user_db)、订单库(order_db)、日志表(log_202606)分别单独备份 - 静态资源目录按子路径切分:
/data/uploads/avatar/、/data/uploads/doc/各自为单位 - 每个子任务生成独立脚本,如
backup_user_db.sh、backup_avatar.sh,便于单独调试和重试
使用 split + rsync 实现大文件安全传输
当单个备份包超过 2GB,直接 scp 或挂载 NFS 易中断。推荐组合方案:
- 先用
tar -cf - /path | split -b 500M - backup_part_拆成固定大小片段 - 用
rsync --partial --progress分别上传各 part 文件,支持断点续传 - 接收端用
cat backup_part_* > full.tar合并,再tar -xf full.tar - 所有操作加
set -e和校验步骤(如sha256sum对比前后哈希)
定时调度需错峰+限流
10 个拆分脚本若同时在凌晨 2 点触发,I/O 和 CPU 就会打满。正确做法是:
- 在
crontab -e中错开时间,例如:每 15 分钟启动一个 0 2 * * * /opt/backup/backup_user_db.sh15 2 * * * /opt/backup/backup_order_db.sh30 2 * * * /opt/backup/backup_avatar.sh- 关键脚本开头加资源限制:
ionice -c2 -n7 nice -n19 ./backup_xxx.sh,降低 I/O 和 CPU 优先级
状态跟踪与自动清理策略
拆分后脚本数量变多,必须统一管理生命周期:
- 每个脚本结尾写入时间戳到统一日志:
echo "$(date +%s) backup_user_db OK" >> /var/log/backup/status.log - 单独跑一个
cleanup.sh,每天凌晨 4 点扫描status.log,对超 7 天未成功更新的模块发告警 - 备份文件名强制带标识:
user_db_20260609_0200_full.tar.gz,删除逻辑按前缀匹配,不误删其他任务 - 旧备份清理不用
find -mtime +7,改用find ... -name 'user_db_*' -mtime +7,精准作用于本模块











