核心是科学选择备份时间窗口并实施资源管控:需结合业务负载曲线避开高峰,分模块错峰执行全量与增量备份,通过nice/ionice限频、timeout防卡死、rsync限速等手段控制资源占用,并实测验证对系统影响。

核心是避开业务高峰、控制资源占用、分阶段释放压力,而不是单纯选个“没人用的时候”就完事。
选对时间窗口,不是只看钟表
不能只盯着“晚上10点到早上6点”这种固定时段。要结合实际业务曲线来定:
- 查监控系统里的CPU、磁盘IO、网络流量和数据库连接数,找出连续2小时以上负载低于40%的时段
- 避开定时报表生成、批量对账、日终结算等内部作业时间(哪怕在凌晨)
- 对7×24系统,可按业务模块错峰:比如订单库周一备份,用户库周二,库存库周三,避免全量并发
用增量+调度优先级降低单次压力
全量备份一次吃掉30% IO?那就拆开走:
- 每周日凌晨做一次全量,其余每天只跑增量备份(mysqldump --single-transaction --where="update_time > '2026-06-09 03:00:00')
- 在crontab里给关键库加高优标识,例如用nice -n 5降级非核心任务,或用ionice -c2 -n7限制磁盘抢占
- 用/etc/cron.d/目录分文件管理,比如backup-critical和backup-log,便于单独启停
脚本里加资源守门员
定时任务不是扔进crontab就放心了,得让它自己会看脸色:
- 开头加判断:if [ $(uptime | awk '{print $10}' | sed 's/,//') -gt 3 ]; then exit; fi(系统平均负载超3就跳过)
- 备份命令后接timeout 3600,防卡死;加2>&1 >> /var/log/backup.log留痕
- 用rsync --bwlimit=2000限速上传,避免占满带宽影响线上服务
验证比设置更重要
上线前必须实测三件事:
- 手动执行一遍备份脚本,用iostat -x 1 30观察磁盘util是否持续高于85%
- 在业务高峰期模拟触发一次,看应用响应时间有无明显波动(>100ms)
- 检查/var/log/cron和脚本日志,确认每次是否真按预期时间启动、完成、无报错退出











