这个是我们团队的葛凯麟同学写的, 简单设置一些配置加上crontab, 就可以用rsync备份另一台服务器的数据了
完整脚本如下, 其中配置参数说明:
root_src 目标服务器及数据路径
root_dst 本地保存地点
options rsync参数, 其中-e表示ssh登录参数, 可以不要
sub_paths 需要备份的文件夹, 多个用空格隔开, 比如 (/data1 /data2)
excludes 不需要备份的文件夹, 可以为空, 多个也是空格隔开, 比如 (log session "error log")
rotate_count 需要保留多少个备份, 越多越占用磁盘空间, 每次运行就会新增一个文件夹, 然后删除最老的, 如果你每天备份一次, 那么rotate_count=7表示保留最近一个星期的数据
====================================================
#!/bin/bash
set -e
root_src="user_name@other_vps:datas"
root_dst="/home/user_name/backup_datas"
options=(-avzcsP --delete-excluded -e "ssh -p 22 -l user_name")
sub_paths=(/ )
excludes=(log )
rotate_count=7
for i in ${!sub_paths[@]}; do
sub_paths[$i]="$root_src/./${sub_paths[$i]}"
done
for i in ${!excludes[@]}; do
excludes[$i]="--filter=-s ${excludes[$i]}"
done
if [ ! -d "$root_dst" ]; then
mkdir "$root_dst"
fi
rsync "${options[@]}" "${excludes[@]}" "${sub_paths[@]}" "$root_dst/"
bak_path=$(echo "$root_dst" | sed 's|/*$||')
for i in $(eval echo {1..$rotate_count}); do
rotate_count=$i
if [ ! -d "$bak_path.$i" ]; then
break
fi
done
rm -r "$bak_path.$rotate_count" 2>/dev/null || true
for ((i=$rotate_count;i>1;i--)); do
mv "$bak_path.$(($i - 1))" "$bak_path.$i"
done
rm -rf "$bak_path.1"
mv "$bak_path" "$bak_path.1"
=================================================
代码前面的空格都被删除了, 完美版本见:
http://sdjl.me/index.php/archives/505顺便广告一下, 刚才有位v2ex的朋友买了4大瓶辣椒但是又付了邮费了, 我们会给你多送一个大瓶一个小瓶的 :)
辣椒购买:
http://item.taobao.com/item.htm?spm=a1z10.1.w4004-2281938568.4.JM2bg2&id=18764406138葛凯麟同学正在写用git, diff, patch来增量备份mysql数据的程序, 完成后继续分享
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/73426
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.