2015年5月16日 星期六

伺服器資料備份(Mysql、Samba)



第一節、前言

Linux FreeBSD架設了SAMBA ,當作FILE SERVER ,也弄了Mysql來存放一些資料,接踵而來的就是備份的問題。最簡單最直接的方法,每天晚上把整個目錄tar 起來,那就解決了,這種做法的確很安全,但是資料量大時就不適用了。而且存放的空間也是需要考量的。
本校沒有磁帶機、也沒有MO,還好有40GB IDE HD,這就是備份下來檔案的儲存地方。除了本機上存放外,利用NFS FTP 再存到另一台電腦上更好。多一份保障,也自是一種異地備援的方式(在學校大概就放在不同大樓吧!) 

第二節、使用的程式

1. 會設定crontab,這是管理人員必備的技巧。
2. tar :備份的基本程式。
3. find : 幫忙找出特定條件的檔案。(例:24小時內修改過的檔案)
4. awk : 網管必備技巧,sed PREL都很好,有時間學一學。
5. mysqldump : mysql傾印資料庫的指令。

第三節 實例說明

定期備份全校老師的檔案(每週完整備份一次,保留最新的兩個),以防老師誤刪檔案或目錄,每天備份當日更動過的檔案(24小時內)
資料目錄: /home/cses
備份檔存放目錄: /mnt/backup

1. 定期備份(/mnt/backup/backup_week.sh)
#!/bin/sh
##
## 保留兩個/home/cses/ 的原始備份檔
##
mv /mnt/backup/cses.tar.gz /mnt/backup/cses-1.tar.gz
tar czvf /mnt/backup/cses.tar.gz /home/cses
chmod 400 /mnt/backup/cses.tar.gz
---------------------說明--------------------
如果你的硬碟夠大,可以再加一行mv /mnt/backup/cses-1.tar.gz /mnt/backup/cses-2/tar.gz ,我學校的檔案近7 GB ,所以只保留一個完整備份檔,crontab 中設定每個星期天的凌晨4:30做備份的動作。chmod 400 為的是讓其他人不能讀取到這個檔案。其實/mnt/backup 也是400
30 4 * * 0 /mnt/backup/backup_week.sh

2. 每日備份( /mnt/backup/backup_day.sh )
#!/bin/sh
##
## 每天備份24小時內更動過的檔案
##
day=`date +%w`
find /home/cses/ -type f -ctime -1 –fprint > /mnt/backup/file_list
tar czvf /mnt/backup/week-$day.tar.gz -T /mnt/backup/file_list
---------說明-----------
因為是每天,所以用data +%w 取出星期代碼,用find 指令找出一天內(24小時)更動過的檔案。並且用-fprint 參數輸出到/mnt/backup/file_list,再以/mnt/backup/file_list 為檔案列表,把檔案tar week-星期.tar.gz 的檔案中,crontab 設定
0 4 * * * /mnt/backup/backup_day.sh

如此一來,每週一次完整的備份,每天備份24小時內的異動,萬一有同事誤刪了檔案或目錄就可以很快的救回來了。
如何把檔案解回來呢?總不能找個目錄把檔案全解開,再找出原來的檔案。如果硬碟空間夠,這種方法還可以, 但太慢了。 Tar 這個指令原來是備份到磁帶機的指令,它會依目錄名稱慢慢的把檔案備份起來,所以在備份 /home/cses 這個目錄時,它會依 /home/cses/a* /home/cses/b* 的順序備份。當有一天,一位chihwu user 說他的檔案不小心刪了,要把它的檔案解出時:
tar  zxvf  cses.tar.gz  home/cses/chihwu
為什麼是 home/cses/chihwu 這是在備份檔案時的目錄結構,因為是執行 tar czvf cses.tar.gz /home/cses  tar 會把 / 去掉,這樣解開時才不會一定存在絕對路徑。 忘記當初的路徑時,可以用 tar ztf cses.tar.gz 來查看。
其實這個部份和備份檔案差不多,以MySQL 為例,它本身所附的mysqldump 就可以把資料庫整個匯出,而匯出的內容都是文字檔,所以在檔案權限上的設定或者內容的加密都是要注意的。
MYSQL 中可能存放了好多個資料庫,日後也可能陸續增加,所以先建立一個所有資料庫的列表,備份的對象就是列表中的資料庫。
1. 資料庫列表(/mnt/backup/mysql/db.list)
mysql
sfs3
phpBB

