分享一个远程备份数据的脚本, 增量备份, 自定义份数

2013-06-24 13:43:36 +08:00
 sdjl
这个是我们团队的葛凯麟同学写的, 简单设置一些配置加上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数据的程序, 完成后继续分享
3434 次点击
所在节点    分享创造
10 条回复
sdjl
2013-06-24 15:25:36 +08:00
我发现了, 凡是分享代码, 都没有几个人回复, 凡是分享吃喝玩乐或者吐槽的, 大家都很积极
thai9quohs6jae1C
2013-06-24 15:28:08 +08:00
因为没有用github。感觉不靠谱。
sdjl
2013-06-24 18:42:05 +08:00
@thai9quohs6jae1C 和github没有关系
likuku
2013-06-24 18:46:50 +08:00
以前用 rsync + zfs/btrfs 的 snapshot 来增量备份 mysql
breeswish
2013-06-25 00:17:45 +08:00
点了收藏 :)
halfbloodrock
2013-06-25 01:48:37 +08:00
如果线上机器多,而且类型偏多的话,推荐用用Bacula,开源的备份软件,比较强大。
RobinFai
2013-06-25 09:12:04 +08:00
o(︶︿︶)o 唉,我现在也是在用rsync备份网站,然后用scp备份mysql的库(mysqldump+tar)。
mysql不用增量主要是考虑到,万一到恢复到某一时刻。。。当然用git记录版本貌似也可行。。。
cxe2v
2013-06-25 09:16:06 +08:00
因为你分享的代码有很强的方向性,一般的程序员也不会需要这些备份服务器数据的代码,所以,当然就没有很多人回了
slacken
2013-06-25 09:30:47 +08:00
如果有Ruby环境的话,使用Backup和whenever两个gem也是很好的选择
qsun
2013-06-27 11:56:34 +08:00
目测楼主没有用过 duplicity http://duplicity.nongnu.org/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/73426

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX