svn全量和增量备份详解

1.svn的安装:

    yum安装:

            yum install -y subversion

            mkdir /data/svn

            svnadmin create project-1

            svnadmin create project-2

    用统一配置方法:

            cp authz passwd  /data/svn

            cp svnserve.conf /data/svn


            vim svnserve.conf 

            修改:

            anon-access = read  #匿名用户可读

            auth-access = write   #授权用户可写

            password-db = /data/svn/passwd  #使用哪个文件作为账号文件

            authz-db = /data/svn/authz  #使用哪个文件作为权限文件

            realm = My First Repository  # 认证空间名,版本库所在目录


            vim authz 

            修改:

            [groups]

            group_admin = admin

            [/]

            @group_admin = rw

            [project-1:/]

            yan = rw

            [project-2:/]

            peng = rw


            vim passwd 

            [users]      

            peng = 123456

            yan = 123456

            admin = 123456

     启动:

            svnserve -d -r /data/svn --config-file=/root/svnserve.conf

svn备份方式对比分析

  一般采用三种方式:
        1
svnadmin dump
        2
svnadmin hotcopy
        3、svnsync
 注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如copyrsync命令。
    曾经用rsync命令来做增量和全量备份,在季度备份检查审计中,发现备份出来的库大部分都不可用,因此最好是用svn本身提供的功能来进行备份。
 优缺点分析:
    第一种 svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
    缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
    个人建议在版本数比较小的情况下使用这种备份方式。
    第二种 svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
    优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
    缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
    第三种 svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。
    优点是:当制作成2个镜像库的时候起到双机实时备份的作用;
    缺点是:当作为2个镜像库使用时,没办法做到想完全抛弃今天的修改恢复到昨晚的样子;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。

全量备份脚本: 

    [root@svn-master ~]# vim svn-backup-full.sh

    #!/bin/bash

    #Date: 2017-08-18

    #Author: brook

    #Mail: @qq.com

    #Function: svn的全量备份

    

    . /etc/init.d/functions

    

    #配置库目录

    SVN_REPOROOT=/data/svn

    

    #全量备份文件存放路径

    date=$(date '+%Y-%m-%d')

    RAR_STORE=/svn_backup/full/$date

    if [ ! -d "$RAR_STORE" ];then

        mkdir -p $RAR_STORE

    fi

    

    #日志存放目录

    LOG_PATH=/svn_backup/log

    if [ ! -d "$LOG_PATH" ];then

        mkdir -p $LOG_PATH

    fi

    

    #项目库列表

    cd $SVN_REPOROOT

    TOTLE=`ls | wc -l`

    for name in $(ls)

    do 

             if [ -d "$name" ];then

            

                    echo "开始备份项目库$name"

                    mkdir -p $LOG_PATH/$name

                    echo `/usr/bin/svnlook youngest $SVN_REPOROOT/$name` > ${LOG_PATH}/${name}/last_revision

            .txt

                    /usr/bin/svnadmin hotcopya $SVN_REPOROOT/$name $RAR_STORE/${name}

                    if [ $? -eq 0 ]

                        then

                            action "项目库$name备份成功" /bin/true

            

                            #echo "项目库$name全备成功" | mail -s "svn全备" [email protected]

                        else

                            action "项目库$name备份失败" /bin/false

                            echo "项目库$name全备失败" | mail -s "svn全备" [email protected]

                    fi

                else

                    echo "开始备份配置文件$name"

                    cp $name $RAR_STORE/$name

                fi

     done

增量备份脚本:

    [root@svn-master ~]# vim svn-backup-increment.sh

    #!/bin/bash

    #Date: 2018-5-17

    #Author: brook

    #Mail: [email protected]

    #Function: svn的增量备份

    

    

    #配置库目录

    SVN_REPOROOT=/data/svn

    

    #全量备份文件存放路径

    date=$(date '+%Y-%m-%d')

    RAR_STORE=/svn_backup/increment/$date

    if [ ! -d "$RAR_STORE" ];then

        mkdir -p $RAR_STORE

    fi

    

    #日志存放目录

    LOG_PATH=/svn_backup/log

    if [ ! -d "$LOG_PATH" ];then

        mkdir -p $LOG_PATH

    fi

    

    #读取项目库列表

    cd $SVN_REPOROOT

    for name in $(ls)

    do

        if [ -d "$name" ];then

     if [ ! -d "$RAR_STORE/$name" ];then

                mkdir $RAR_STORE/$name

            fi

    

            if [ ! -d "$LOG_PATH/$name" ];then

                mkdir $LOG_PATH/$name

            fi

    

            echo ******Starting backup from $date****** >> $LOG_PATH/$name/$name.log

            echo ******svn repository $name startting to backup****** >> $LOG_PATH/$name/$name.log

            /usr/bin/svnlook youngest $SVN_REPOROOT/$name > $LOG_PATH/A.TMP

            UPPER=`head -1 $LOG_PATH/A.TMP`

            if [ -f "$LOG_PATH/$name/last_revision.txt" ];then

    

                NUM_LOWER=`head -1 $LOG_PATH/$name/last_revision.txt`

                if [ $UPPER -eq $NUM_LOWER ];then

                    echo "unchanged" >> $LOG_PATH/$name/$name.log

                    rm -f $LOG_PATH/A.TMP

                    break

                else

                    let LOWER="$NUM_LOWER+1"

                    /usr/bin/svnadmin dump $SVN_REPOROOT/$name -r $LOWER:$UPPER --incremental > $RAR

    _STORE/$name/$LOWER-$UPPER.dump

                    if [ $? -ne 0 ];then

                        echo "项目库$name增备失败" | mail -s "svn增备" [email protected]

                    fi

                    rm -f $LOG_PATH/A.TMP

                    echo $UPPER > $LOG_PATH/$name/last_revision.txt

                    echo ******This time we bakcup from $LOWER to $UPPER****** >> $LOG_PATH/$name/$n

    ame.log

                    echo ******Back up ended****** >> $LOG_PATH/$name/$name.log

                fi

            #else

    #            echo "0" > $LOG_PATH/$name/last_revision.txt

    #            LOWER=`head -1 $LOG_PATH/$name/last_revision.txt`

    #            /usr/bin/svnadmin dump $SVN_REPOROOT/$name -r $LOWER:$UPPER --incremental > $RAR_ST

    ORE/$name/$LOWER-$UPPER.dump        

    #            rm -f $LOG_PATH/A.TMP

    #            echo $UPPER > $LOG_PATH/$name/last_revision.txt

    #            echo ******This time we bakcup from $LOWER to $UPPER****** >> $LOG_PATH/$name/$name

    .log

    #            echo ******Back up ended****** >> $LOG_PATH/$name/$name.log

            fi

        else

            continue

        fi

    done

mail命令安装:

    yum install -y mailx

    vim /etc/mail.rc

    文件尾增加以下内容 

        set from=xxxxx@qq.com 

        smtp="smtp.qq.com"
        set smtp-auth-user="xxxxx@qq.com

        smtp-auth-password="123456"
        set smtp-auth=login

    
    说明:

        from: 对方收到邮件时显示的发件人
        smtp: 指定第三方发送邮件的smtp服务器地址
        smtp-auth: SMTP的认证方式。默认是LOGIN,也可改为CRAM-MD5或PLAIN方式
        smtp-auth-user: 第三方发邮件的用户名
        smtp-auth-password: 用户名对应密码

    nfs安装:

            /etc/init.d/rpcbind start

            /etc/init.d/rpcbind status

            chkconfig rpcbind on

            chkconfig --list rpcbind

            showmount -e 10.0.0.36

            mount -t nfs 10.0.0.36:/svn/backup /svn_backup

            echo "mount -t nfs 10.0.0.36:/svn/backup /svn_backup" >> /etc/rc.local

svn备份服务器配置:

    nfs安装:

            yum install nfs-utils rpcbind -y

    查看:

                rpm -qa nfs-utils rpcbind

    开启rpc:

              /etc/init.d/rpcbind start

              netstat -lntup | grep rpc

              rpcinfo -p localhost

    开启nfs:

                /etc/init.d/nfs start

                rpcinfo -p localhost 

    开机自启动:

                chkconfig nfs on

                chkconfig rpcbind on

    创建共享目录:

                mkdir -p /svn/backup

                chown -R nfsnobody.nfsnobody /svn/backup/

                 vim /etc/exports 

                #

                /svn/backup 10.0.0.0/24(rw,sync)

                /etc/init.d/nfs reload

svn恢复:

        svnadmin hotcopy project-1 /svndata/project-1

        svnadmin load project-1 < /svn/backup/increment/2018-05-23/project-1/3-3.dump

猜你喜欢

转载自blog.51cto.com/6284444/2119950