2. 資料庫備份( /mnt/backup/backup_sql.sh)
#!/bin/sh
date=`date +%w`
awk '{ print "mysqldump -uroot –p<root_password> " $1 " > /mnt/backup/mysql/"$1".sql.`date +%w`" }' /mnt/backup/mysql/db.list | /bin/sh
awk '{ print "chmod 400 /mnt/backup/mysql/"$1".sql.`date +%w`" }' /mnt/backup/mysql/db.list | /bin/sh
---------------說明----------------------
以上的程式是四行! 第三、四行都是以awk 為開頭,第二行的 –p<root_password> 不要照抄,請換成mysql root 的密碼。如果怕程式有錯,後面的| /bin/sh 可以先省略,先看看有沒有錯誤,這時候因為沒有經過shell 處理,所以`date +%w` 也不會被執行,仍是以字串的格式呈現。如下:
mysqldump -uroot mysql > /var/lib/mysql/mysql.sql.`date +%w`
mysqldump -uroot test > /var/lib/mysql/test.sql.`date +%w`
chmod 400 /var/lib/mysql/mysql.sql.`date +%w`
chmod 400 /var/lib/mysql/test.sql.`date +%w`
會用chmod 400 這行指令是為了保密,資料庫DUMP 出來都是文字檔,小心一點總是必要的,另外,這個程式也是要保密的對象,因為它有MYSQL root 的密碼,在我的實際運作上,/mnt/backup 的擁有者是root , 屬性方面也是設成400,除了只讓root 可以讀寫外,其他群組或人員一律不準。
其實mysql 的備份還有一個最懶的方法,直接把/var/lib/mysql 整個tar 起來就可以了。.
上述的script 和備份下來的資料應妥善保管,避免他人的下載或利用,在WINDOWS 的環境中,WINZIP 這類的壓縮工具都有加上密碼的功能,以防檔案遭到非法利用;但在UNIX 環境中,這類的軟體好像不多(應該說我不知道),還好,我在CNET 網站找到Cruft Data Encryption Utility 這個檔案加密的工具,以下就簡單的介紹安裝和使用方法:
1. 安裝: 和一般TAR Ball 的檔案一樣,下載、解開、進入目錄、執行 ./configure  ; make  ; make install 。如裝完會產生兩個程式, keygen :先執行這個程式,它會在USER 的家目錄產生一個.key 的檔案,加密、解密就靠這個檔的內容。crutf 加、解密的主程式。
2. 使用方法: keygen 要第一個使用。以產生.key crutf cruft infile outfile cruft infile > outfile 的方式都可以,它會自動判斷是否加密,如果infile 是正常檔案,outfile 就是加密過的,反之則會產生解密的檔案。
3. 心得: 一般USER 加密過的檔案,連root 也無法解開,因為~/.key 的內容不一樣,也許把user ~/.key cp /root 就可以解開了。不僅是文字檔,連*.tar.gz 的檔案也可以。
這一類的檔案應該不少,我有點偷懶,只到CNET 找,因為它有中文簡介,相信http://freshmeat.net/ http://sourceforge.net/ 都有不少類似或更強大的工具,只是我沒找到而以,也希望大家可以提供意見。

第四節 異地備份

以目前本校近百位的教職員來說,利用 SAMBA 存放的資料量近8GB (已壓縮) ,利用 ftp 或者 nfs 的方式來複製到另一台電腦上,費時費力,最好的方式是用 rsync
rsync 會執行兩端檔案的運算,只傳輸需要修改的部份,所以可以大量降低磁碟系統的I/O時間與資料傳送的時間。目前這個指令筆者除了應用在資料的備份上之外,伺服器的資料搬移和轉換都是用 rsync 這個指令。
其他說明文件,提供參考。
u   http://linux.tnc.edu.tw/techdoc/rsync.htm 作者:OLS3 (ols3@www.tnc.edu.tw) 2002/10/18
u  http://www.adj.idv.tw/server/linux_rsync.php Rsync + SSH -- Server 自動異地備援也加密 作者 : ADJ網路實驗室
u  http://www.fanqiang.com/a6/b7/20010908/1305001258_b.htmlrsync對網站進行鏡像備份 本文出自:http://xfocus.org/ 作者:inburst[inburst@263.net] (2001-09-08 13:05:00)

本校的方式只是做兩地的資料同步,如果有同事在星期一刪掉了某個重要目錄, 到了星期二才來求救,那可能就沒救了, 但果是採用前面 TAR 的方式, 可能還有挽回的餘地。不過,目前的IDE HD 非常的便宜,買顆120GB HD rsync 同時備份 星期一到星期五的版本也夠吧!!
目前清水國小是採用rsync 的方式做異地備份,同一台SERVER 的另一個HD 再備份一天。所以可以直接找回兩天前的檔案。
範例
rsync -avl  --delete -e ssh 163.17.208.3:/home/cses/ /home/cses
rsync -avl  --delete -e ssh 163.17.208.3:/home/student/ /home/student
rsync -avl  --delete -e ssh 163.17.208.3:/home/samba/ /home/samba
rsync -avl  --delete -e ssh 163.17.208.3:/var/www/ /var/www
rsync -avl  --delete -e ssh 163.17.208.3:/var/spool/mail/ /var/spool/mail
rsync -avl  --delete -e ssh 163.17.208.3:/var/lib/mysql/ /var/lib/mysql
rsync -avl  --delete -e ssh 163.17.208.3:/home/admin/ /home/admin

--delete :用於兩邊的資料真正同步。例如甲電腦傳送了 A, B, C 三個檔案到乙電腦,如果甲電腦上已經把B檔案刪除了,再執行rsync 時,如果有 --delete 參數,乙電腦上B檔案就會被刪除:反之,未加 --delete 參數則被保存。


利用 rsync 備份資料時,都要輸入對方主機的密碼,這樣的方式不適合管理的自動化原則,所以我們必需利用 ssh 的相關指令,讓雙方的溝通不用再輸入密碼。
舉例來說:我們有一台主機(www),也有另一台backup 主機,我們的操作是由www主機定時把資料送到 backup 存放。那麼我們必需在www 上利用ssh-keygen –d (DSA 編碼)的指令產生兩組keyid_dsa , id_dsa.pub。就如同「木馬屠城記」的故事一樣,當我們把 id_dsa.pub 這個檔案送到 backup 之後,www 主機就可以不用密碼自由的進入backup 主機了。但是 backup 主機仍無法直接ssh www ,必需一樣地把透過ssh-keygen產生id_dsa.pub ,再把id_dsa.pub 送到www 主機上。操作步驟和目錄、檔名如下:

1.產生本機的的public key
ssh-keygen -d
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): (Enter)
Enter passphrase (empty for no passphrase): (Enter)
Enter same passphrase again: (Enter)
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
10:77:8f:7a:1b:62:b7:61:b5:b7:0d:e9:c6:98:5b:df root@localhost
public key /root/.ssh/id_dsa.pub  送到要ssh 過去而不用輸入密碼的 server (如:163.18.208.10 - backup )
scp /root/.ssh/id_dsa.pub 163.17.208.10:/root/.ssh/authorized_keys
scp 也是利用 ssh 方式傳送檔案的程式,但是一次只能一個檔案,這時候當然還得再打一次 backup 主機 root 密碼。 以後就不需要了。

如果還有第二台電腦(sfs)也要把資料備份到 backup,可以先把 id_dsa.pub 利用scp 送到 backup 上,但是千萬不要馬上覆蓋掉原來的authorized_keys,可以先scp root 目錄,再到 backup 主機上把 id_dsa.pub   >> 方式加到/root/.ssh/authorized_keys 中。

沒有留言:

張貼留言