天天看點

SVN備份/恢複腳本

上一篇介紹了svn的配置,這裡就寫了兩個腳本對svn進行全備和恢複,由于是全備,是以可以做個計劃任務,每天執行一次即可。保留幾天的資料。

1、備份腳本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

<code>#!/bin/sh</code>

<code>#</code>

<code># Description: SVN full backup of the project</code>

<code># Author: Mr.chen</code>

<code># Date: 2015/02/10</code>

<code># Email: </code>

<code>SVN_BASICDIR</code><code>=</code><code>"/usr/local/svn/bin"</code>

<code>DAY</code><code>=</code><code>5</code>       <code># Backup files keep days</code>

<code>TIME</code><code>=</code><code>`date </code><code>+</code><code>%</code><code>Y</code><code>%</code><code>m</code><code>%</code><code>d</code><code>%</code><code>H</code><code>%</code><code>M`</code>

<code>SVNPATH</code><code>=</code><code>"/data/svn"</code>

<code>BAKDIR</code><code>=</code><code>"/data/svnbak"</code>

<code>BAKPATH</code><code>=</code><code>${BAKDIR}</code><code>/</code><code>${TIME}</code>

<code>BAKLOG</code><code>=</code><code>${BAKDIR}</code><code>/</code><code>bak_svn.log</code>

<code>PROJECT</code><code>=</code><code>`</code><code>/</code><code>bin</code><code>/</code><code>ls </code><code>-</code><code>lh ${SVNPATH} | grep </code><code>-</code><code>E </code><code>"^d"</code> <code>| awk </code><code>'{print $NF}'</code><code>`</code>

<code>CONIFIG_FILE</code><code>=</code><code>`</code><code>/</code><code>bin</code><code>/</code><code>ls </code><code>-</code><code>lh ${SVNPATH} | grep </code><code>-</code><code>E </code><code>"^-"</code> <code>| awk </code><code>'{print $NF}'</code><code>`</code>

<code>! </code><code>type</code> <code>lftp &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null &amp;&amp; echo </code><code>"Lftp command does not exist,Plz install lftp."</code> <code>&amp;&amp; exit </code><code>128</code>

<code>[ ! </code><code>-</code><code>d </code><code>"${BAKPATH}"</code> <code>] &amp;&amp; mkdir </code><code>-</code><code>p ${BAKPATH}</code>

<code>make_log() {</code>

<code>    </code><code>/</code><code>bin</code><code>/</code><code>echo </code><code>-</code><code>e </code><code>"[ $(date +%Y-%m-%d' '%H:%M:%S) ] ${1}"</code> <code>&gt;&gt; ${BAKLOG}</code>

<code>}</code>

