由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前做一個備份。
一、怎樣檢查表的錯誤
為了檢查一張表,使用下列命令:
myisamchk tbl_name
這能找出所有錯誤的99.99%。它不能找出的是僅僅涉及數據文件的損壞(這很不常見)。如果你想要檢查一張表,你通常應該沒有選項地運行myisamchk或用-s或--silent選項的任何一個。
myisamchk -e tbl_name
它做一個完全徹底的數據檢查(-e意思是“擴展檢查”)。它對每一行做每個鍵的讀檢查以證實他們確實指向正確的行。這在一個有很多鍵的大表上可能花很長時間。myisamchk通常將在它發現第一個錯誤以後停止。如果你想要獲得更多的信息,你能增加--verbose(-v)選項。這使得myisamchk繼續一直到最多20個錯誤。在一般使用中,一個簡單的myisamchk(沒有除表名以外的參數)就足夠了。
myisamchk -e -i tbl_name
象前面的命令一樣,但是-i選項告訴myisamchk還打印出一些統計信息。
二、怎樣修復表
一張損壞的表的症狀通常是查詢意外中斷並且你能看到例如這些錯誤:
“tbl_name.frm”被鎖定不能改變。
不能找到文件“tbl_name.MYI”(Errcode :### )。
從表處理器的得到錯誤###(此時,錯誤135是一個例外)。
意外的文件結束。
記錄文件被毀壞。
在這些情況下,你必須修復表。myisamchk通常能檢測並且修復出錯的大部分東西。
修復過程包含最多4個階段,在下面描述。在你開始前,你應該cd到數據庫目錄和檢查表文件的權限,確保他們可被運行mysqld的Unix用戶讀取(和你,因為你需要存取你正在檢查的文件)。如果它拒絕你修改文件,他們也必須是可被你寫入的。
階段1:檢查你的表
運行
myisamchk *.MYI
或(myisamchk -e *.MYI,如果你有更多的時間)。使用-s(沉默)選項禁止不必要的信息。
你必須只修復那些myisamchk報告有一個錯誤的表。對這樣的表,繼續到階段2。
如果在檢查時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。