mysql|伺服器|資料|資料庫 應該考慮建立一個預防性維護的時間表,以協助自動檢測問題,使得您可以採取措施進行修正:
1) 執行常規的Database Backup並允許更新日誌。
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,其內容如下:
現在,您已經可以使用一個過程來安裝mysql. c h e c k了,該過程類似於在第11章所介紹的安裝mysql.server 的過程。必須給mysql.check 一個運行級目錄中較低的首碼號,才能使得它在mysql.server 前運行。例如,如果在運行級目錄中以S99mysql.server 連結到mysql. server,則應該以S98mysql.check 連結到mysql.check 。