V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
sdjl
V2EX  ›  分享创造

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

  •  
  •   sdjl · 2013-06-24 13:43:36 +08:00 · 3392 次点击
    这是一个创建于 3965 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个是我们团队的葛凯麟同学写的, 简单设置一些配置加上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数据的程序, 完成后继续分享
    10 条回复    1970-01-01 08:00:00 +08:00
    sdjl
        1
    sdjl  
    OP
       2013-06-24 15:25:36 +08:00
    我发现了, 凡是分享代码, 都没有几个人回复, 凡是分享吃喝玩乐或者吐槽的, 大家都很积极
    thai9quohs6jae1C
        2
    thai9quohs6jae1C  
       2013-06-24 15:28:08 +08:00
    因为没有用github。感觉不靠谱。
    sdjl
        3
    sdjl  
    OP
       2013-06-24 18:42:05 +08:00
    @thai9quohs6jae1C 和github没有关系
    likuku
        4
    likuku  
       2013-06-24 18:46:50 +08:00
    以前用 rsync + zfs/btrfs 的 snapshot 来增量备份 mysql
    breeswish
        5
    breeswish  
       2013-06-25 00:17:45 +08:00 via Android
    点了收藏 :)
    halfbloodrock
        6
    halfbloodrock  
       2013-06-25 01:48:37 +08:00
    如果线上机器多,而且类型偏多的话,推荐用用Bacula,开源的备份软件,比较强大。
    RobinFai
        7
    RobinFai  
       2013-06-25 09:12:04 +08:00
    o(︶︿︶)o 唉,我现在也是在用rsync备份网站,然后用scp备份mysql的库(mysqldump+tar)。
    mysql不用增量主要是考虑到,万一到恢复到某一时刻。。。当然用git记录版本貌似也可行。。。
    cxe2v
        8
    cxe2v  
       2013-06-25 09:16:06 +08:00
    因为你分享的代码有很强的方向性,一般的程序员也不会需要这些备份服务器数据的代码,所以,当然就没有很多人回了
    slacken
        9
    slacken  
       2013-06-25 09:30:47 +08:00
    如果有Ruby环境的话,使用Backup和whenever两个gem也是很好的选择
    qsun
        10
    qsun  
       2013-06-27 11:56:34 +08:00
    目测楼主没有用过 duplicity http://duplicity.nongnu.org/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   933 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:12 · PVG 07:12 · LAX 16:12 · JFK 19:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.