標籤:使用 strong os 檔案 資料 art
一、概述
前幾天我通過SSH正在調戲湯姆貓(tomcat)的時候,伺服器上CentOS突然掛了。開機grub,使用光碟片linux rescue修複提示找不到linux分區,然後想mount硬碟備份系統的時候提示硬碟無法掛載。沒有辦法只能重裝系統。吃一塹長一智,決定定期備份下系統。
何時進行備份?
每天晚上12:00
備份到哪?
顯然備份到系統所在磁碟不是明智之舉,使用者應該備份到外接硬碟或者磁帶上面。
為了讓文章看上去更簡單,本文所做的例子並沒有備份到外接裝置上,而是在/backup目錄下。
要備份什嗎?
備份整個系統需要佔用大量的磁碟空間,所以我決定只有星期天的時候對系統進行全部備份,其他時間備份重要的資料。
備份整個系統,因此這裡需要考慮的是不必備份的目錄:
/backup
/proc
/lost+found
/sys
/mnt
/media
/dev
/tmp
備份的資料:
/home (你懂的)
/work (我的工作目錄)
/opt (軟體安裝目錄)
/var/lib/mysql (mysql資料檔案目錄)
另外還需要保持一些重要的設定檔:
/etc/profile (各種環境變數)
/etc/bashrc (各種環境變數)
/etc/crontab (設定定時備份)
/etc/fstab (存放檔案系統資訊,其實我備份檔案是存放在其他磁碟的,磁碟的掛載在這裡設定)
備份方式
tar支援三種方式進行備份:
1.完整備份:備份指定的所有目標檔案或檔案夾
2.增量備份:僅備份atime與上次備份不同的檔案或檔案夾
3.差異備份:與增量備份差不多,只是增加了對Windows檔案系統的支援
我這裡選擇完整備份
何時刪除?
系統備份資料儲存兩周,資料備份儲存一周
二、基礎知識atime,ctime,mtime
UNIX系統將時間分為三種:
atime(Access time):檔案上次被訪問時間。ls -lu查看
ctime(status Change time):檔案的屬性或內容上次被修改的時間。ls -lc查看
mtime(Modified time):檔案的內容上次被修改的時間。ls -l查看
需要說明的是Linux 檔案系統從來不隱藏檔建立時間。
為了方便查看各種時間,這裡提供一個指令碼
#!/bin/bash#用法:指令碼名 檔案if [ $# != 1 ];then echo "輸入參數不正確,需要輸入一個檔案" exit 1fifile=$1if [ ! -f "$file" ]; then echo "$file 檔案不存在" else echo "ctime(status Change time): $(ls -lc $file | awk ‘{print $6, $7, $8}‘)" echo "atime(Access time): $(ls -lu $file | awk ‘{print $6, $7, $8}‘)" echo "mtime(Modified time): $(ls -l $file | awk ‘{print $6, $7, $8}‘)" fi
利用cron定時備份
建立cron計劃任務非常簡單,以下方法都可以完成:
方法一:
$ crontab -e
方法二:
# vim /etc/crontab
方法一隻能以目前使用者的許可權運行計劃的任務;方法二可以指定程式以哪個使用者執行,但是必須以root身份編輯該檔案。
在此,因為要對整個檔案系統進行備份,因此僅以/etc/crontab為例進行介紹:
# m h dom mon dow user command
0 0 * * * root /work/mybin/backup.sh
這行配置表明,在每天0:00分執行/work/mybin/backup.sh這個指令碼
這樣設定後如果無效,需要service crond reload以及service crond restart命令重讀設定檔以及重啟服務來生效。
三、指令碼
#!/bin/bash##星期天進行系統全部備份,其他時間進行部分資料備份。DATA="/work /home /opt /var/lib/mysql /etc/profile /etc/bashrc /etc/crontab /etc/fstab "DATA_VALI=7 #資料檔案有效期間SYS_VALI=14 #系統檔案有效期間set $(date)if test "$1" = "Sun" ; thentar -czvpf "/backup/system_backup_$6-$2-$3.tar.gz" --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/tmp / else tar -czpvf "/backup/data_backup_$6-$2-$3.tar.gz" $DATAfifind /backup -type f -name "data*" -mtime +$DATA_VALI -exec rm -rf {} \;find /backup -type f -name "system*" -mtime +$SYS_VALI -exec rm -rf {} \;
這裡說明兩點
data時間格式問題:
我的linux環境是中文的,shell終端或shell指令碼中執行date命令,得出的結果都是這樣的:
2013年 05月 21日 星期二 10:13:56 CST
但是在crontab定期執行shell指令碼中,得出的結果卻是這樣的:
Tue May 21 10:13:56 CST 2013
所以判斷是否是星期天的是才用”if test “$1″ = “Sun” ; then”
find與mtime
find可以根據時間進行尋找。atime,ctime和mtime上面已經講過了,這裡說明下-mtime後面加的數字。
1.直接上數字
表示距離目前時間第幾天的檔案。需要注意是這個時間不是按照日期的,是根據從目前時間(2013年5月21日13:19:10)向前推24小時表示0.也就是0表示24小時內修改過的檔案,1表示24-48小時內修改過的檔案,2表示48-72小時修改過的檔案。
2.+數字
表示幾天以外的修改過的檔案,+1表示1天以外修改過的檔案(距離現在>48小時),+2表示2天以外修改過的檔案(距離現在>72小時)
3.-數字
表示幾天以內的修改過的檔案,-1表示1天以內修改過的檔案(距離現在<24小時),-2表示2天以內修改過的檔案(距離現在<48小時)