建立一個預防性維護的時間表,以協助自動檢測問題,使得您可以采取措施進行修正:
1) 執行常規的數據庫備份並允許更新日志。
2) 安排定期的常規表檢查。通過檢查表,將減少使用備份的機會。這個工作使用cron 作業(一般從運行服務器所使用的該賬號的crontab 文件中調用)並且很容易實現。例如,如果您作為mysqladm 用戶運行服務器,則可以從MySQLadm 的crontab 文件中建立定期檢查。如果您不知道如何使用c r o n,應使用下列命令查看相關的UNIX 人工頁:
% man cron
% man crontab
3) 在服務器啟動前的系統引導期間檢查數據庫表。機器可能會因早期的崩潰重新啟動。如果是這樣的話,數據庫表可能已被毀壞,應該對它進行檢查。
為了運行自動的表檢查,可以編寫一個腳本,將目錄改變為服務器數據目錄並對所有數據庫表運行myisamchk 和i s a m c h k。我們將在下面討論的腳本中同時使用這兩個程序。如果您只有MyISAM 表或只有ISAM 表,則只需其中一個程序,可以將無關的那個程序從腳本中去除。
myisamchk 和isamchk 都根據表檢查的方式產生某些輸出結果以便了解正在檢查哪些表,甚至在沒有問題時也是如此。對於crontab 的項,除非表中有錯誤,否則通常將禁止輸出結果(如果作業產生任何輸出, cron 作業通常生成一個郵件消息,很少會收到沒有任何問題的表檢查作業的郵件)。如果用--silent 選項調用任一個實用程序,它僅當發現問題時才產生輸出。另外,myisamchk 支持--fast 選項,該選項允許程序跳過自上次檢查以來沒有被修改過的任何表。
在服務器數據目錄中檢查所有表的一個簡單的腳本如下( DATADIR 應該修改成對應您系統的值):
實用此腳本的一個潛在的問題是:如果有許多表,通配符模式‘ * / * . M Y I’或‘* / * . I S M’可能會由於“ too many arg um e n t s(過多的參數)”錯誤使外殼程序爆炸。另一個可選擇的腳本如下(同樣,將DATADIR 改變為對應您系統的值):
不論您選擇哪種形式的腳本,筆者都假定您調用的是c h e c k _ MySQL_ tables,應確保及時改變該方式使它可執行,然後您手工調用它以驗證它工作是否正常:
% chmod +x check_MySQL_tables
% chmod_MySQL_tables
在理想情況下應該沒有輸出結果。如果系統不支持外部鎖定,有可能服務器將在您檢查表時改變它。此時,腳本可能會把實際沒問題的表報告成有問題的。這有點不幸,但比出現相反的問題要好:當出現某些故障時腳本報告無問題。如果系統支持外部鎖定,則該問題就不會出現。
以下部分將說明如何建立腳本,使它通過cron 並在系統啟動期間自動執行。在這些小節的例子中,筆者假定腳本安裝在/usr/users/mysaladm/bin 中。您將需要調整適合自己系統的值。
如果在您的系統上運行了多個服務器,將需要修改該過程來檢查每個服務器數據目錄中的表。您可以使用不同的check_MySQL_tables 拷貝來進行,或通過修改它來接收一個命令行參數進行,該參數指定了想要檢查的數據目錄。
用cron 定期檢查表
假定要想對mysqladm 用戶從crontab 文件中調用腳本c h e c k _ MySQL_ tables。先以該用戶的身份進行注冊,然後用下列命令編輯crontab 文件:
% crontab -e
該命令帶您進入帶有當前crontab 文件拷貝的編輯器中(如果以前沒有編輯過,此文件可能是空的)。增加一行到文件中:
0 3 * * 0 /usr/users/mysqladm/bin/check_MySQL_tables
它告訴cron 在每個星期日的上午3 時運行此選項。可以按要求改變時間或安排。有關這些選項的格式,請參閱crontab 人工頁。
在系統啟動期間檢查表
如果您正在使用BSD 風格的系統,並且已經將服務器的啟動命令增加到/etc/rc.local 或類似的其他文件中,則可以在啟動服務器前從對應的文件中調用c h e c k _ MySQL_ tables。
如果正在使用System V 風格的啟動方法從/etc/rc.d 目錄之一中調用mysql. server,則過程稍有點復雜。這些目錄中的啟動腳本應該理解start 和stop 參數的含義,以便對系統的啟動和關閉采取相應的操作。為了執行表的檢查,我們可以編寫這樣的腳本:當參數為start 時調用c h e c k _ mysql_ tables,而當該參數為stop 時不做任何事情。讓我們來調用這樣的一個腳本MySQL. c h e c k,其內容如下: