linux备份策略
时间:2009-08-05 来源:boypicc
作業系統本身需要備份的檔案:
這方面的檔案主要跟『帳號與系統設定檔』有關係! 主要有哪些帳號的檔案需要備份呢?就是 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /home 底下的使用者家目錄等等, 而由於 Linux 預設的重要參數檔都在 /etc/ 底下,所以只要將這個目錄備份下來的話, 那麼幾乎所有的設定檔都可以被保存的
/home 目錄是一般用戶的家目錄,自然也需要來備份一番!再來,由於使用者會有郵件吧!所以呢,這個 /var/spool/mail/ 內容也需要備份呦!另外,由於如果你曾經自行更動過核心,那麼 /boot 裡頭的資訊也就很重要囉!所以囉,這方面的資料你必須要備份的檔案為:
- /etc/ 整個目錄
- /home 整個目錄
- /var/spool/mail
- /boot
- /root
- 如果你自行安裝過其他的套件,那麼 /usr/local/ 或 /opt 也最好備份一下!
網路服務的資料庫方面
- 軟體本身的設定檔案,例如:/etc/ 整個目錄,/usr/local/ 整個目錄
- 軟體服務提供的資料,以 WWW 及 MySQL 為例:
WWW 資料:/var/www 整個目錄或 /srv/www 整個目錄,及系統的使用者家目錄
MySQL : /var/lib/mysql 整個目錄 - 其他在 Linux 主機上面提供的服務之資料庫檔案!
推薦需要備份的目錄
由上面的介紹來看的話,如果你的硬體或者是由於經費的關係而無法全部的資料都予以備份時, 鳥哥建議你至少需要備份這些目錄呦!
- /boot
- /etc
- /home
- /root
- /usr/local(或者是 /opt 及 /srv 等)
- /var(註:這個目錄當中有些暫存目錄則可以不備份!)
不需要備份的目錄:
- /dev :這個隨便你要不要備份
- /proc:這個真的不需要備份啦!
- /mnt 與 /media:如果你沒有在這個目錄內放置你自己系統的東西,也不需要備份
- /tmp :幹嘛存暫存檔!不需要備份!
完整備份之差異備份 (Differential backup)
差異備份常用的工具與累積備份差不多!因為都需要完整備份嘛!如果使用 dump 來備份的話,那麼每次備份的等級 (level) 就都會是 level 1 的意思啦!當然啦,你也可以透過 tar 的 -N 選項來備份喔!如下所示:
root@www ~]# tar -N '2009-06-01' -jpcv -f /backupdata/home.tar.bz2 /home
# 只有在比 2009-06-01 還要新的檔案,在 /home 底下的檔案才會被打包進 home.bz2 中!
# 有點奇怪的是,目錄還是會被記錄下來,只是目錄內的舊檔案就不會備份
(tar -jpcv -f mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql )
我的備份策略是這樣的:
- 主機硬體:使用一個獨立的 filesystem 來儲存備份資料,此 filesystem 掛載到 /backup 當中;
- 每日進行:目前僅備份 MySQL 資料庫;
- 每週進行:包括 /home, /var, /etc, /boot, /usr/local 等目錄與特殊服務的目錄;
- 自動處理:這方面利用 /etc/crontab 來自動提供備份的進行;
- 異地備援:每月定期的將資料分別 (a)燒錄到光碟上面 (b)使用網路傳輸到另一部機器上面。
每週系統備份的 script
root@www ~]# vi /backup/backupwk.sh
#!/bin/bash
# ====================================================================
# 使用者參數輸入位置:
# basedir=你用來儲存此腳本所預計備份的資料之目錄(請獨立檔案系統)
basedir=/backup/weekly <==您只要改這裡就好了!
# ====================================================================
# 底下請不要修改了!用預設值即可!
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
# 設定要備份的服務的設定檔,以及備份的目錄
named=$basedir/named
postfixd=$basedir/postfix
vsftpd=$basedir/vsftp
sshd=$basedir/ssh
sambad=$basedir/samba
wwwd=$basedir/www
others=$basedir/others
userinfod=$basedir/userinfo
# 判斷目錄是否存在,若不存在則予以建立。
for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod
do
[ ! -d "$dirs" ] && mkdir -p $dirs
done
# 1. 將系統主要的服務之設定檔分別備份下來,同時也備份 /etc 全部。
cp -a /var/named/chroot/{etc,var} $named
cp -a /etc/postfix /etc/dovecot.conf $postfixd
cp -a /etc/vsftpd/* $vsftpd
cp -a /etc/ssh/* $sshd
cp -a /etc/samba/* $sambad
cp -a /etc/{my.cnf,php.ini,httpd} $wwwd
cd /var/lib
tar -jpc -f $wwwd/mysql.tar.bz2 mysql
cd /var/www
tar -jpc -f $wwwd/html.tar.bz2 html cgi-bin
cd /
tar -jpc -f $others/etc.tar.bz2 etc
cd /usr/
tar -jpc -f $others/local.tar.bz2 local
# 2. 關於使用者參數方面
cp -a /etc/{passwd,shadow,group} $userinfod
cd /var/spool
tar -jpc -f $userinfod/mail.tar.bz2 mail
cd /
tar -jpc -f $userinfod/home.tar.bz2 home
cd /var/spool
tar -jpc -f $userinfod/cron.tar.bz2 cron at
[root@www ~]# chmod 700 /backup/backupwk.sh
[root@www ~]# /backup/backupwk.sh <==記得自己試跑看看!
每日備份資料的 script
來,繼續提供一下每日備份資料的腳本程式!請注意,鳥哥這裡僅有提供 MySQL 的資料庫備份目錄, 與 WWW 的類似留言版程式使用的 CGI 程式與寫入的資料而已。 如果你還有其他的資料需要每日備份,請自行照樣造句囉! ^_^
[root@www ~]# vi /backup/backupday.sh #!/bin/bash # ========================================================= # 請輸入,你想讓備份資料放置到那個獨立的目錄去 basedir=/backup/daily/ <==你只要改這裡就可以了! # ========================================================= PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH export LANG=C basefile1=$basedir/mysql.$(date +%Y-%m-%d).tar.bz2 basefile2=$basedir/cgi-bin.$(date +%Y-%m-%d).tar.bz2 [ ! -d "$basedir" ] && mkdir $basedir # 1. MysQL (資料庫目錄在 /var/lib/mysql) cd /var/lib tar -jpc -f $basefile1 mysql # 2. WWW 的 CGI 程式 (如果有使用 CGI 程式的話) cd /var/www tar -jpc -f $basefile2 cgi-bin [root@www ~]# chmod 700 /backup/backupday.sh [root@www ~]# /backup/backupday.sh <==記得自己試跑看看! |
[root@www ~]# vi /etc/crontab # 加入這兩行即可 (請注意你的檔案目錄!不要照抄呦!) 30 3 * * 0 root /backup/backupwk.sh 30 2 * * * root /backup/backupday.sh
有些時候,你在進行備份時,被備份的檔案可能同時間被其他的網路服務所修改喔! 舉例來說,當你備份 MySQL 資料庫時,剛好有人利用你的資料庫發表文章,此時, 可能會發生一些錯誤的訊息。要避免這類的問題時,可以在備份前,將該服務先關掉, 備份完成後,再啟動該服務即可!
使用 FTP 上傳備份資料
[root@www ~]# vi /backup/ftp.sh #!/bin/bash # =========================================== # 先輸入系統所需要的資料 host="192.168.1.100" # 遠端主機 id="dmtsai" # 遠端主機的 FTP 帳號 pw='dmtsai.pass' # 該帳號的密碼 basedir="/backup/weekly" # 本地端的欲被備份的目錄 remotedir="/home/backup" # 備份到遠端的何處? # =========================================== backupfile=weekly.tar.bz2 cd $basedir/.. tar -jpc -f $backupfile $(basename $basedir) ftp -n "$host" > ${basedir}/../ftp.log 2>&1 <<EOF user $id $pw binary cd $remotedir put $backupfile bye EOF
使用 rsync 上傳備份資料:
另一個更簡單的方法就是透過 rsync ,但是你必須要在你的伺服器上面取得某個帳號使用權後, 並讓該帳號可以不用密碼即可登入才行!這部分得要先參考伺服器篇的遠端連線伺服器才行! 假設你已經設定好 dmtsai 這個帳號可以不用密碼即可登入遠端伺服器,而同樣的你要讓 /backup/weekly/ 整個備份到 /home/backup/weekly 底下時,可以簡單這樣做:
[root@www ~]# vi /backup/rsync.sh #!/bin/bash remotedir=/home/backup/ basedir=/backup/weekly host=127.0.0.1 id=dmtsai # 底下為程式階段!不需要修改喔! rsync -av -e ssh $basedir ${id}@${host}:${remotedir}
|
由於 rsync 可以透過 ssh 來進行鏡像備份,所以沒有變更的檔案將不需要上傳的!相當的好用呢! 好了!大家趕緊寫一個適合自己的備份 script 來進行備份的行為吧!重要重要喔!