如何写增量备份脚本

wen 实用脚本 29

从零构建高效自动化数据保护方案

目录导读

  1. 增量备份的核心概念与价值
  2. 主流备份脚本技术选型对比
  3. 实战:编写可复用的增量备份脚本
    • 基于rsync的增量同步脚本
    • 基于tar的增量归档脚本
    • 数据库增量备份脚本示例
  4. 脚本关键逻辑与错误处理
  5. 自动化调度与监控集成
  6. 常见问题与优化技巧
  7. Q&A:解决增量备份脚本的五大痛点

增量备份的核心概念与价值

增量备份(Incremental Backup)指的是仅备份自上次全量备份或增量备份后发生变更的数据,相比全量备份,它显著节省存储空间与传输时间,是生产环境中高频数据保护的标配方案。

如何写增量备份脚本

典型场景案例

  • 某Python后端应用每日产生5GB日志文件,若全量备份需50GB/天,改用增量备份后日均增量仅200MB,存储成本降低96%。

核心机制:通过比对文件元数据(如修改时间、校验和)或依赖数据库的归档日志(如MySQL binlog)识别变化数据。


主流备份脚本技术选型对比

工具 适用场景 增量机制 优缺点
rsync 文件级差异同步 基于时间戳/checksum 高效但需预留目标端路径
tar + gzip 归档型增量 依赖快照文件列表 简单但恢复需全量+增量链
rdiff-backup 远程增量同步 反向差异算法 自动保留历史版本
数据库专用工具 MySQL/MariaDB等 binlog位置记录 恢复粒度细但依赖主从架构

选择建议:普通文件服务器用rsync;需长期保留历史版本用rdiff-backup;数据库场景优先使用原生工具(如mysqldump+binlog)。


实战:编写可复用的增量备份脚本

1 基于rsync的增量同步脚本

#!/bin/bash
# 增量备份配置
SOURCE="/data/app_logs"
BACKUP_DIR="/backup/incremental"
BASE_NAME="daily_backup"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/backup_${DATE}.log"
# 创建全量备份锚点(首次需手动执行一次)
if [ ! -d "${BACKUP_DIR}/base" ]; then
    mkdir -p "${BACKUP_DIR}/base"
    rsync -av --delete "${SOURCE}/" "${BACKUP_DIR}/base/" >> "${LOG_FILE}" 2>&1
    echo "全量备份完成" >> "${LOG_FILE}"
    exit 0
fi
# 增量备份:基于link-dest对比
LINK_DEST="${BACKUP_DIR}/base"
rsync -av --delete --link-dest="${LINK_DEST}" "${SOURCE}/" "${BACKUP_DIR}/${BASE_NAME}_${DATE}/" >> "${LOG_FILE}" 2>&1
if [ $? -eq 0 ]; then
    echo "增量备份成功:${BACKUP_DIR}/${BASE_NAME}_${DATE}" >> "${LOG_FILE}"
else
    echo "增量备份失败,检查日志:${LOG_FILE}" >&2
    exit 1
fi

关键逻辑--link-dest利用硬链接复用未变更文件,仅传输差异部分,无需重复占用磁盘。

2 基于tar的增量归档脚本

#!/bin/bash
# 依赖GNU tar的增量模式
BACKUP_DIR="/backup/tar_incremental"
SNAPSHOT_FILE="${BACKUP_DIR}/snapshot.inc"
DATA_DIR="/var/www/html"
# 首次全量
if [ ! -f "${SNAPSHOT_FILE}" ]; then
    tar -cvf "${BACKUP_DIR}/full_$(date +%Y%m%d).tar" --listed-incremental="${SNAPSHOT_FILE}" "${DATA_DIR}" 
    exit 0
fi
# 增量
tar -cvf "${BACKUP_DIR}/inc_$(date +%Y%m%d_%H%M%S).tar" --listed-incremental="${SNAPSHOT_FILE}" "${DATA_DIR}" > /dev/null 2>&1

注意:恢复时必须按“全量→增量1→增量2...”顺序解压,且snapshot文件需妥善保存。

3 数据库增量备份脚本(MySQL binlog示例)

