理想的情況是,MySQL從首次安裝以來始終平穩地運行。但有時確實會由於各種原因而出現問題,其范圍可以從電源斷電到硬件故障到不正常地關閉MySQL服務器(如用kill -9 終止服務器或機器崩潰)。諸如這樣的情況大部分都超出您的控制范圍,它們會導致數據庫表的毀壞,尤其是在對表進行修改且未完全寫入時所引起的。
本章的重點是檢測和解決表的問題,而不論問題是如何引起的。對於表的檢查和修復,MySQL管理員最好的朋友是myisamchk 和isamchk 實用程序。這兩個程序有好幾個功能,我們已經在第4章討論了怎樣使用它們執行索引鍵的分布分析和索引的釋放與激活。還可以使用它們檢查表和修復有問題的表。這使您能在表變壞之前(使表不能使用之前)修正故障。
myisamchk 和isamchk 提供的全部選項的清單在附錄E 中。有關其他的背景,請參閱MySQL參考指南的“維護MySQL安裝”一章。
表的故障檢測和修正的一般過程如下:
1) 檢查出錯的表。如果該表檢查通過,則完成任務,否則必須修復它。
2) 在開始修復之前對表文件進行拷貝,以防萬一。
3) 試著修復表。
4) 如果修復操作失敗,從數據庫備份和更新日志中恢復此表。
上述過程的最後一步假定您已經執行了數據庫備份並允許更新日志有效。如果不是這樣的話,系統將有危險。參考第11章查找一下怎樣使用mysqlaump 和怎樣開啟更新日志。您肯定不想不可挽回地丟失一個表,因此,應努力地做備份。
在使用myisamchk 或isamchk 檢查或修復表之前,應該滿足一些初步需求:
建立常規的數據庫備份過程並允許更新日志,以防事情越來越糟使表的毀壞不能修復。筆者好像在以前提醒過這一點?
在開始試驗之前應先仔細地閱讀本章的內容。尤其是不應該在閱讀“避免與MySQL服務器交互作用”之前進行操作,因為它將討論當您試圖在一個表上執行檢查或修復過程時服務器正在使用這個表所引起的問題。它還討論怎樣在服務器運行時防止那些問題發生。
當運行表檢查或修復時,您應該被注冊在運行mysql的賬號下,因為您需要對表文件讀寫訪問。
myisamchk 和isamchk 的調用語法
MySQL的myisamchk 和isamchk 實用程序很類似,多數時候它們可以用同樣的方式使用。它們之間的主要區別是它們所使用的表的類型。對於MyISAM 表,使用my i s a m c h k,而對於ISAM 表,則使用i s a m c h k。您可以通過表的索引文件的擴展名來告訴表使用哪種存儲格式。擴展名“. M Y I”表明是一個MyISAM 表,而“. I S M”表明是ISAM 表。
為了使用任一個實用程序,應指明您所要檢查或修復的表,以及指明要執行的操作類型的選項:
% myisamchk options tbl_name...
% isamchk options tbl_name...
tbl_name 參數可以是表名也可以是該表的索引文件名。如果指定多個表,可以很容易地使用文件名模式來拾取目錄中所有相應的文件:
% myisamchk options *.MYI
% isamchk options *.ISM
不會因為告訴了錯誤的程序來檢查某個表而使該表毀壞,但是除了發布一條警告消息外此程序不做任何事情。例如,下面的第一條語句將檢查當前目錄中的所有MyISAM 表,而第二條語句只顯示一條警告消息:
% myisamchk *.MYI 正確
% myisamchk *.ISM 不正確─文件類型錯
不論是myisamchk 還是isamchk 都不對表所在的位置做任何判斷,因此,應該或者在包含表文件的目錄中運行程序,或者指定表的路徑名。這允許您將表文件拷貝到另一個目錄中並用該拷貝進行操作。
檢查表
myisamchk 和isamchk 提供了表檢查方法,這些方法在徹底檢查表的程度方面有差異。通常用標准方法就足夠了。如果標准檢查報告沒有發現錯誤而您仍然懷疑有毀壞(或許因為查詢沒有正常地工作),可能要執行更徹底的檢查。要想用任意一個實用程序執行標准的表檢查,則不用帶任何選項直接調用即可:
% myisamchk tbl_name
% isamchk tbl_name
為了執行擴充檢查,使用--extend-check 選項。該選項非常慢,但檢查極為徹底。對於該表的數據文件中的每個記錄,索引文件中的每個索引的相關鍵都被檢查以確保它真正指向正確的記錄。myisamchk 還有一個中間選項- - m e d i um - c h e c k,它不如擴展檢查徹底,但速度快。