<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jasmine214--love

    只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

    svn 同步備份

    Posted on 2010-09-26 11:26 幻海藍夢 閱讀(1444) 評論(0)  編輯  收藏 所屬分類: Linux版本管理

    subversion作為開發部門的一個必備工具,其地位已經從原來的小弟一躍成為老大的位置(真有取代CVS的可能)。平時我都是很小心的呵護著我公司的這臺服務器,冷不丁打個噴嚏,我都會顫抖三分。
    為了徹底擺脫我的被動局面,趕緊花了些錢買了臺性能不錯的服務器專門給這位老大弄個替身,號稱雙龍會,即使老大不小心掛掉了,俺也能立馬讓替身上場,代替那位可憐的大哥。
    svn服務器代碼庫是每時每刻都在更新的,所以,最好的備份方式就是同步了,正好svn新版本帶了svnsync的命令,可以實現這個功能。再結合post-commit的hook腳本,我們就可以在用戶提交代碼的同時,讓服務器自動更新庫版本到備份服務器上。
    不過,為了預防萬一,每周來個全備份還是很有必要的,起碼多了一個保障,所以,這里可以用到svnadmin hotcopy 功能。在這,我先就貼上同步的腳本吧。
    svnsync腳本我修改了一部分,增加了簡單的檢測功能,檢測版本號是否相同,如果不同則同步,否則直接退出到下一個repository,檢測備份服務器是否存在這個repository,如沒有就創建。算是一個完善補充吧。

    SVN備份總結:
    1)svnadmin hotcopy, 優點:備份速度很快,屬于完全拷貝源數據庫,連配置文件和hook腳本一起都會拷貝過去。缺點:要是每次拷貝可真夠麻煩,庫要是很多,不大適合用此方法備份。
    2)svnsync:優點:可以和hook腳本結合,每有更新就可以同步到備份服務器中,確實是出家旅行,必備方案。缺點:速度真夠慢的,要等死人的......
    還有一個svn dump方法,我就不介紹,這個似乎結合了完全備份和增量備份的優點。不過,不大適合做為slave服務器,我沒用這個方法。

    PS:附件為兩個腳本的代碼文件。

    #更新時間:2009-09-11 4 PM
    #更新內容:增加了檢查hook文件pre-revprop-change的代碼

    代碼如下:
    #我將遠程備份服務器通過NFS掛載到/backup/svnsync目錄下
    #svn repository目錄在/home/svnroot目錄下
    #projectlist.txt文件為repository列表,格式為每個repository一行

    #!/bin/sh

    ###################################
    # svn backup log path
    #  - This is used to log result
    ###################################
    LogFile=/backup/svnsync/svnback.log
    DATE=`date +%Y%m%d`
    ###################################
    # mail address for status updates
    #  - This is used to email you a status report
    ###################################
    MAILADDR=carywu@yahoo.cn

    ###################################
    # HOSTNAME and project list
    #  - This is also used for reporting
    ###################################
    ProjectLst=/backup/svnsync/projectlist.txt

    ###################################
    # backup directory
    # - This is the path to the backup directory
    ###################################
    BackDir=/backup/svnsync/repository

    ###################################
    # svn directory
    # - This is the path to the directory you want to archive
    ###################################
    SVNDIR=/home/svnroot/repository


    ###################################
    # svn command path
    # - This is the path to the directory you want to archive
    ###################################
    SVNSYNC=/usr/local/bin/svnsync
    SVNLOOK=/usr/local/bin/svnlook
    SVNADMIN=/usr/local/bin/svnadmin

    export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

    # our actual rsyncing function
    do_echo()
    {
            touch $hookfile
            echo "REPOS="\$1"" >> $hookfile
            echo "REV="\$2"" >> $hookfile
            echo "USER="\$3"" >> $hookfile
            echo "PROPNAME="\$4"" >> $hookfile
            echo "ACTION="\$5"" >> $hookfile
            chmod 755 $hookfile

    }

    do_accounting()
    {
            echo " " > $LogFile
            echo " " >> $LogFile
            echo "###########################" >> $LogFile
            echo "$DATE" >> $LogFile
            echo "###########################" >> $LogFile
            cd $BackDir
    }

    do_rsync()
    {
       PROJECTLIST=`cat $ProjectLst`
       for project in $PROJECTLIST
              do
                    projectdata=$SVNDIR/$project
                    destdir=$BackDir/$project
                     hookfile="$destdir/hooks/pre-revprop-change"
                    ssrepo=`$SVNLOOK youngest $projectdata`
                    dtrepo=`$SVNLOOK youngest $destdir`
    #check whether svn repository is existed. if not, then use svnadmin create it.
                    if [ -d $destdir ]
                    then
                            echo "#######################" >> $LogFile
                            echo "$project" >> $LogFile
                            echo "#######################" >> $LogFile
                            echo "checking hooks file" >> $LogFile
                            if [ -f $hookfile ]
                            then
                                    chmod 755 $hookfile
                            else
                                    do_echo
                            fi
                            echo "OK, seems we have $project repository,now do init or sync!!" >> $LogFile
                            echo " " >> $LogFile
                            echo " " >> $LogFile
                    else
                            echo "en.... seems we have no $project repository, now will create it and do init and sync!" >> $LogFile
                            echo " " >> $LogFile
                            echo " " >> $LogFile
                            $SVNADMIN create $destdir
                            oeo_echo
                    fi

    #check svn version, if 0, then init it.
                    if [ "$dtrepo" -eq "0" ]
                    then
                            $SVNSYNC init file:///$destdir file:///$projectdata
                            $SVNSYNC sync file:///$destdir
                            echo "sync $project done into $destdir" >> $LogFile
                    else
                            if [ "$ssrepo" -eq "$dtrepo" ]
                            then
                                    echo "sorry, the repository $project is updated, dont need do it" >> $LogFile
                            else
                                    $SVNSYNC sync file:///$destdir
                                    echo "sync $project done into $destdir" >> $LogFile
                            fi
                    fi
            done
    }

    # our post rsync accounting function
    do_mail()
    {
       mail $MAILADDR -s svn-back_log < $LogFile
    }
    #  run our backup and accounting
    do_accounting && do_rsync && do_mail
    ~
    原文:http://carywu.blog.51cto.com/13185/199991


    #后續:
    這個腳本我運行良久,很是好用,可以在服務器上設置每分鐘運行一次,因為版本更新在1分鐘內是不會有多少的,所以,運行速度還是很快的。
    不過,單純讓服務器每分鐘就去運行下是不是有點累啊?所以,更好的辦法還是在SVN的hook文件夾中添加一個post-commit腳本,很簡單一點,只需要下面一句話:
    svnsync sync --non-interactive  file:///backup/svnsync/repository/XXXXX
    #XXXXX就是你相應的庫名。
    #如果svnsync不是在標準的bin目錄下,自己需要指定哦。
    毛主席告訴我們,實踐出真知。
    實踐證明,這樣能讓SVN備份庫每時每刻都保持同樣的版本。就算你的運行服務器塌掉了,也可以在2分鐘內將備份服務器接替工作。真是居家旅行,必備良藥啊。

    #敬請關注我的后續文章......

       千萬別聽我忽悠,看我上篇文章的時間吧,那已經是個遙遠的傳說了。

    主站蜘蛛池模板: free哆啪啪免费永久| 国产亚洲视频在线播放大全| 亚洲邪恶天堂影院在线观看| 亚洲精品乱码久久久久久 | 三年在线观看免费观看完整版中文| 国产亚洲人成在线影院| 国产成人亚洲精品播放器下载 | 久久精品亚洲中文字幕无码网站| 在线日韩日本国产亚洲| 亚洲区小说区激情区图片区| 亚洲伊人色欲综合网| 久久噜噜噜久久亚洲va久| 亚洲电影中文字幕| 亚洲短视频在线观看| 亚洲一级免费毛片| 亚洲精华液一二三产区| 性色av极品无码专区亚洲| 免费一级毛片在线播放放视频| 无码人妻一区二区三区免费视频| 国产免费播放一区二区| 在线观看免费无码专区| 在线a免费观看最新网站| 大地资源在线观看免费高清| 国产精品免费小视频| 国产成人亚洲影院在线观看| 日韩亚洲欧洲在线com91tv| 亚洲视频免费在线看| 亚洲一区二区三区四区视频 | 久久久久久久亚洲Av无码| 亚洲AV无码成人专区| 亚洲AV女人18毛片水真多| yellow视频免费看| 99久在线国内在线播放免费观看| 日本视频一区在线观看免费| 日韩免费视频播放| 亚洲中文字幕无码不卡电影| 337p日本欧洲亚洲大胆色噜噜| 中文字幕在线日亚洲9| 一级毛片免费观看不收费| 中文字幕成人免费视频| 免费黄网在线观看|