jasmine214--love

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

          svn 同步備份

          Posted on 2010-09-26 11:26 幻海藍夢 閱讀(1445) 評論(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分鐘內將備份服務器接替工作。真是居家旅行,必備良藥啊。

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

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

          主站蜘蛛池模板: 嘉黎县| 平阳县| 布拖县| 临汾市| 玛纳斯县| 井冈山市| 泸定县| 青岛市| 鲁甸县| 扎囊县| 宁河县| 金门县| 罗田县| 祁门县| 石台县| 婺源县| 淮南市| 锡林郭勒盟| 库车县| 遵义市| 郓城县| 金平| 昆明市| 陆良县| 兰考县| 车致| 广安市| 福州市| 黔西县| 西乌珠穆沁旗| 玉龙| 大安市| 临桂县| 定边县| 南通市| 甘谷县| 灵丘县| 迁安市| 大城县| 抚宁县| 汉沽区|