發新話題
打印

[轉貼]linux資料備份

[轉貼]linux資料備份

http://linux-dindin.blogspot.com/2009/10/linux_27.html

linux資料 備份

備份/home下的所有資料
  • #date +%Y%m%d-%H%M --->要用日期做檔名
  • #tar cvfz `date +%Y%m%d-%H%M`.tar.gz /home
增量備份-第二天備份只備份增加的部份,免得備份檔太大
  • 在備份完成後建立新檔案,做一個時間戳記
    • #touch /home/timemark
  • 找出比timemark更晚建立的檔案
    • #find /home -newer timemark
  • 建立新備份
    • #tar cvfz `date +%Y%m%d-%H%M`.tar.gz `find /home -newer timemark`
  • 以上寫成.sh檔案,放到crontab就可以每天自動執行了
linux異地備份
serverA利用 public/privare key來保障傳送備份資料 serverB的安全
1.需要什麼服務?可以利用ssh/scp
2.如何全自動?寫成shell script

serverA
  • 建立key
    • #ssh-keygen -t rsa
    • Generating public/private rsa key pair.
    • Enter file in which to save the key (/root/.ssh/id_rsa): --->把key放這
    • Created directory '/root/.ssh'.
    • Enter passphrase (empty for no passphrase):--->輸入key的密碼(空白也可)
    • Enter same passphrase again:
    • Your identification has been saved in /root/.ssh/id_rsa.
    • Your public key has been saved in /root/.ssh/id_rsa.pub.
    • The key fingerprint is:
    • f6:32:90:e2:e7:03:c8:c1:a4:99:0b:3e:a1:73:3c:48 root@localhost.localdomain
  • 傳送public key到serverB的家目錄
    • #cd /root/.ssh
    • #scp id_rsa.pub root@serverBIP:~/
serverB
  • #cd~
  • #mkdir /root/.ssh
  • #cat id_rsa.pub >> .ssh/authorized_keys
Note:
如果有問題可檢查log
/var/log/secure

TOP

backup script 說明

http://www.techbang.com.tw/posts/306

 

電腦王51期「Linux灌後餘生」參考資料

作者:pcadv 發表於 2008-10-13 12:30

Script程式範例下載

部份程式解說

實作「backup.sh」
#!/bin/bash

#設定備份資料保存天數
reserveday=30

#設定完全備份天數
fullbackupday=7

#避免重複執行備份程式
[ -e "/tmp/backup.lst" -o "`whoami`" != "root" ] && exit
[ ! -d "/backup" ] && mkdir “/backup”

ls –full-time “/backup” | tr -s ” ” | sed 1d > “/tmp/backup.lst”

利用ls指令將之前的備份檔清單用stdout的方式重新導入/tmp/backup.lst成為一個純文字檔,並且在導入當中利用sed指令配合參數1d刪除掉第一行的「總計 XXXX」敘述,讓backup.lst清單檔內只留下檔案清單

#在此設定要備份的目錄
for backupdir in “/etc” “/home”
do
#找尋備份目錄最下層目錄名稱做為備份檔主檔名
i=2
while [ "`echo $backupdir | cut -d "/" -f "$i"`" ]
do
i=$(($i+1))
done
backupdirtail=”`echo $backupdir | cut -d “/” -f “$(($i-1))”`”

這裡我們利用一個迴圈,簡單的從備份路徑抓備份目錄名稱,放進backupdirtail變數做為備份檔的儲存檔案

#判斷要進行完全備份還是增量備份
i=1
while [ "$i" -le "`cat "/tmp/backup.lst" | wc -l`" ]
do
backupname=”`sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 6`”
if [ "`date -d $backupname +%s`" -ge "`date -d "$fullbackupday days ago" +%s`" ]; then

利用wc指令計算截取的backup.lst備份檔案清單行數,再代入while迴圈中。然後用sed指令取出每一行的內容,再利用grep指令判斷該行所指出的檔案是否為一個fullback檔案,並且是否為目前備份的目錄。如果條件符合,則製作增量備份清單後開始進行增量備份

#有找到完全備份檔,進行增量備份後結束
if [ "`sed -n "$i"p "/tmp/backup.lst" | grep "fullbackup" | grep "$backupdirtail"`" ]; then
#製作增量備份檔清單
find “$backupdir” -newer “last_backup_time” -type f > /tmp/incbackup.lst 2> /dev/null

if [ -s "/tmp/incbackup.lst" ]; then
#製作已移除檔案清單
sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 9 > “/tmp/tmpfile1″
tar tf “/backup/`cat “/tmp/tmpfile1″`” | awk ‘{print “/”$0}’ > “/tmp/tmpfile2″
j=1
while [ "$j" -le "`cat "/tmp/tmpfile2" | wc -l`" ]
do
[ ! -e "`sed -n "$j"p "/tmp/tmpfile2"`" ] && sed -n “$j”p “/tmp/tmpfile2″ >> “/backup/$backupdirtail`date +%Y-%m-%d`.rm.lst”
j=$(($j+1))
done

這裡我們是利用sed指令的格式化功能代入迴圈$i的變數擷取出每行內容,再配合cut指令擷取/tmp/backup.lst純文字檔清單中的檔名欄位,然後利用awk指令將取出的檔案及路徑最前面加上根目錄位置「/」

接著再取出已經備份的檔案清單並且與新增檔案相比較,如果檔案不存在原本的備份清單中,則將檔案記錄起來,以便還原時能根據清單設定值還原原本的檔案狀態

#根據清單備份並加上日期
tar zcf “/backup/$backupdirtail`date +%Y-%m-%d`.tar.gz” -T “/tmp/incbackup.lst” 2> “/dev/null”
fi
rm “/tmp/incbackup.lst”
break
fi
fi
i=$(($i+1))
done

根據上面製作的新進檔案清單incbackup.lst內容將新進檔案備份起來

#進行完全備份
if [ "$i" -gt "`cat "/tmp/backup.lst" | wc -l`" ]; then
tar zcf “/backup/$backupdirtail”"`date +%Y-%m-%d`.fullbackup.tar.gz” “$backupdir” 2> “/dev/null”

如果在上面的迴圈當中都沒有找到之前備份的封裝檔的話,變數i會一直累加直到超過backup.lst備份清單檔總行數才會脫離迴圈,這裡我們只要判斷變數是否i超過了backup.lst備份清單檔總行數,如果是,則表示沒有找到完全備份封裝,所以開始進行完全備份作業

#移除超過保存天數的備份檔
i=1
while [ "$i" -le "`cat "/tmp/backup.lst" | wc -l`" ]
do
backupname=”`sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 6`”
if [ "`date -d $backupname +%s`" -lt "`date -d "$(($reserveday-$fullbackupday)) days ago" +%s`" ]; then
rm “/backup/`sed -n “$i”p “/tmp/backup.lst” | cut -d ” ” -f 9`” 2> “/dev/null” || break
fi
i=$(($i+1))
done
fi
done

在程序運作當中,有時會出現指令是否成功執行或失敗原因等等的訊息,因為我們的程序已經盡可能針對所有情況撰寫了相關判斷,所以考慮美觀因素,我們將這些訊息重新導向到/dev/null這個虛擬裝置檔案
另外,利用date指令取出備份檔案封裝的建立時間,並且與程序一開始所設定的時間作比較,如果資料保存的天數超過了設定的日期,則將該備份封裝檔案移除

TOP

發新話題