1、備份規則:
在生產環境中有若干服務器需要定時將服務器中應用程序,以及數據庫等進行備份。要求在本地服務器中保存近一周的備份,備份服務器中保存最近一月的備份文件。
以服務器A為例:在服務器A上有應用程序業務及(/ucap/UServer_V5.5.1_5002),有數據庫業務(mongodb和mysql)需要將以上三個業務進行備份,且在A服務器上創建backup-dir將備份文件存放在目錄下,每日凌晨進行備份,並將備份文件上傳至備份服務器(NFS),在平時備份服務器與服務器A不會有聯系,即只是在上傳備份文件,服務器A自動掛載備份文件共享目錄,備份完成卸載目錄。本地服務器保存近一周文件,備份服務器保存近30日備份文件。
2、具體實現如下步驟:

1 #delet backup when is sunday 周日刪除上周文件。 2 WEEK=$(date +%w) 3 BACKUP_ROOT=/backup 4 BACKUP_DIR=/backup/backup_full_`date +%F` 5 if [ -e $BACKUP_ROOT ] 6 then 7 cd $BACKUP_ROOT #如果/backup目錄存在,進入目錄。 8 if [ $WEEK -eq 0 ] 9 then 10 rm -rf $BACKUP_ROOT/* #如果進入是星期天(0表示星期天)執行刪除/backup下所有的備份文件。 11 fi 12 if [ $? -eq 0 ] #判斷是否刪除成功 13 then 14 action "old-backup is remove." /bin/true 15 fi 16 17 fi 18 ####mkdir backup-dir #創建本地備份目錄。如果目錄存在則輸出目錄已經存 19 #在,否則表示不存在目錄則創建包含時間的目錄文件目錄 20 if [ -e $BACKUP_DIR ] 21 then 22 action "$BACKUP_DIR had been created." /bin/true 23 else 24 #含當前時間的目錄文件實際可以用$BACKUP_DIR 25 mkdir -p /backup/backup_full_`date +%F` 26 action "$BACKUP_DIR is creating." /bin/true 27 fi
注意:周日刪除必須在創建當天目錄之前。因為一旦先創建目錄在刪除文件由於使用的是rm -rf $BACKUP_ROOT/*意思是將本地備份目錄下的所有文件刪除,所有新創建的目錄也會被刪除。因此應該執行先刪除再創建。

1 ###tar backup /ucap/UServer_V5.5.1_5002 2 CMSP=/ucap 3 cd $CMSP 4 FILE_UCM=UServer_V5.5.1_5002 5 #使用tar -g快照功能進行備份將快照snapshot.cms也存放在備份目錄下,然后將備份文件按照ip地址以及日期進行打包存放在備份目錄下的當日文件目錄下。 6 tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null 2>&1 7 8 if [ $? = 0 ] #判斷是否執行成功。 9 then 10 action "$FILE_UCM is backup." /bin/true 11 else 12 action "$FILE_UCM is no been backuped." /bin/true 13 fi 14 ###tar backup /ucap/mongodb 15 CMSP=/ucap 16 cd $CMSP 17 FILE_UCM=mongodb 18 #備份規則同上。 19 tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null 2>&1 20 21 if [ $? = 0 ] 22 then 23 action "$FILE_UCM is backup." /bin/true 24 else 25 action "$FILE_UCM is no been backuped." /bin/true 26 fi

1 #parameter defined 2 BAKDATE=`date +%F` 3 MYSQL_PATH=/usr/local/mysql/bin 4 MYUSER=root 5 MYPASS="Ucap7890&*()" 6 #DBNAME=`mysql -uroot -p'Ucap7890&*()' -e "show databases;"|grep cpmdb` 7 DATA_FILE=${BACKUP_DIR}/mysql_backup_${BAKDATE}.sql.gz 8 [ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR} 9 #command defined 10 #定義mysqldump命令備份cpmdb庫並進行行鎖 11 MYSQL_DUMP="${MYSQL_PATH}/mysqldump -u$MYUSER -p$MYPASS -S /tmp/mysql.sock -F -B cpmdb --single-transaction -e" 12 #backup command#執行命令並用GZI打包至備份目錄當前日期下的文件中。 13 ${MYSQL_DUMP} | gzip > $DATA_FILE

1 #####copye backup_tar to backup_server 2 BACKUP_SERVER=23.202.1.23:/backup/Search #NFS備份服務器 3 LOCAL_DIR=/backup1 #本地掛載點 4 RPC_PID=`/etc/init.d/rpcbind status|wc -l` #判斷RPC 5 MOUNT_STATUS=`df -h | grep backup1 | wc -l` #判斷是否已經掛載 6 BACKUP_FILEDIR=backup_full_`date +%F` 7 SERVER_IP=`ifconfig| grep Bcast|awk '{print $2}'` #本機IP 8 if [ ! -e ${LOCAL_DIR} ] #判斷掛載點目錄是否存在 9 then 10 mkdir ${LOCAL_DIR} 11 fi 12 13 if [ ${RPC_PID} -eq 0 ] #判斷RPC-BIND是否啟動沒有啟動執行啟動 14 then 15 /etc/init.d/rpcbind start 16 fi 17 if [ $MOUNT_STATUS -eq 0 ] #判斷NFS是否掛載沒有掛載執行掛載 18 then 19 mount -t nfs ${BACKUP_SERVER} ${LOCAL_DIR} 20 cd ${LOCAL_DIR} #進入掛載目錄 21 find ${LOCAL_DIR} -mtime +30 -exec rm{} \; #刪除30天以前文件 22 if [ `find ${LOCAL_DIR} -mtime +30 -exec ls{} \;|wc -l` -eq 0 ] #如果沒有了30天前的文件將本地備份目錄下的備份文件備份至備份服務器。 23 then 24 cd $BACKUP_ROOT 25 cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/ 26 fi 27 if [ $? -eq 0 ] #判斷執行是否成功,成功后卸載掛載目錄。 28 then 29 umount -l ${LOCAL_DIR} 30 fi 31 else #表示已經掛載了NFS備份服務器執行刪除備份卸載。 32 cd ${LOCAL_DIR} 33 find ${LOCAL_DIR} -mtime +30 -exec rm{} \; 34 cd $BACKUP_ROOT 35 cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/ 36 umount -l ${LOCAL_DIR} 37 exit 1 38 fi
3、整個腳本,由於本分腳本中含有數據庫密碼所有在最好做判斷只有root用戶才能執行腳本。

1 #!/bin/bash 2 ########################################## 3 # this script is created by xuxuedong. # 4 # e_mail:365***746@qq.com # 5 # qqinfo:365***746 # 6 # This is backup the fiel for the server. # 7 # version:1.1 # 8 ########################################## 9 . /etc/init.d/functions 10 #set env 11 export PATH=$PATH:/bin:/sbin:/usr/sbin 12 export LANG="zh_CN.GB18030" 13 14 # Require root to run this script. 判斷是否是root用戶執行。 15 if [[ "$(whoami)" != "root" ]]; then 16 echo "Please run this script as root." >&2 17 exit 1 18 fi 19 20 # Source function library. 21 #. /etc/init.d/functions 22 WEEK=$(date +%w) 23 BACKUP_ROOT=/backup 24 BACKUP_DIR=/backup/backup_full_`date +%F` 25 if [ -e $BACKUP_ROOT ] 26 then 27 cd $BACKUP_ROOT 28 if [ $WEEK -eq 0 ] 29 then 30 rm -rf $BACKUP_ROOT/* 31 fi 32 if [ $? -eq 0 ] 33 then 34 action "old-backup is remove." /bin/true 35 fi 36 else 37 echo "Time is not, cannot be deleted." /bin/false 38 39 fi 40 ####mkdir backup-dir 41 if [ -e $BACKUP_DIR ] 42 then 43 action "$BACKUP_DIR had been created." /bin/true 44 else 45 mkdir -p /backup/backup_full_`date +%F` 46 action "$BACKUP_DIR is creating." /bin/true 47 fi 48 ###tar backup /ucap/UServer_V5.5.1_5002 49 CMSP=/ucap 50 cd $CMSP 51 FILE_UCM=UServer_V5.5.1_5002 52 tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null 2>&1 53 54 if [ $? = 0 ] 55 then 56 action "$FILE_UCM is backup." /bin/true 57 else 58 action "$FILE_UCM is no been backuped." /bin/true 59 fi 60 ###tar backup /ucap/mongodb 61 CMSP=/ucap 62 cd $CMSP 63 FILE_UCM=mongodb 64 tar -g $BACKUP_ROOT/snapshot.cms -cvf $BACKUP_DIR/${FILE_UCM}_ip_1.25_backup.$(date +%F).tar $FILE_UCM >/dev/null 2>&1 65 66 if [ $? = 0 ] 67 then 68 action "$FILE_UCM is backup." /bin/true 69 else 70 action "$FILE_UCM is no been backuped." /bin/true 71 fi 72 #parameter defined 73 BAKDATE=`date +%F` 74 MYSQL_PATH=/usr/local/mysql/bin 75 MYUSER=root 76 MYPASS="Ucap7890&*()" 77 #DBNAME=`mysql -uroot -p'Ucap7890&*()' -e "show databases;"|grep cpmdb` 78 DATA_FILE=${BACKUP_DIR}/mysql_backup_${BAKDATE}.sql.gz 79 [ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR} 80 #command defined 81 MYSQL_DUMP="${MYSQL_PATH}/mysqldump -u$MYUSER -p$MYPASS -S /tmp/mysql.sock -F -B cpmdb --single-transaction -e" 82 #backup command 83 ${MYSQL_DUMP} | gzip > $DATA_FILE 84 85 #####copye backup_tar to backup_server 86 BACKUP_SERVER=23.202.1.23:/backup/Search 87 LOCAL_DIR=/backup1 88 RPC_PID=`/etc/init.d/rpcbind status|wc -l` 89 MOUNT_STATUS=`df -h | grep backup1 | wc -l` 90 BACKUP_FILEDIR=backup_full_`date +%F` 91 SERVER_IP=`ifconfig| grep Bcast|awk '{print $2}'` 92 if [ ! -e ${LOCAL_DIR} ] 93 then 94 mkdir ${LOCAL_DIR} 95 fi 96 97 if [ ${RPC_PID} -eq 0 ] 98 then 99 /etc/init.d/rpcbind start 100 fi 101 if [ $MOUNT_STATUS -eq 0 ] 102 then 103 mount -t nfs ${BACKUP_SERVER} ${LOCAL_DIR} 104 cd ${LOCAL_DIR} 105 find ${LOCAL_DIR} -mtime +30 -exec rm{} \; 106 if [ `find ${LOCAL_DIR} -mtime +30 -exec ls{} \;|wc -l` -eq 0 ] 107 then 108 cd $BACKUP_ROOT 109 cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/ 110 fi 111 if [ $? -eq 0 ] 112 then 113 umount -l ${LOCAL_DIR} 114 fi 115 else 116 cd ${LOCAL_DIR} 117 find ${LOCAL_DIR} -mtime +30 -exec rm{} \; 118 cd $BACKUP_ROOT 119 cp -r ${BACKUP_FILEDIR} ${LOCAL_DIR}/ 120 umount -l ${LOCAL_DIR} 121 exit 1 122 fi