chun 2010-8-24 09:49
[轉貼]資料備份(Samba、Mysql)、加密
http://www.cses.tcc.edu.tw/~chihwu/backup_data.htm<br><h1 align="center">資料備份(Samba、Mysql)、加密</h1>
<hr>
<h2>一、前言</h2>
<p style="margin-left: 20px; margin-right: 20px;"> 用Linux 或 FreeBSD架設了
SMABA ,當作 FILE SERVER ,也弄了 Mysql來存放一些資料,接踵而來的就是備份的問題。最簡單最直接的方法,每天晚上把整個目錄
tar
起來,那就解決了,這種做法的確很安全,但是資料量大時就不適用了。而且存放的空間也是需要考量的。</p>
<p style="margin-left: 20px; margin-right: 20px;">本校沒有磁帶機、也沒有MO,還好有40GB 的
IDE
HD,這就是備份下來檔案的儲存地方。除了本機上存放外,利用
NFS 或 FTP 再存到別一台電腦上更好。多一份保障,</p>
<h2>二、使用的程式</h2>
<ol><li>
<p style="margin-right: 20px;">會設定 crontab , 這是管理人員必備的技巧。
</p></li><li>
<p style="margin-right: 20px;">tar :備份的基本程式。
</p></li><li>
<p style="margin-right: 20px;">find : 幫忙找出特定條件的檔案。(例:24小時內修改過的檔案)
</p></li><li>
<p style="margin-right: 20px;">awk : 網管必備技巧,利害的就用 PREL,我只會用它。
</p></li><li>
<p style="margin-right: 20px;">mysqldump : mysql傾印資料庫的指令。
</p></li></ol>
<h2>三、實例說明</h2>
<h3 style="margin-left: 20px; margin-right: 20px;">狀況一:</h3>
<p style="margin-left: 20px; margin-right: 20px;">定期備份全校老師的檔案,以防老師誤刪檔案或目
錄,每天備份當日更動過的檔案(24小時內)。</p>
<p style="margin-left: 20px; margin-right: 20px;">資料目錄: /home/cses<br>
備份檔存放目錄: /mnt/backup </p>
<ol><li>
<h3>定期備份 (/mnt/backup/backup_week.sh)</h3>
<table width="90%" border="1" bordercolor="#800000">
<tbody><tr>
<td width="100%"><b>#!/bin/sh<br>
##<br>
## 保留三個/home/cses/ 的原始備份檔<br>
##<br>
mv /mnt/backup/cses-1.tar.gz /mnt/backup/cses-2.tar.gz<br>
mv /mnt/backup/cses.tar.gz /mnt/backup/cses-1.tar.gz<br>
tar czvf /mnt/backup/cses.tar.gz /home/cses<br>
chmod 400 /mnt/backup/cses.tar.gz</b><br>
---------------------說明--------------------<br>
其實倒數第二行就可以解決了,還好硬碟夠大,我就多放兩個完整備份檔,crontab
中設定每個星期天的凌晨4:30做備份的動作。chmod
為的是讓其他人不會讀取到這個檔案。<br>
30 4 * * 0 /mnt/backup/backup_week.sh</td>
</tr>
</tbody></table>
</li><li>
<h3>每日備份( /mnt/backup/backup_day.sh )</h3>
<table width="90%" border="1" bordercolor="#800000">
<tbody><tr>
<td width="100%"><b>#!/bin/sh<br>
##<br>
## 每天備份24小時內更動過的檔案<br>
##<br>
day=`date +%w`<br>
find /home/cses/ -type f -ctime -1 -fprint
/mnt/backup/file_list<br>
tar -czvf /mnt/backup/week-$day.tar.gz -T
/mnt/backup/file_list</b><br>
---------說明 -----------<br>
因為是每天,所以用 data +%w 取出星期代碼,<br>
用find 指令找出一天內(24小時)更動過的檔案。並且用-fprint
參數輸出到 /mnt/backup/file_list <br>
以 /mnt/backup/file_list 為範本,把檔案 tar 到 week-星期.tar.gz
的檔案中,crontab 設定<br>
0 4 * * * /mnt/backup/backup_day.sh </td>
</tr>
</tbody></table>
</li></ol>
<p> 如此一來,每週一次完整的備份,每天備份24小時內的異動,萬一有同事誤刪了檔案或目錄就可以很快的救回來了。</p>
<h2>狀況二、備份 資料庫</h2>
<p> 其實這個部份和備份檔案差不多,以MySQL 為例,它本身所附的mysqldump
就可以把資料庫整個匯出,而匯出的內容都是文字檔,所以在檔案權限上的設定或者內容的加密都是要注意的。</p>
<p> 在MYSQL
中可能存放了好多個資料庫,日後也可能陸續增加,所以先建立一個所有資料庫的列表,備份的對象就是列表中的資料庫。</p>
<ol><li>
<h3>資料庫列表 (/mnt/backup/mysql/db.list)</h3>
<table width="80%" border="1" bordercolor="#800000">
<tbody><tr>
<td width="100%">mysql<br>
test<br>
sfs<br>
horde<br>
imp</td>
</tr>
</tbody></table>
</li><li>
<h3 align="left">資料庫備份 ( /mnt/backup/backup_sql.sh)</h3>
<table width="90%" border="1" bordercolor="#800000">
<tbody><tr>
<td width="100%"><font face="Bell MT">#!/bin/sh<br>
date=`date +%w`<br>
awk <font color="#ff0000">'</font>{ print <font color="#ff0000"> "</font>mysqldump -uroot -proot_password
<font color="#ff0000"> "</font> $1 <font color="#ff0000"> "</font>
>
/mnt/backup/mysql/<font color="#ff0000">"</font>$1<font color="#ff0000">"</font>.sql.<font color="#800000">`</font>date
+%w<font color="#800000">`</font><font color="#ff0000">"</font>
}<font color="#ff0000">'</font> /mnt/backup/mysql/db.list | /bin/sh<br>
awk <font color="#ff0000">'</font>{ print <font color="#ff0000">"</font>chmod 400
/mnt/backup/mysql/<font color="#ff0000">"</font>$1<font color="#ff0000">"</font>.sql.<font color="#000080">`</font>date
+%w<font color="#000080">`</font><font color="#ff0000">"</font>
}<font color="#ff0000">'</font> /mnt/backup/mysql/db.list | /bin/sh</font><br>
----------------說明----------------------<br>
以上的程式是四行! 第三、四行都是以awk
為開頭,如果怕程式有錯,後面的 | /bin/sh
可以先省略,先看看有沒有錯誤,這時候因為沒有經過shell
處理,所以 `date +%w`
也不會被執行,仍是以字串的格式呈現。如下:<br>
mysqldump -uroot mysql > /var/lib/mysql/mysql.sql.`date
+%w`<br>
mysqldump -uroot test > /var/lib/mysql/test.sql.`date
+%w`<br>
chmod 400 /var/lib/mysql/mysql.sql.`date +%w`<br>
chmod 400 /var/lib/mysql/test.sql.`date +%w`
<p> 會用 chmod 400 這行指令是為了保密,資料庫 DUMP
出來都是文字檔,小心一點總是必要的,另外,這個程式也是要保密的對象,因為它有
MYSQL root 的密碼,在我的實際運作上,/mnt/backup
的擁有者是 root , 屬性方面也是設成400,除了只讓 root
可以讀寫外,其他群組或人員一律不準。</p>
</td>
</tr>
</tbody></table>
</li></ol>
<h2>
狀況三:檔案加密</h2>
<p style="margin-left: 20px; margin-right: 20px;"> 上述的script
和備份下來的資料應妥善保管,避免他人的下載或利用,在
WINDOWS 的環境中,WINZIP 這類的壓縮工具都有
加上密碼的功能,以防檔案遭到非法利用;但在 UNIX
環境中,這類的軟體好像不多(應該說我不知道),還好,我在
CNET 網站找到<b><a href="http://taiwan.cnet.com/download/linux/swinfo/0,2000033469,11005601s,00.htm?">Cruft
Data Encryption Utility</a></b> <!-- filename end --><!-- short description start -->
這個檔案加密的工具,以下就簡單的介紹安裝和使用方法:</p>
<ol><li>安裝:<br>
和一般 *.TAR.GZ 的檔案一樣,下載、解開、進入目錄、make
、make install 。<br>
如裝完會產生兩個程式,<br>
keygen :先執行這個程式,它會在USER 的家目錄產生一個 .key
的檔案,加密、解密就靠這個檔的內容。<br>
crutf : 加、解密的主程式。</li><li>使用方法:<br>
keygen 要第一個使用。以產生 .key 。<br>
crutf :<font size="4" color="#0000ff" face="Bell MT"><u>cruft infile
outfile </u></font> 或
<font size="4" color="#0000ff" face="Bell MT"><u>cruft infile >
outfile </u></font>
的方式都可以,它會自動判斷是否加密,如果infile
是正常檔案,outfile
就是加密過的,反之則會產生解密的檔案。</li><li>心得:<br>
一般USER 加密過的檔案,連root 也無法解開,因為 ~/.key
的內容不一樣,也許把 user ~/.key cp 到 /root
就可以解開了。<br>
不僅是文字檔,連 *.tar.gz 的檔案也可以。</li></ol>
<p style="margin-left: 20px; margin-right: 20px;"> 這一類的檔案應該不少,我有點偷懶,只到
CNET
找,因為它有中文簡介,相信 <a href="http://freshmeat.net/">http://freshmeat.net/</a>
和 <a href="http://freshmeat.net/">http://sourceforge.net/</a>
都有不少類似或更強大的工具,只是我沒找到而以,也希望網友可以提供意見。</p><br>