建立一個資料庫表維護規範
在一個定期基礎而非等到問題出現才實施資料庫表的檢查是一個好主意。應該考慮到建立一個預防性維護的時程表,以協助自動問題,是你可以採取措施進行修正:
執行常規的資料庫備份並允許更新日誌。
安排週期性常規表檢查。通過檢查表,將減少使用備份的機會。這個工作,在Windows下使用計畫任務,Unix使用cron作業(一般從運行伺服器所示用的該帳號的crontab檔中調用),並且很容易實現。
例如,你作為mysql使用者運行伺服器,則可以從mysql的crontab檔中建立定期檢查。如果你不知道如何使用cron,應使用下列命令查看相關的Unix手冊頁:

 

$man cron
$man crontab
作為伺服器啟動前的系統引導期間檢查資料庫表。及其可能會因早期的崩潰而重新開機。如果這樣的花,資料庫表可能已被毀壞,應該對它進行徹底檢查。
創建一個適用于定期維護的腳本
為了運行自動的表檢查,可以編寫一個腳本,將目錄改變為伺服器資料目錄並對所有的資料庫表進行myisamchk和isamchk。如果你只有MyISAM表或者只有ISAM表,則只需要其中一個程式,可以將無關的那個程式從腳本中注釋掉。
該教本可以被cron調用,或者在系統啟動期間被調用。
為維護目的,你能使用myisamchk -s檢查桌子。-s,--silent選項使myisamchk和isamchk以沉默模式運行,只有當錯誤出現時,才僅僅列印消息。另外myisamchk支援--fast選項,該選項允許程式跳過自上次檢查以來沒有被修改過的人和表。
1. 一個簡單的腳本
例如,一個較為容易理解的簡單腳本,它在伺服器目錄中檢查所有表(DATADIR應該修改成對應你系統的合適的值):

 

#!/bin/sh
cd DATADIR
myisamchk --silent --fast */*.MYIi
samchk --silent */*.ISM
2. 一個較為複雜的腳本
實用此腳本的一個潛在的問題時:如果有許多表,萬用字元模式‘*/*.MYI’和‘*/*.ISM’可能會由於「too many arguments(參數過多)」或者命令列超過shell允許的長度而無法使用。腳本可以進一步修改為(同樣,DATADIR修改為適合你系統上的值):

 

#!/bin/sh
datadir=DATADIR
find $dtatdir –name 「*. MYI」 -print | xargs myisamchk --silent --fast
find $dtatdir –name 「*. ISM」 -print | xargs isamchk --silent
當然你也可以在腳本中指定多個資料庫目錄。
3. 如何執行腳本
假定你將腳本存為check_tables,應該確保它是可執行檔,當然建議你首先切換到專使用者mysql:

 

$su mysql
$vi check_tables(編輯腳本,你也可以使用你喜歡的編輯器)
$chmod +x check_tables
手工執行,檢測你的腳本是否有錯誤:

 

$check_tables 在理想情況下應該沒有輸出結果。如果系統不支援外部鎖定,遊客蒽那個伺服器將在你檢查表時改變它。此時,腳本可能會把實際沒有問題的表報告呈有問題的。如果系統能夠支援外部鎖定,則該問題就不會出現。
在unix中用cron定期檢查表
以下將說明如何建立腳本,使它通過cron並在系統啟動期間執行。在這小節的例子中,筆者假定把腳本安裝在/usr/local/mysql/bin中,你需要修改該過程來檢查每個伺服器資料目錄中的表。你可以使用不同的check_tables拷貝來進行,或者通過修改它來接受一個命令列參數進行,該參數指定了想要檢查的資料目錄。
假定對mysql使用者從crontab檔中調用腳本check_tables。
1. 首先用該使用者的身份註冊

 

$su mysql 2. 生成一個暫存檔案,捕獲已經調度的任務

 

$crontab –l>/tmp/entries 3. 在生成的檔最後一行添加內容
把這一行0 0 * * 0 /usr/local/mysql/bin/check_tables加到暫存檔案的最後一行:

 

$echo 「0 0 * * 0 /usr/local/mysql/bin/check_tables」 >>/tmp/entries 它告訴cron在每個星期日的淩晨0時運行此選項。可以按要求改變時間或安排。有關這些選項的格式,參閱crontab的手冊頁。
4. 重新安排調度

 

$crontab /tmp/entries 如果檢查後有任何資訊,cron作業通常生成一個郵件消息給使用者。由於使用--silent選項,只有表存在錯誤時,才會有輸出,也才會有郵件資訊,因此不會產生大量無用郵件資訊。(你現在應該明白,腳本採用--silent選項的原因)
對於這樣週期性維護,你的伺服器最好支援外部鎖定,這樣在檢查表時,就不會發生存取違規的情況。如果無法做到這一點,你最好在沒有使用者使用伺服器的時候維護,例如淩晨。
在系統啟動期間檢查表
如果你使用的是BSD風格的系統,例如OpenBSD,FreeBSD等,並且已經將伺服器的啟動命令增加到/etc/rc.local,要在啟動期間檢查表,可以在啟動伺服器前從相應的檔中調用check_tables。
如果對於使用Sytem V風格的啟動方法的系統,例如,大多數的商業Unix系統,其啟動方法是從/etc/rc.d目錄之一調用mysql.server腳本,則在資料庫啟動前檢查表的過程比較複雜,因為這些目錄中的腳本必須理解start和stop參數。
例如,象這樣編寫腳本,取名mysql.check當參數時start時調用check_tables,當參數是stop時什麼也不做:

 

#!/bin/sh
#See hou we sere called
case 「$1」 in
start)
echo –n 「Checking MySQL tables:」
if [ -x /usr/local/mysql/bin/check_tables ] ; then
/usr/local/mysql/bin/ check_tables
fi;;
stop)
#don’t do anything
;;
*)
echo 「Usage:$o{start|stop}」
exit 1
esac
exit 0
現在你可以安裝mysql.check了,該過程類似乎在第二章介紹的讓伺服器自動啟動的安裝mysql.server的過程。必須給mysql.check一個運行級目錄中較低的首碼號,才能使它在mysql.server前運行。例如,如果在運行級目錄中以S99mysql.server連接到mysql.server,則應該以S98mysql.check連結到mysql.check。
由於Linux集中了BSD和Sytem V系統的優點,所以,上面兩種方法完全適用于Linux。為了簡便起見,一般使用第一個方法。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()