#!/usr/bin/env bash # 文件名: rsync_client.sh # 功 能: 数据备份脚本 # 依赖 pigz 工具 set -o errexit set -o nounset set -o pipefail ### 变量定义开始 # 认证用户名 export RSYNC_AUTH_USER='gitee' # 认证密码 export RSYNC_AUTH_PASSWORD='790a002393c3e022d50a917a3d26fafedf842' # 认证文件 export RSYNC_AUTH_FILE='/etc/rsyncd.auth' # 备份节点节点地址 export RSYNC_SERVER='127.0.0.1' # rsync 模块名称 export RSYNC_MODULE_NAME='code_0' # 备份目录 export BACKUP_DIR="/data/backup/${RSYNC_MODULE_NAME}" # 日期格式 export DATE_FORMAT=$(date +"%Y-%m-%d") # 最终备份软链接目录 export LATEST_LINK="${BACKUP_DIR}/latest" # 数据保留期限(单位:天) export KEEP_DAY=$(date -d "-3 days" +%Y-%m-%d) ### 变量定义结束 # 判断是否使用root用户运行 if [[ "$UID" -ne "0" ]] then echo '错误: 请使用root用户来运行此脚本!' exit 1 fi # 判断是否存在数据备份目录 [[ -d ${BACKUP_DIR} ]] || install -d ${BACKUP_DIR} # 生成认证文件并设置权限 echo "${RSYNC_AUTH_PASSWORD}" > ${RSYNC_AUTH_FILE} && chmod 600 ${RSYNC_AUTH_FILE} export RSYNC_PASSWORD=${RSYNC_AUTH_PASSWORD} cd $BACKUP_DIR rsync -avh \ --delete \ --link-dest "${LATEST_LINK}" \ rsync://${RSYNC_AUTH_USER}@${RSYNC_SERVER}/${RSYNC_MODULE_NAME} ./${DATE_FORMAT} ### 参数注解: # -a 等同于--archive: 归档模式,相当于 -rlptgoD(递归、保持软硬链接、保持权限、保持时间戳、保持属组、保持拥有者、保持设备文件和特殊文件) # -v 等同于--verbose: 详细模式输出 # -z 等同于--compress: 数据压缩传输 # -h 等同于--human-readable:以更易读方式输出 # -P 等同于--partial: 允许中断的传输继续和 --progress 相结合 # -r 等同于--recursive: 递归地复制目录 # -u 等同于--update: 跳过所有新源文件或目录上的文件 # --delete: 删除那些在源目录树不存在的文件 # --progress: 显示传输过程中的进度信息 # -n 等同于 --dry-run: 模拟运行 # -e 等同于 --rsh=COMMAND: 指定使用的远程shell,常用来指定 ssh # -l 等同于 --links: 当复制符号链接时,保持链接是链接。默认情况下,符号链接会被解引用。 # -p 等同于 --perms: 保持文件权限不变 # -t 等同于 --times: 保持文件时间戳不变 # -S 等同于 --sparse: 优化稀疏文件的传输 # --exclude=PATTERN 排除匹配PATTERN的文件 # --include=PATTERN 包含匹配PATTERN的文件 # --backup 创建备份,即将目标目录中的更新或删除文件后缀为 ~ # --backup-dir 指定备份更新或删除文件的目录 # --max-size=SIZE: 不传输大于指定SIZE的文件 # --min-size=SIZE: 不传输小于指定SIZE的文件 # --bwlimit=RATE: 限制带宽,单位KBytes # --stats 输出传输统计信息 # 重新创建软链接 rm -rf ${LATEST_LINK} ln -sf ${DATE_FORMAT} ${LATEST_LINK} # 归档压缩,为避免缺少基准目录,导致下次备份耗时长,压缩前一天的数据 if [[ -d $(date -d "-1 days" +%Y-%m-%d) ]] then tar --use-compress-program=pigz -cf $(date -d "-1 days" +%Y-%m-%d).tar.gz $(date -d "-1 days" +%Y-%m-%d) --remove-files fi # 删除旧备份数据 find ${BACKUP_DIR} -type f -name "${KEEP_DAY}.tar.gz" -exec rm -f {} \;