一、定时备份的价值
自动化备份减少忘记备份的风险、定期备份确保数据安全、备份版本历史支持恢复到任意时间点
自动化免遗忘
定时任务自动执行备份流程,无需人工干预,彻底消除"忘记备份"的风险,确保备份策略被严格执行。
数据安全保障
定期(每日/每周)自动备份关键数据,降低因硬件故障、误操作、勒索软件等意外导致的数据丢失风险。
版本历史恢复
保留多时间点备份版本,支持回滚到任意历史状态。当发现数据损坏或错误修改时,可快速恢复到正常版本。
最佳实践:建议采用"3-2-1"备份原则:至少保留3份副本,使用2种不同存储介质,其中1份存储在异地。Cron定时任务可以轻松实现这一策略的自动化执行。
二、文件定时备份Cron
使用CronCreate设置每日/每周备份、备份指定目录到远程存储(Git/云存储)、备份文件的命名规范(日期+版本)、备份前后的完整性校验
2.1 每日增量备份
# 每天凌晨2点执行增量文件备份
0 2 * * * /usr/local/bin/backup-incremental.sh /data/project /backup/project
# backup-incremental.sh 脚本使用 rsync 进行增量同步
#!/bin/bash
SRC="$1"
DST="$2"
DATE=$(date +\%Y\%m\%d)
LOG="/var/log/backup-${DATE}.log"
rsync -avz --link-dest="${DST}/latest" "${SRC}/" "${DST}/${DATE}/" >> "${LOG}" 2>&1
ln -snf "${DST}/${DATE}" "${DST}/latest"
echo "[$(date)] 备份完成: ${SRC} -> ${DST}/${DATE}" >> "${LOG}"
2.2 每周全量备份
# 每周日凌晨3点执行全量备份
0 3 * * 0 /usr/local/bin/backup-full.sh /data/project /backup/project
# backup-full.sh 使用 tar 创建完整归档
#!/bin/bash
SRC="$1"
DST="$2"
DATE=$(date +\%Y\%m\%d)
BACKUP_FILE="${DST}/full-backup-${DATE}.tar.gz"
LOG="/var/log/fullbackup-${DATE}.log"
tar -czf "${BACKUP_FILE}" -C "$(dirname "${SRC}")" "$(basename "${SRC}")" >> "${LOG}" 2>&1
echo "[$(date)] 全量备份完成: ${BACKUP_FILE}" >> "${LOG}"
2.3 备份文件命名规范
统一的命名规范便于管理和检索备份文件。推荐格式:类型-项目名-日期-版本号.扩展名。
| 命名格式 | 示例 | 说明 |
| full-{project}-{YYYYMMDD}.tar.gz | full-project-20260508.tar.gz | 每周全量备份归档 |
| incr-{project}-{YYYYMMDD}.rsync | incr-project-20260508.rsync | 每日增量备份目录 |
| db-{type}-{YYYYMMDD}.sql.gz | db-mysql-20260508.sql.gz | 数据库备份文件 |
| config-{YYYYMMDD}.bak | config-20260508.bak | 配置文件备份 |
注意:rsync的 --link-dest 选项使用硬链接实现增量备份,仅变更的文件占用额外空间,极大节省存储。但需注意源和目标需在同一文件系统。
三、备份轮转与清理
保留最近N个版本自动清理旧版本、按时间规则轮转(保留每日/每周/每月备份)、备份存储空间监控和告警、清理策略的配置和管理
3.1 自动清理脚本
# 每天凌晨4点执行清理任务:保留最近30天的备份
0 4 * * * /usr/local/bin/cleanup-old-backups.sh /backup/project 30
# cleanup-old-backups.sh 清理脚本
#!/bin/bash
BACKUP_DIR="$1"
RETENTION_DAYS="$2"
LOG="/var/log/cleanup-$(date +\%Y\%m\%d).log"
# 删除超过保留天数的备份目录
find "${BACKUP_DIR}" -maxdepth 1 -type d -name "20*" -mtime +"${RETENTION_DAYS}" -exec rm -rf {} \; >> "${LOG}" 2>&1
# 删除超过保留天数的归档文件
find "${BACKUP_DIR}" -maxdepth 1 -type f -name "*.tar.gz" -mtime +"${RETENTION_DAYS}" -delete >> "${LOG}" 2>&1
echo "[$(date)] 清理完成: 删除 ${RETENTION_DAYS} 天前的旧备份" >> "${LOG}"
3.2 分层轮转策略
# 分层备份轮转策略 (Grandfather-Father-Son)
#!/bin/bash
# 每日备份保留 7 天
# 每周备份保留 4 周
# 每月备份保留 12 个月
BACKUP_DIR="/backup/project"
TODAY=$(date +\%Y\%m\%d)
DOW=$(date +\%u) # 1=周一, 7=周日
DOM=$(date +\%d) # 当月第几天
# 每日备份始终保留
rsync -avz /data/project/ "${BACKUP_DIR}/daily/${TODAY}/"
# 周日转为周备份(保留4周)
if [ "${DOW}" = "7" ]; then
cp -al "${BACKUP_DIR}/daily/${TODAY}/" "${BACKUP_DIR}/weekly/week-$(date +\%V)/"
# 清理超过4周的周备份
find "${BACKUP_DIR}/weekly" -maxdepth 1 -mtime +28 -exec rm -rf {} \;
fi
# 每月1号转为月备份(保留12个月)
if [ "${DOM}" = "01" ]; then
cp -al "${BACKUP_DIR}/daily/${TODAY}/" "${BACKUP_DIR}/monthly/$(date +\%Y\%m)/"
# 清理超过12个月的月备份
find "${BACKUP_DIR}/monthly" -maxdepth 1 -mtime +365 -exec rm -rf {} \;
fi
# 清理超过7天的每日备份
find "${BACKUP_DIR}/daily" -maxdepth 1 -mtime +7 -exec rm -rf {} \;
3.3 存储空间监控
# 每天上午9点检查备份存储空间使用率
0 9 * * * /usr/local/bin/check-backup-space.sh /backup 85
#!/bin/bash
BACKUP_DIR="$1"
THRESHOLD="$2" # 使用率阈值(百分比)
USAGE=$(df "${BACKUP_DIR}" | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "${USAGE}" -gt "${THRESHOLD}" ]; then
echo "[警告] 备份存储空间使用率已达 ${USAGE}%,超过阈值 ${THRESHOLD}%"
# 发送告警通知(邮件/短信/Webhook)
curl -s -X POST https://hooks.example.com/alert \
-H "Content-Type: application/json" \
-d "{\"message\":\"备份空间不足\",\"usage\":\"${USAGE}%\"}"
fi
建议:轮转策略应结合业务需求和数据重要性来设计。日志类数据保留7天即可,数据库和项目源码建议保留30天以上,年度归档数据应保留12个月或更久。
四、备份验证
备份完成后自动验证完整性、校验和(SHA256)比对、验证备份是否可恢复、验证失败时的告警和重试
4.1 完整性校验
# 备份完成后自动计算并记录校验和
#!/bin/bash
BACKUP_FILE="$1"
SHA_FILE="${BACKUP_FILE}.sha256"
# 计算 SHA256 校验和
sha256sum "${BACKUP_FILE}" > "${SHA_FILE}"
# 验证校验和
if sha256sum -c "${SHA_FILE}" > /dev/null 2>&1; then
echo "[OK] 校验和验证通过: ${BACKUP_FILE}"
else
echo "[ERROR] 校验和验证失败: ${BACKUP_FILE}"
# 发送告警
curl -s -X POST https://hooks.example.com/alert \
-d "{\"message\":\"备份完整性校验失败\",\"file\":\"${BACKUP_FILE}\"}"
fi
4.2 备份可恢复性验证
# 定时验证最近备份的可恢复性(每周一凌晨5点执行)
0 5 * * 1 /usr/local/bin/verify-restore.sh /backup/project /tmp/restore-test
#!/bin/bash
BACKUP_SRC="$1"
RESTORE_DST="$2"
LOG="/var/log/restore-test-$(date +\%Y\%m\%d).log"
LATEST=$(ls -td "${BACKUP_SRC}"/*/ | head -1)
echo "[$(date)] 开始恢复测试: ${LATEST} -> ${RESTORE_DST}" >> "${LOG}"
# 解压验证
tar -xzf "${LATEST}/full-backup-*.tar.gz" -C "${RESTORE_DST}" >> "${LOG}" 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]; then
echo "[PASS] 恢复测试通过" >> "${LOG}"
# 清理测试目录
rm -rf "${RESTORE_DST}"
else
echo "[FAIL] 恢复测试失败,退出码: ${EXIT_CODE}" >> "${LOG}"
# 保留测试目录供人工排查
fi
4.3 数据库备份验证
# 每日数据库备份后立即验证(每天凌晨3点30分)
30 3 * * * /usr/local/bin/verify-db-backup.sh
#!/bin/bash
BACKUP_DIR="/backup/mysql"
DATE=$(date +\%Y\%m\%d -d "yesterday")
BACKUP_FILE="${BACKUP_DIR}/mysql-${DATE}.sql.gz"
LOG="/var/log/db-verify-${DATE}.log"
# 解压并检查 SQL 语法
gunzip -c "${BACKUP_FILE}" | mysqlcheck --check --all-databases >> "${LOG}" 2>&1
if [ $? -eq 0 ]; then
echo "[$(date)] 数据库备份验证通过" >> "${LOG}"
else
echo "[$(date)] 数据库备份验证失败,触发重试备份" >> "${LOG}"
# 触发重试备份
/usr/local/bin/backup-mysql.sh
fi
关键原则:未经验证的备份等于没有备份。校验和验证可检测文件损坏,恢复测试可验证备份的可用性。建议将验证结果通过Cron任务发送到集中监控平台或通知渠道。
五、增量备份 vs 全量备份
全量备份:完整拷贝数据(适合首次/每周)、增量备份:只备份变更的数据(适合每日)、差异备份:自上次全量以来的所有变更、备份策略的组合选择
5.1 三种备份方式对比
| 备份类型 | 备份内容 | 存储空间 | 恢复速度 | 推荐频率 |
| 全量备份 | 所有数据的完整副本 | 大(完整拷贝) | 最快(只需一个文件) | 每周一次 |
| 增量备份 | 自上次任何备份以来的变更 | 最小(仅变更块) | 最慢(需逐层恢复) | 每日一次 |
| 差异备份 | 自上次全量备份以来的变更 | 中等(累积变更) | 中等(全量+最新差异) | 每2-3天一次 |
5.2 组合策略推荐
# 每周日23:00 全量备份
0 23 * * 0 /usr/local/bin/backup-full.sh /data/project /backup/project
# 周一至周六 23:00 增量备份
0 23 * * 1-6 /usr/local/bin/backup-incr.sh /data/project /backup/project
# 每天23:30 清理和验证
30 23 * * * /usr/local/bin/cleanup-and-verify.sh /backup/project
场景一:个人项目
每周全量 + 每日增量备份到云存储。成本低、自动化高,Git仓库天然支持版本回溯。
场景二:生产数据库
每日全量 + 每小时WAL归档。支持时间点恢复(PITR),RPO控制在1小时以内。
场景三:重要文档
实时同步(Syncthing/Nextcloud) + 每日快照。兼顾实时性和历史版本保护。
核心要点总结:
1. 全量备份是基础,增量备份节省空间,两者结合是最优策略。
2. 备份策略需平衡 RPO(恢复点目标)和 RTO(恢复时间目标)。
3. 定期验证备份的可恢复性比备份本身更重要。
4. 自动化任务(Cron)是保障备份策略持续执行的关键。
5. 存储空间监控和清理策略不可忽视,避免备份写满磁盘导致服务故障。