由MySQL用來(lái)存儲(chǔ)數(shù)據(jù)的文件格式以已經(jīng)被廣泛地測(cè)試過(guò),但是總是有外部情況可以導(dǎo)致數(shù)據(jù)庫(kù)表被破壞:
mysqld進(jìn)程在一個(gè)寫(xiě)入當(dāng)中被殺死;計(jì)算機(jī)的意外關(guān)閉(例如,如果計(jì)算機(jī)掉電);一個(gè)硬件錯(cuò)誤。
這章描述如何檢查和處理在MySQL數(shù)據(jù)庫(kù)中的數(shù)據(jù)損壞。如果你的表?yè)p壞很多,你應(yīng)該嘗試找出其原因!見(jiàn)G.1 調(diào)試一個(gè)MySQL服務(wù)器。
在執(zhí)行崩潰恢復(fù)時(shí),理解在一個(gè)數(shù)據(jù)庫(kù)中的每一個(gè)表tbl_name對(duì)應(yīng)的在數(shù)據(jù)庫(kù)目錄中的3個(gè)文件是很重要的:
文件用途
這3個(gè)文件的每一個(gè)文件類(lèi)型可能遭受不同形式的損壞,但是問(wèn)題最常發(fā)生在數(shù)據(jù)文件和索引文件。
myisamchk通過(guò)一行一行地創(chuàng)建一個(gè)“.MYD”(數(shù)據(jù) )文件的副本來(lái)工作,它通過(guò)由刪除老的“.MYD 文件并且重命名新文件到原來(lái)的文件名結(jié)束修復(fù)階段。如果你使用-- quick,myisamchk不創(chuàng)建一個(gè)臨時(shí)“.MYD”文件,只是假定“.MYD”文件是正確的并且僅創(chuàng)建一個(gè)新的索引文件,不接觸“.MYD”文件,這是安全的,因?yàn)閙yisamchk自動(dòng)檢測(cè)“.MYD”文件是否損壞并且在這種情況下,放棄修復(fù)。你也可以給myisamchk兩個(gè)--quick 選項(xiàng)。在這種情況下,myisamchk不會(huì)在一些錯(cuò)誤上(象重復(fù)鍵)放棄,相反試圖通過(guò)修改“.MYD”文件解決它們。通常,只有在你在太少的空閑磁盤(pán)空間上實(shí)施一個(gè)正常修復(fù),使用兩個(gè)--quick選項(xiàng)才有用。在這種情況下,你應(yīng)該至少在運(yùn)行myisamchk前做一個(gè)備份。
一、怎樣檢查表的錯(cuò)誤
為了檢查一張表,使用下列命令:
myisamchk tbl_name
這能找出所有錯(cuò)誤的99.99%。它不能找出的是僅僅涉及數(shù)據(jù)文件的損壞(這很不常見(jiàn))。如果你想要檢查一張表,你通常應(yīng)該沒(méi)有選項(xiàng)地運(yùn)行myisamchk或用-s或--silent選項(xiàng)的任何一個(gè)。
myisamchk -e tbl_name
它做一個(gè)完全徹底的數(shù)據(jù)檢查(-e意思是“擴(kuò)展檢查”)。它對(duì)每一行做每個(gè)鍵的讀檢查以證實(shí)他們確實(shí)指向正確的行。這在一個(gè)有很多鍵的大表上可能花很長(zhǎng)時(shí)間。myisamchk通常將在它發(fā)現(xiàn)第一個(gè)錯(cuò)誤以后停止。如果你想要獲得更多的信息,你能增加--verbose(-v)選項(xiàng)。這使得myisamchk繼續(xù)一直到最多20個(gè)錯(cuò)誤。在一般使用中,一個(gè)簡(jiǎn)單的myisamchk(沒(méi)有除表名以外的參數(shù))就足夠了。
myisamchk -e -i tbl_name
象前面的命令一樣,但是-i選項(xiàng)告訴myisamchk還打印出一些統(tǒng)計(jì)信息。
二、怎樣修復(fù)表
一張損壞的表的癥狀通常是查詢(xún)意外中斷并且你能看到例如這些錯(cuò)誤:
“tbl_name.frm”被鎖定不能改變。
不能找到文件“tbl_name.MYI”(Errcode :### )。
從表處理器的得到錯(cuò)誤###(此時(shí),錯(cuò)誤135是一個(gè)例外)。
意外的文件結(jié)束。
記錄文件被毀壞。
在這些情況下,你必須修復(fù)表。myisamchk通常能檢測(cè)并且修復(fù)出錯(cuò)的大部分東西。
修復(fù)過(guò)程包含最多4個(gè)階段,在下面描述。在你開(kāi)始前,你應(yīng)該cd到數(shù)據(jù)庫(kù)目錄和檢查表文件的權(quán)限,確保他們可被運(yùn)行mysqld的Unix用戶(hù)讀取(和你,因?yàn)槟阈枰嫒∧阏跈z查的文件)。如果它拒絕你修改文件,他們也必須是可被你寫(xiě)入的。
階段1:檢查你的表
運(yùn)行
myisamchk *.MYI
或(myisamchk -e *.MYI,如果你有更多的時(shí)間)。使用-s(沉默)選項(xiàng)禁止不必要的信息。
你必須只修復(fù)那些myisamchk報(bào)告有一個(gè)錯(cuò)誤的表。對(duì)這樣的表,繼續(xù)到階段2。
如果在檢查時(shí),你得到奇怪的錯(cuò)誤(例如out of memory錯(cuò)誤),或如果myisamchk崩潰,到階段3。