<code>tar_bakfile() {</code>

<code>    </code><code>cd ${BAKDIR}</code>

<code>    </code><code>make_log </code><code>"tar zcf ${1##*/}.tgz ${1##*/}"</code>

<code>    </code><code>tar zcf ${</code><code>1</code><code>##*/}.tgz ${1##*/} &amp;&gt; /dev/null</code>

<code>    </code><code>make_log </code><code>"rm -rf ${1##*/}"</code>

<code>    </code><code>rm </code><code>-</code><code>rf ${</code><code>1</code><code>##*/} &amp;&gt; /dev/null</code>

<code>    </code><code>cd</code>

<code>    </code><code>echo "" &gt;&gt; ${BAKLOG}</code>

<code>rm_expired() {</code>

<code>    </code><code>cd ${</code><code>1</code><code>}</code>

<code>    </code><code>_DAY_</code><code>=</code><code>`date </code><code>-</code><code>d</code><code>"${DAY} days ago"</code> <code>+</code><code>%</code><code>Y</code><code>%</code><code>m</code><code>%</code><code>d`</code>

<code>    </code><code>ls | grep ${_DAY_} | xargs rm </code><code>-</code><code>rf</code>

<code>ftp_upload() {</code>

<code>    </code><code>#################################</code>

<code>    </code><code>#FTP upload</code>

<code>    </code><code>#echo "Start upload file: `date`"</code>

<code>    </code><code>FTPHOST</code><code>=</code><code>"x.x.x.x"</code>

<code>    </code><code>FTPPORT</code><code>=</code><code>"21"</code>

<code>    </code><code>FTPUSER</code><code>=</code><code>"xxx"</code>

<code>    </code><code>FTPPASSWD</code><code>=</code><code>"xxx"</code>

<code>    </code><code>FTPDOCUMENT</code><code>=</code><code>"xxx"</code>

<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>lftp &lt;&lt; EOF</code>

<code>open</code> <code>-</code><code>p $FTPPORT ftp:</code><code>/</code><code>/</code><code>$FTPUSER:$FTPPASSWD@$FTPHOST</code><code>/</code><code>$FTPDOCUMENT</code>

<code>put $</code><code>1</code>

<code>EOF</code>

<code>    </code><code>#echo "Upload file end: `date`"</code>

<code>    </code><code>##################################</code>

<code>for</code> <code>i </code><code>in</code> <code>${CONIFIG_FILE};do</code>

<code>    </code><code>cp ${SVNPATH}</code><code>/</code><code>${i} ${BAKPATH}</code><code>/</code>

<code>    </code><code>[ $? !</code><code>=</code> <code>0</code> <code>] &amp;&amp; echo </code><code>"Configuration file backup failed..."</code> <code>&gt;&gt; ${BAKLOG} &amp;&amp; ls </code><code>-</code><code>ldh ${BAKDIR}</code><code>/</code><code>*</code> <code>| grep </code><code>'^d'</code> <code>| awk </code><code>'{print $NF}'</code> <code>| xargs rm </code><code>-</code><code>rf &amp;&amp; exit </code><code>121</code>

<code>done</code>

<code>make_log </code><code>"=============== Start Backup ==============="</code>

<code>for</code> <code>_bak_project_ </code><code>in</code> <code>${PROJECT};do</code>

<code>    </code><code>make_log </code><code>"${SVN_BASICDIR}/svnadmin hotcopy ${SVNPATH}/${_bak_project_} ${BAKPATH}/${_bak_project_}"</code>

<code>    </code><code>${SVN_BASICDIR}</code><code>/</code><code>svnadmin hotcopy ${SVNPATH}</code><code>/</code><code>${_bak_project_} ${BAKPATH}</code><code>/</code><code>${_bak_project_} &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>    </code><code>if</code> <code>[ $? !</code><code>=</code> <code>0</code> <code>];then</code>

<code>        </code><code>make_log </code><code>"Project ${_bak_project_} backup failed, Plz check..."</code>

<code>        </code><code>echo </code><code>"Project ${_bak_project_} backup failed, Plz check..."</code>

<code>        </code><code>ls </code><code>-</code><code>ldh ${BAKDIR}</code><code>/</code><code>*</code> <code>| grep </code><code>'^d'</code> <code>| awk </code><code>'{print $NF}'</code> <code>| xargs rm </code><code>-</code><code>rf</code>

<code>        </code><code>exit </code><code>122</code>

<code>    </code><code>fi</code>

<code>make_log </code><code>"================ End Backup ================"</code> <code>&amp;&amp; echo "" &gt;&gt; ${BAKLOG}</code>

<code>make_log </code><code>"=============== Start Check ==============="</code>

<code>for</code> <code>_check_proejct_ </code><code>in</code> <code>${PROJECT};do</code>

<code>    </code><code>make_log </code><code>"${SVN_BASICDIR}/svnlook youngest ${BAKPATH}/${_check_proejct_}"</code>

<code>    </code><code>${SVN_BASICDIR}</code><code>/</code><code>svnlook youngest ${BAKPATH}</code><code>/</code><code>${_check_proejct_}&amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>        </code><code>make_log </code><code>"Project ${_check_proejct_} backup file Invaild.Plz check..."</code>

<code>        </code><code>echo </code><code>"Project ${_check_proejct_} backup file Invaild.Plz check..."</code>

<code>        </code><code>exit </code><code>123</code>

<code>make_log </code><code>"================ End Check ================"</code> <code>&amp;&amp; echo "" &gt;&gt; ${BAKLOG}</code>

<code>tar_bakfile </code><code>"${BAKPATH}"</code>

<code>if</code> <code>[ $? !</code><code>=</code> <code>0</code> <code>];then</code>

<code>    </code><code>make_log </code><code>"Compressed file error."</code>

<code>    </code><code>echo </code><code>"Compressed file error."</code>

<code>    </code><code>exit </code><code>124</code>

<code>else</code>

<code>   </code><code>ftp_upload </code><code>"${BAKPATH##*/}.tgz"</code>

<code>   </code><code>rm_expired </code><code>"${BAKDIR}"</code>

<code>fi</code>

<code># 此腳本對svn的庫進行全備,并且上傳至FTP伺服器保留一份。</code>

2、恢複腳本

<code># Description: Download the backup file and restore from the FTP server</code>

<code># Email:</code>

<code># Require: SVN environment is normal</code>

<code>SVN_USER</code><code>=</code><code>"svn"</code>

<code>YESTERDAY</code><code>=</code><code>`date </code><code>-</code><code>d</code><code>'1 days ago'</code> <code>+</code><code>%</code><code>Y</code><code>%</code><code>m</code><code>%</code><code>d`</code>

<code>SVNDIR</code><code>=</code><code>"/data/svn"</code>

<code>DOWNLOAD_DIR</code><code>=</code><code>"/data/download"</code>

<code>LOGFILE</code><code>=</code><code>"${DOWNLOAD_DIR}/svn_recover.log"</code>

<code>FTPHOST</code><code>=</code><code>"x.x.x.x"</code>

<code>FTPPORT</code><code>=</code><code>"x"</code>

<code>FTPUSER</code><code>=</code><code>"xxx"</code>

<code>FTPPASSWD</code><code>=</code><code>"xxxxxx"</code>

<code>FTPDOCUMENT</code><code>=</code><code>"xxx"</code>

<code>[ ! </code><code>-</code><code>d ${DOWNLOAD_DIR} ] &amp;&amp; mkdir </code><code>-</code><code>p ${DOWNLOAD_DIR}</code>

<code>    </code><code>/</code><code>bin</code><code>/</code><code>echo </code><code>-</code><code>e </code><code>"[ $(date +%Y-%m-%d' '%H:%M:%S) ] ${1}"</code> <code>&gt;&gt; ${LOGFILE}</code>

<code>ftp_download() {</code>

<code>    </code><code>############################</code>

<code>    </code><code># Backup file download</code>

<code>    </code><code>#echo "Start download file: `date`"</code>

<code>mirror </code><code>-</code><code>i ${YESTERDAY}.</code><code>*</code><code>.tgz</code>

<code>    </code><code>cd    </code>

<code>    </code><code>#echo "Download file end: `date`"</code>

<code>extract() {</code>

<code>    </code><code>make_log </code><code>"tar xf *.tgz"</code>

<code>    </code><code>tar xf </code><code>*</code><code>.tgz &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>    </code><code>make_log </code><code>"rm -f *.tgz"</code>

<code>    </code><code>rm </code><code>-</code><code>f </code><code>*</code><code>.tgz &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>ftp_download </code><code>"${DOWNLOAD_DIR}"</code>

<code>if</code> <code>[ `ls ${DOWNLOAD_DIR} | grep </code><code>"tgz$"</code><code>` ];then</code>

<code>    </code><code>extract </code><code>"${DOWNLOAD_DIR}"</code>

<code>    </code><code>BAKDIR</code><code>=</code><code>`ls ${DOWNLOAD_DIR} | grep </code><code>-</code><code>Ev </code><code>"log"</code><code>`</code>

<code>    </code><code>#</code>

<code>    </code><code># Recover SVN Project</code>

<code>    </code><code>make_log </code><code>"=========== [`date +%Y/%m/%d' '%H:%M`] Start Recover ==========="</code>

<code>    </code><code>for</code> <code>_project_ </code><code>in</code> <code>`ls </code><code>-</code><code>lh ${DOWNLOAD_DIR}</code><code>/</code><code>${BAKDIR} | grep </code><code>"^d"</code> <code>| awk </code><code>'{print $NF}'</code><code>`; do</code>

<code>        </code><code>if</code> <code>[ ! </code><code>-</code><code>d ${SVNDIR}</code><code>/</code><code>${_project_} ];then</code>

<code>            </code><code>make_log </code><code>"mkdir -p ${SVNDIR}/${_project_}"</code>

<code>            </code><code>mkdir </code><code>-</code><code>p ${SVNDIR}</code><code>/</code><code>${_project_} &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>        </code><code>else</code>

<code>            </code><code>make_log </code><code>"Project directory exist."</code>

<code>            </code><code>echo </code><code>"Project directory exist."</code>

<code>            </code><code>exit </code><code>127</code>

<code>        </code><code>fi</code>

<code>        </code><code>make_log </code><code>"${SVN_BASICDIR}/svnadmin hotcopy ${DOWNLOAD_DIR}/${BAKDIR}/${_project_} ${SVNDIR}/${_project_}"</code>

<code>        </code><code>${SVN_BASICDIR}</code><code>/</code><code>svnadmin hotcopy ${DOWNLOAD_DIR}</code><code>/</code><code>${BAKDIR}</code><code>/</code><code>${_project_} ${SVNDIR}</code><code>/</code><code>${_project_} &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>        </code><code>make_log </code><code>"${SVN_BASICDIR}/svnlook youngest ${SVNDIR}/${_project_}"</code>

<code>        </code><code>${SVN_BASICDIR}</code><code>/</code><code>svnlook youngest ${SVNDIR}</code><code>/</code><code>${_project_} &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>        </code><code>if</code> <code>[ $? !</code><code>=</code> <code>0</code> <code>];then</code>

<code>            </code><code>make_log </code><code>"Recover Failed."</code>

<code>            </code><code>echo </code><code>"Recover Failed."</code>

<code>            </code><code>exit </code><code>125</code>

<code>    </code><code>done</code>

<code>    </code><code>echo "" &gt;&gt; ${LOGFILE}</code>

<code>    </code><code># Copy configuration file</code>

<code>    </code><code>for</code> <code>_config_file_ </code><code>in</code> <code>`ls </code><code>-</code><code>lh ${DOWNLOAD_DIR}</code><code>/</code><code>${BAKDIR} | grep </code><code>"^-"</code> <code>| awk </code><code>'{print $NF}'</code><code>`; do</code>

<code>        </code><code>#make_log "cp ${DOWNLOAD_DIR}/${BAKDIR}/${_config_file_} ${SVNDIR}"</code>

<code>        </code><code>#make_log "chown svn.svn ${SVNDIR}/${_config_file_}"</code>

<code>        </code><code>cp ${DOWNLOAD_DIR}</code><code>/</code><code>${BAKDIR}</code><code>/</code><code>${_config_file_} ${SVNDIR}</code>

<code>    </code><code>make_log </code><code>"chown -R ${SVN_USER}.${SVN_USER} ${SVNDIR}"</code>

<code>    </code><code>make_log </code><code>"rm -rf ${DOWNLOAD_DIR}/${BAKDIR}"</code>

<code>    </code><code>rm </code><code>-</code><code>rf ${DOWNLOAD_DIR}</code><code>/</code><code>${BAKDIR}</code>

<code>    </code><code>chown </code><code>-</code><code>R ${SVN_USER}.${SVN_USER} ${SVNDIR} &amp;&gt; </code><code>/</code><code>dev</code><code>/</code><code>null</code>

<code>    </code><code>make_log </code><code>"=========== [`date +%Y/%m/%d' '%H:%M`] Recover Finish ==========="</code>

<code>    </code><code>#echo "Recover SVN Project successfull."</code>

<code>    </code><code>make_log </code><code>"Download Backup File Failed."</code>

<code>    </code><code>echo </code><code>"Download Backup File Failed.Plz Check..."</code>

<code>    </code><code>exit </code><code>122</code>

<code># 從FTP的伺服器下載下傳備份腳本,并自動恢複到指定目錄</code>

有可能有很多不是很完善,如需要可以自己随便改改就行了。

本文轉自Mr_陳 51CTO部落格,原文連結:http://blog.51cto.com/chenpipi/1613242,如需轉載請自行聯系原作者

繼續閱讀