本文将介绍如何通过一个智能化的Shell脚本,实现全量压缩备份与增量实时同步的双重保护机制,打造“一键无忧”的自动化备份方案。将数据同步备份到另一台服务器上。
注意:代码需要修改相关信息
#!/bin/bash
# 通用配置
SRC_DIRS="/root/data" # 源目录列表(空格分隔)
SERVER_B_IP="xx.xx.xx.xx" # 备份服务器IP
SSH_USER="root" # SSH用户
SSH_PORT="22" # SSH端口
BACKUP_NAME_PREFIX="xxxx" # 备份名前缀
# 全量备份配置
ZIP_DST_DIR="/root/backup/zip-data" # 压缩包存放目录
MAX_BACKUPS=3 # 最大保留备份数
ARCHIVE_FORMAT="tar.gz" # 压缩格式
# 增量备份配置
RSYNC_DST_DIR="/root/backup/rsync" # rsync目标目录
usage() {
echo "用法: $0 [模式]"
echo "可用模式:"
echo " full 执行全量压缩备份(默认模式)"
echo " incr 执行增量rsync备份"
echo " all 同时执行全量和增量备份"
exit 1
}
full_backup() {
echo "正在执行全量备份..."
current_date=$(date +"%Y%m%d_%H%M%S")
backup_filename="${BACKUP_NAME_PREFIX}_${current_date}.${ARCHIVE_FORMAT}"
# 压缩目录(处理含空格路径)
tar -czf "${backup_filename}" ${SRC_DIRS}
# 传输备份
scp -P "${SSH_PORT}" "${backup_filename}" "${SSH_USER}@${SERVER_B_IP}:${ZIP_DST_DIR}"
# 清理本地临时文件
rm -f "${backup_filename}"
# 保留最新备份
ssh -p "${SSH_PORT}" "${SSH_USER}@${SERVER_B_IP}" \
"ls -t ${ZIP_DST_DIR}/${BACKUP_NAME_PREFIX}* 2>/dev/null | tail -n +$(($MAX_BACKUPS+1)) | xargs --no-run-if-empty rm -f"
}
incr_backup() {
echo "正在执行增量备份..."
backup_dir="${RSYNC_DST_DIR}/${BACKUP_NAME_PREFIX}_latest"
# 创建目标目录
ssh -p "${SSH_PORT}" "${SSH_USER}@${SERVER_B_IP}" "mkdir -p ${backup_dir}"
# 同步每个目录
for SRC_DIR in ${SRC_DIRS}; do
rsync -avz -e "ssh -p ${SSH_PORT}" --delete \
"${SRC_DIR}/" \
"${SSH_USER}@${SERVER_B_IP}:${backup_dir}/$(basename ${SRC_DIR})/"
done
}
# 参数解析
case "$1" in
full) full_backup ;;
incr) incr_backup ;;
all) full_backup; incr_backup ;;
*) full_backup ;; # 默认执行全量备份
esac
echo "备份操作完成"
主要优化点:
- 模块化设计:通过函数封装不同备份方式
- 参数控制:支持三种模式:
full
仅全量备份(默认)incr
仅增量备份all
同时执行两种备份
- 路径安全:处理rsync目录结构中的basename
- 错误抑制:添加
2>/dev/null
避免空目录报错 - 配置集中:所有配置参数集中在脚本开头,方便修改
- 使用提示:添加usage帮助信息
使用方法:
# 默认执行全量备份
./backup.sh
# 执行增量备份
./backup.sh incr
# 同时执行两种备份
./backup.sh all
注意事项:
- 确保本地到备份服务器的SSH密钥认证已配置
- 目标目录需要提前创建(脚本已包含自动创建逻辑)
- 如果源目录包含空格,需要将SRC_DIRS改为数组格式
- 建议添加日志记录和错误通知机制(可根据需要扩展)
- 源服务器和目的服务器均需要安装rsync,
apt install rsync
设置定时执行:
crontab -e
末尾加上下面的代码,注意路径,和需要备份的方法
0 3 * * 0 /root/backup.sh all