Latest News

Home » PHP-MySQL-程式設計 » 用Myisamchk進行崩潰恢復MySQL資料庫

用Myisamchk進行崩潰恢復MySQL資料庫

由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。
階段2 :簡單安全的修復
首先,試試myisamchk -r -q tbl_name(-r -q意味著“快速復原模式”)。這將試圖不接觸資料檔案來修復索引檔。如果資料檔案包含它應有的一切和在資料檔案指向正確地點的刪除連接,這應該管用並且表可被修復。開始修理下一張表。否則,使用下列過程:
在繼續前做資料檔案的一個備份。
使用myisamchk -r tbl_name(-r意味著“復原模式”)。這將從資料檔案中刪除不正確的記錄和已被刪除的記錄並重建索引檔。
如果前面的步驟失敗,使用myisamchk –safe-recover tbl_name。安全復原模式使用一個老的恢復方法,處理常規復原模式不行的少數情況(但是更慢)。
如果在修復時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。
階段3 :困難的修理
如果在索引檔的第一個16K塊被破壞,或包含不正確的資訊,或如果索引檔丟失,你只應該到這個階段 。在這種情況下,創建一個新的索引檔是必要的。按如下這樣做:
把資料檔案移更安全的地方。
使用表描述檔創建新的(空)資料和索引檔:
shell> mysql db_name
mysql> DELETE FROM tbl_name;
mysql> quit
將老的資料檔案拷貝到新創建的資料檔案之中。(不要只是將老檔移回新檔之中;你要保留一個副本以防某些東西出錯。)
回到階段2。現在myisamchk -r -q應該工作了。(這不應該是一個無限迴圈)。
階段4:非常困難的修復
只有描述檔也破壞了,你才應該到達這個階段。這應該從未發生過,因為在表被創建以後,描述檔就不再改變了。
從一個備份恢復描述檔並且回到階段3。你也可以恢復索引檔並且回到階段2。對後者,你應該用myisamchk -r啟動。
如果你沒有一個備份但是確切地知道表是怎樣被創建的,在另一個資料庫中創建表的一個拷貝。刪除新的資料檔案,然後從其他資料庫將描述和索引檔移到破壞的資料庫中。這給了你新的描述和索引檔,但是讓資料檔案獨自留下來了。回到階段2並且嘗試重建索引檔。
三、表優化
為了組合成碎片的記錄並且消除由於刪除或更新記錄而浪費的空間, 以復原模式運行myisamchk:
shell> myisamchk -r tbl_name
你可以用SQL的OPTIMIZE TABLE語句使用的相同方式來優化一張表,OPTIMIZE TABLE比較容易,但是myisamchk更快。也沒有在一個實用程式和伺服器之間不必要的交互可能性,因為當你使用OPTIMIZE TABLE時,伺服器做所有的工作。
myisamchk也有你可用來改進一個表的性能的很多其他選項:
-S, –sort-index
-R index_num, –sort-records=index_num
-a, –analyze
對於選項完整的描述見myisamchk調用語法。
FROM:http://www.weste.net/2006/10-26/09563664541.html

About

發佈留言