上一篇介绍了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 &> </code><code>/</code><code>dev</code><code>/</code><code>null && echo </code><code>"Lftp command does not exist,Plz install lftp."</code> <code>&& exit </code><code>128</code>
<code>[ ! </code><code>-</code><code>d </code><code>"${BAKPATH}"</code> <code>] && 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>>> ${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##*/} &> /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>##*/} &> /dev/null</code>
<code> </code><code>cd</code>
<code> </code><code>echo "" >> ${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 << 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>] && echo </code><code>"Configuration file backup failed..."</code> <code>>> ${BAKLOG} && 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 && 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_} &> </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>&& echo "" >> ${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_}&> </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>&& echo "" >> ${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} ] && 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>>> ${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 &> </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 &> </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_} &> </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_} &> </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_} &> </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 "" >> ${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} &> </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,如需转载请自行联系原作者