備份與恢復對於系統維護而言是相當重要的事情。不合理的備份與還原會讓你的數據面臨丟失的風險。許多用戶都在丟失重要數據後才意識到這種風險。而要從這種狀況恢復數據將是很是耗時而且困難的。因此咱們應該從別人的錯誤中吸收教訓,並確保你的系統處於保護中。先考慮一些問題:
數據庫
若是你能夠接受一個星期的數據丟失,那麼每週備份一次就足夠了。可是若是你只能容忍一天的數據損失,那麼你就必須天天晚上進行備份。 安全
顯然備份到系統所在磁盤不是明智之舉,用戶應該備份到外接硬盤或者磁帶上面。
爲了讓文章看上去更簡單,本文所作的例子並無備份到外接設備上,而是在/backup目錄下。 bash
咱們要備份整個系統,所以這裏須要考慮的是沒必要備份的目錄: 網絡
tar支持三種方式進行備份:
1.完整備份:備份指定的全部目標文件或文件夾
2.增量備份:僅備份atime與上次備份不一樣的文件或文件夾
3.差別備份:與增量備份差很少,只是增長了對Windows文件系統的支持 dom
本文主要闡述如何用tar對系統進行增量備份,以及如何利用cron設置定時備份。 ssh
Linux的文件系統會記錄如下三種時間
mtime: 文件修改時間。當文件內容呢發生改變時更新。 ls -l默認顯示mtime
atime: 文件訪問時間。當文件被訪問時自動更新。要查看文件的atime,執行ls -lu。
/!\注意:atime可能在tar進行備份時可能發生變化(和文件系統和tar版本有關),能夠用–atime-preserve防止這種更新。
ctime: 文件屬性修改時間。當文件屬性或權限發生變化時更新。要查看文件的atime,執行ls -lc。 加密
GNU tar使用--listed-incremental選項(縮寫爲-g)進行增量備份: spa
tar -czvpf /backup/backup.tar.gz -g /backup/snapshot.snar \
--exclude=/backup --exclude=/proc --exclude=/lost+found \
--exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev \
--exclude=/tmp /
1.最後一個斜槓「/」告訴tar要從根目錄進行備份。
2.tar很是依賴atime,如下狀況會致使歸檔數據文件不一致:
(1)備份期間對文件的任何訪問
(2)備份期間將系統時間調慢
3.tar假設待備份的文件所在磁盤設備ID是不變的,但NFS等某些文件系統並不屬於這種狀況,能夠用--no-check-device阻止tar進行檢查
4.除非狀況緊急,而且你充分信任tar,不然你最好在備份時使用--verify選項(縮寫爲-W)以確保數據正確地進行備份。但不幸的是它並不支持全部的存儲介質(好比磁帶)。 code
–listed-incremental(縮寫爲-G)是該參數是–listed-incremental(縮寫爲-g)的快捷選項,不須要指定增量文件。它也是舊版本的tar增量備份遺留下來的。如今經常用於解壓增量備份,或者列出增量備份的文件列表。
-G與-g相比,-g能經過複製snar文件的方式建立多層次的增量備份文件,而-G卻只能用level0 crontab
tar -tGvvf backup.tar.gz
-t 等價於 –list
-Gvv 一種固定用法,列出文件屬性的同時還顯示備份屬性:
Y – 該文件在歸檔文件中
N – 該文件不在歸檔文件中
D – 文件夾
數據恢復無需爲tar指定增量文件snar,由於tar所需的信息已經包含在打包的文件中了。
要恢復數據,如下三種方式都是可行的:
將增量文件指定爲/dev/null
tar -xzvpf /backup/backup.tar.gz -g /dev/null -C /
使用--incremental參數(縮寫爲-G)
tar -xzvpGf /backup/backup.tar.gz -C /
某些狀況下,你還能夠省略-G選項,但這不是推薦的版本:
tar -xzvpf /backup/backup.tar.gz -C /
新建cron計劃任務很是簡單,如下方法均可以完成:
$ crontab -e
# vi /etc/crontab
在筆者的Linux上,方法一隻能以當前用戶的權限運行計劃的任務;方法二能夠指定程序以哪一個用戶執行,可是必須以root身份編輯該文件。
在此,由於要對整個文件系統進行備份,所以僅以/etc/crontab爲例進行介紹:
# m h dom mon dow user command 1 3 * * * root /root/scripts/daily_backup
這行配置代表,在天天3:01分執行/root/scripts/daily_backup這個腳本里的文件。
以前有人使用cpio進行備份,可是後來發現cpio格式沒法提取單個文件。可是tar也有本身的缺點:
1.它過分依賴於atime
2.若是將歸檔文件恢復到一個新的文件系統中,全部文件的atime和ctime都被刷新。對於新系統,舊的增量備份文件再也不適用,得從新作一遍。
相比之下,rsync彷佛很好解決這個問題,並且具備較快的速度。
而dump是全部流行的備份軟件中對文件完整性表現最好的[3]
本代碼完成如下任務:
/!\注意:請將本腳本放置在/backup目錄下運行
[bash]
#!/bin/bash
# system backup
# Sun Feb 19 00:34:42 CST 2012
# by lesca
# Read db file and config
if [ -f "bkdb" ]; then
eval `grep VER bkdb`
eval `grep NAME bkdb`
OLD=$VER
NEW=$((OLD+1))
else
NEW=0
fi
DATE=`date +%Y%m%d-%H%M%S`
BKFILE=$DATE-$NEW.tar.gz
NEWSNAP=$DATE-$NEW.snar
OLDSNAP=$NAME.snar
# Create new snapshot
if [ -e "$OLDSNAP" ]; then
cp $OLDSNAP $NEWSNAP
fi
tar -czvpf /backup/$BKFILE -g /backup/$NEWSNAP –exclude=/backup –exclude=/proc –exclude=/lost+found –exclude=/sys –exclude=/mnt –exclude=/media –exclude=/dev –exclude=/tmp /
echo VER=$NEW > bkdb
echo NAME=$DATE-$NEW >> bkdb
echo Archived $BKFILE with snapshot $NEWSNAP
[/bash]
本代碼完成如下任務:
/!\注意:還原會刷新atime和ctime
[bash]
#!/bin/bash
end() {
echo $1
exit
}
nameOf() {
ls -1 | grep $1.tar.gz | cut -c1-15
}
if [ -f "bkdb" ]; then
eval `grep VER bkdb`
if [ $# -eq "1" ] && [ $1 -le $VER ]; then
VER=$1
fi
else
end "Error: No backup archives."
fi
ver=0
while [ $ver -le "$VER" ]; do
ARCHIVE=`nameOf $ver`-$ver.tar.gz
echo $ARCHIVE
tar -xzvpGf $ARCHIVE -C /
ver=$((ver+1))
done
NAME=`nameOf $VER`-$VER
echo VER=$VER > bkdb
echo NAME=$NAME >> bkdb
if [ ! -e /proc ]; then
mkdir /proc
fi
if [ ! -e /lost+found ]; then
mkdir /lost+found
fi
if [ ! -e /sys ]; then
mkdir /sys
fi
if [ ! -e /mnt ]; then
mkdir /mnt
fi
if [ ! -e /media ]; then
mkdir /media
fi
if [ ! -e /dev ]; then
mkdir /dev
fi
if [ ! -e /tmp ]; then
mkdir /tmp
fi
[/bash]
本代碼[4]完成如下任務:
[bash]
#!/bin/bash
#
# creates backups of essential files
#
DATA="/home /root /usr/local/httpd"
LIST="/tmp/backlist_$$.txt"
#
set $(date)
#
if test "$1" = "Sun" ; then
# weekly a full backup of all data and config. settings:
#
tar -czvf "/backup/data/data_full_$6-$2-$3.tgz" $DATA
rm -f /backup/data/data_diff*
else
# incremental backup:
#
find $DATA -depth -type f \( -ctime -1 -o -mtime -1 \) -print > $LIST
tar -czTvf "backup/data/data_diff_$6-$2-$3.tgz" "$LIST"
rm -f "$LIST"
fi
[/bash]
建立時分割:
tar -cvpz <put options here> / | split -d -b 3900m - /name/of/backup.tar.gz
建立後分割:
split -d -b 3900m /path/to/backup.tar.gz /name/of/backup.tar.gz
發送端
tar -czvp <all other options> / | nc -q 0 <receiving host> 1024
接收端
nc -l 1024 > backup.tar.gz
/!\注意:因爲經過網絡備份tar再也不須要參數-f執行備份檔案名稱,該名稱由接收端的nc重定向指定
{i}參數說明:
-q 0: wait 0 second on QUIT
-l 1024: Listen port 1024
發送端
cat backup.tar.gz | nc -q 0 <receiving host> 1024
接收端
nc -l 1024 | tar -xzvpf - -C /
在安裝了SSH服務的主機(SSH Server)上,客戶端只需直接發起鏈接並傳送命令到目標計算機(SSH Server),就能完成操做。全部數據經過「管道」傳送,用戶不須要了解經過哪一個端口備份(固然您也能夠自行指定),並且全部傳輸的數據都是加密的。所以經過SSH備份,更安全、更方便、只需一人就能完成備份工做。請在準備備份的計算機上執行如下命令:
tar -cvpz <all other options> / | ssh <backuphost> "( cat > ssh_backup.tar.gz )"
要恢復文件,請執行如下命令:
cat ssh_backup.tar.gz | ssh <receivinng host> "( tar -xzvp -C / )"