共计 1584 个字符,预计需要花费 4 分钟才能阅读完成。
比较重要的数据最好还是经常备份,以免数据丢失后悔莫及。对于有快照的服务器,可以利用快照进行备份,对于没有快照的,可以利用 rsync 备份到本地。
以下脚本可以方便地进行备份,修改配置后定时运行即可:
#!/bin/bash
# 日志统一重定向
# 将所有输出重定向到 /tmp/backup.log,包括错误信息
exec >> /tmp/backup.log 2>&1
# 定义要排除的多个文件/目录(默认的排除项)
global_exclude_dirs=("*.git" "tmp")
# 定义主机的配置信息
hosts=(
# 每个主机配置:用户名, 主机IP, ssh端口, ssh密码, 远程目录, 本地目录, 排除的目录
"root,172.21.9.126,22,test,/home/docker,/back/126,exclude_dirs",
"root,172.21.9.127,22,test2,/home/docker,/back/127,exclude_dirs"
)
# 获取当前时间并格式化为 YYYY-MM-DD HH:MM:SS 格式
log_time() {
date +"%Y-%m-%d %H:%M:%S"
}
# 记录备份开始时间
echo "$(log_time) 备份脚本开始运行"
# 从配置数组中读取每台主机的备份信息并执行操作
for host_info in "${hosts[@]}"; do
# 解析主机配置
IFS=',' read -r username host_ip ssh_port password remote_dir local_dir exclude_dirs <<< "$host_info"
# 设置日志文件
log_file="$local_dir/backup.log"
# 确保日志目录存在
mkdir -p "$(dirname "$log_file")"
# 记录当前主机的备份开始时间
echo "$(log_time) 主机 $host_ip 开始备份"
echo "$(log_time) 主机 $host_ip 开始备份" >> "$log_file"
# 如果指定了特定的排除目录,则使用它们,否则使用全局排除目录
if [ -z "$exclude_dirs" ]; then
exclude_dirs="${global_exclude_dirs[*]}"
fi
# 构建排除的参数
exclude_params=""
IFS=',' read -r -a exclude_array <<< "$exclude_dirs"
for exclude_dir in "${exclude_array[@]}"; do
exclude_params+=" --exclude=$exclude_dir"
done
# 执行增量备份,修改了目标路径,使得远程目录本身被备份到本地
echo "$(log_time) 执行备份 $host_ip:$remote_dir 到本地 $local_dir" >> "$log_file"
sshpass -p "$password" rsync -avz --delete $exclude_params -e "ssh -p $ssh_port" "$username@$host_ip:$remote_dir" "$local_dir/" >> "$log_file" 2>&1
# 备份完成
echo "$(log_time) 主机 $host_ip 备份完成" >> "$log_file"
echo "$(log_time) 主机 $host_ip 备份完成"
done
# 记录备份执行结束时间
echo "$(log_time) 备份脚本结束运行"
使用该脚本可以对所有服务器一次性备份,也可以指定服务器进行备份,输入参数即可,参数按关键词匹配:
# 只备份 172.21.9.126
bash backup.sh 126
# 备份 172.21.9.126 和 172.21.9.127
bash backup.sh 126 127
# 或者
bash backup.sh 12
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完