定时数据备份与同步

定时备份和同步数据

一、定时备份的价值

自动化备份减少忘记备份的风险、定期备份确保数据安全、备份版本历史支持恢复到任意时间点

自动化免遗忘
定时任务自动执行备份流程,无需人工干预,彻底消除"忘记备份"的风险,确保备份策略被严格执行。
数据安全保障
定期(每日/每周)自动备份关键数据,降低因硬件故障、误操作、勒索软件等意外导致的数据丢失风险。
版本历史恢复
保留多时间点备份版本,支持回滚到任意历史状态。当发现数据损坏或错误修改时,可快速恢复到正常版本。
最佳实践:建议采用"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.gzfull-project-20260508.tar.gz每周全量备份归档
incr-{project}-{YYYYMMDD}.rsyncincr-project-20260508.rsync每日增量备份目录
db-{type}-{YYYYMMDD}.sql.gzdb-mysql-20260508.sql.gz数据库备份文件
config-{YYYYMMDD}.bakconfig-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. 存储空间监控和清理策略不可忽视,避免备份写满磁盘导致服务故障。