由MySQL用來存儲數據的文檔格式以已被廣泛地測試過,但是總是有外部情況能夠導致數據庫表被破壞: mysqld進程在一個寫入當中被殺死;電腦的意外關閉(例如,假如電腦掉電);一個硬件錯誤。 這章描述如何檢查和處理在MySQL數據庫中的數據損壞。假如您的表損壞很多,您應該嘗試找出其原因!見G.1 調試一個MySQL服務器。 在執行崩潰恢復時,理解在一個數據庫中的每一個表tbl_name對應的在數據庫目錄中的3個文檔是很重要的:
“tbl_name.frm” 表定義(表格)文檔
“tbl_name.MYD” 數據文檔
“tbl_name.MYI” 索引文檔
這3個文檔的每一個文檔類型可能遭受不同形式的損壞,但是問題最常發生在數據文檔和索引文檔。 myisamchk通過一行一行地創建一個“.MYD”(數據 )文檔的副本來工作,他通過由刪除老的“.MYD 文檔並且重命名新文檔到原來的文檔名結束修復階段。假如您使用--quick,myisamchk不創建一個臨時“.MYD”文檔,只是假定“.MYD”文檔是正確的並且僅創建一個新的索引文檔,不接觸“.MYD”文檔,這是安全的,因為myisamchk自動檢測“.MYD”文檔是否損壞並且在這種情況下,放棄修復。您也能夠給myisamchk兩個--quick選項。在這種情況下,myisamchk不會在一些錯誤上(象重復鍵)放棄,相反試圖通過修改“.MYD”文檔解決他們。通常,只有在您在太少的空閒磁盤空間上實施一個正常修復,使用兩個--quick選項才有用。在這種情況下,您應該至少在運行myisamchk前做一個備份。
這能找出任何錯誤的99.99%。他不能找出的是僅僅涉及數據文檔的損壞(這很不常見)。假如您想要檢查一張表,您通常應該沒有選項地運行myisamchk或用-s或--silent選項的任何一個。
他做一個完全完全的數據檢查(-e意思是“擴展檢查”)。他對每一行做每個鍵的讀檢查以證實他們確實指向正確的行。這在一個有很多鍵的大表上可能花很長時間。myisamchk通常將在他發現第一個錯誤以後停止。假如您想要獲得更多的信息,您能增加--verbose(-v)選項。這使得myisamchk繼續一直到最多20個錯誤。在一般使用中,一個簡單的myisamchk(沒有除表名以外的參數)就足夠了。