#!/bin/bash
# 前提:启用binlog并记录position
MYSQL_USER="backup"
MYSQL_PASS="your_password"
BACKUP_DIR="/backup/mysql_inc"
BINLOG_DIR="/var/log/mysql"
INC_FILE="${BACKUP_DIR}/inc_$(date +%Y%m%d).sql"
# 记录当前binlog位置
mysql -u${MYSQL_USER} -p${MYSQL_PASS} -e "SHOW MASTER STATUS;" > "${BACKUP_DIR}/master_info.txt"
# 解析并备份新生成的binlog
CURRENT_LOG=$(tail -1 ${BACKUP_DIR}/master_info.txt | awk '{print $1}')
mysqlbinlog --start-datetime="$(date -d '1 day ago' '+%Y-%m-%d %H:%M:%S')" "${BINLOG_DIR}/${CURRENT_LOG}" > "${INC_FILE}" 2>/dev/null

优化点:通过--start-position从上次记录位置开始截取增量日志。


脚本关键逻辑与错误处理

防护层 实现方案
断点续传 rsync的--partial参数保留未完成文件,配合--append追加传输
锁机制 使用flock防止并发执行:exec 200>/var/lock/backup.lock; flock -n 200
校验对齐 备份后执行md5sum --check 验证完整性,对比源文件与备份文件的校验和
通知机制 失败时通过curl发往企业微信/钉钉Bot:curl -X POST -d '{"msg":"备份失败"}'

示例错误处理代码

# 在rsync脚本中加入重试逻辑
RETRY=3
for i in $(seq 1 ${RETRY}); do
    rsync -av --partial --append ${SOURCE}/ ${DEST}/ >> ${LOG_FILE} 2>&1
    if [ $? -eq 0 ]; then
        break
    fi
    echo "第${i}次重试..." >> ${LOG_FILE}
    sleep 10
done

自动化调度与监控集成

1 crontab配置(每小时增量)

# 每天凌晨2点全量,其余时间增量
0 2 * * * /usr/local/bin/backup.sh --full
0 3-23 * * * /usr/local/bin/backup.sh --incremental

2 集成Prometheus监控

# 在脚本末尾记录备份指标
echo "backup_duration_seconds $(date +%s) last=$(($(date +%s)-${START_TIME}))" > /var/metrics/backup.prom
echo "backup_status ${STATUS}" >> /var/metrics/backup.prom

常见问题与优化技巧

问题1:增量备份越来越大?

  • 原因:某些系统日志文件频繁修改元数据但内容未变(如access_log)。
  • 解决:对特定目录使用--size-only只比较文件大小,或排除频繁更新的临时文件。

问题2:多台服务器备份时间冲突?

  • 优化:采用sleep随机偏移启动:sleep $((RANDOM % 600)); backup.sh

问题3:备份磁盘空间告警?

  • 策略:设置保留周期,例如保留最近30天增量+最近3次全量,自动清理:find ${BACKUP_DIR} -type f -mtime +30 -delete

Q&A:解决增量备份脚本的五大痛点

Q1:增量备份恢复时需要哪些前提条件?
A:确保保留完整的全量备份快照以及所有增量链的日志文件,恢复时需按时间顺序依次应用全量→增量1→增量2...(例如使用rsync恢复时需指定每个增量目录的--link-dest)。

Q2:如何验证增量备份的完整性?
A:定期执行模拟恢复测试(在隔离环境还原数据后对比差异),并记录每条增量日志的md5值到校验数据库。

Q3:增量备份脚本如何处理打开的文件(如数据库热备)?
A:数据库场景必须使用快照或binlog技术;文件级场景可尝试lsof检查文件是否被占用,结合rsync--delay-updates参数延迟更新。

Q4:大型文件(>50GB)的增量备份效率低怎么办?
A:改用rsync的--inplace就地更新而非创建副本,或使用btrfs/zfs的文件系统快照(秒级生成增量视图)。

Q5:跨平台环境下(Windows/Linux混合)如何实现增量?
A:推荐使用rclone,支持多种协议(SMB、SFTP)且原生支持增量同步:rclone sync source: dest: --backup-dir


编写增量备份脚本时,请始终将数据不可变性恢复成功率置于首位——一个无法恢复的备份等于没有备份,建议结合以上模板根据实际工作负载调整参数,并定期执行恢复演练(推荐每月至少一次)。

本文中所有脚本示例均基于GNU工具链,部分依赖Linux Kernel 4.18+的ext4/XFS文件系统特性,若需获取更专业的备份框架,可访问 备份解决方案库 参考社区实践。

抱歉,评论功能暂时关闭!