myisamchk命令進行崩潰恢復Myisam數據表

由MySQL用來存儲數據的文件格式以已經被廣泛地測試過,但是總是有外部情況可以導致數據庫表被破壞:

1.mysqld進程在一個寫入當中被殺死。
2.計算機的意外關閉(例如,如果計算機掉電)。
3.一個硬件錯誤

例如:

 Table ‘./數據庫名/表名’ is marked as crashed and should be repaired

在執行崩潰恢復時,理解在一個數據庫中的每一個表tbl_name對應的在數據庫目錄中的3個文件是很重要的:

             文件                        用途
“tbl_name.frm” 表定義(表格)文件
“tbl_name.MYD” 數據文件
“tbl_name.MYI” 索引文件

這3個文件的每一個文件類型可能遭受不同形式的損壞,但是問題最常發生在數據文件和索引文件。

怎樣檢查表的錯誤

爲了檢查一張表,使用下列命令:

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還打印出一些統計信息。

 myisamchk支持下列參數:

-a, –analyze
分析鍵值的分佈。這通過讓聯結優化器更好地選擇表應該以什麼次序聯結和應該使用哪個鍵來改進聯結性能。
-#, –debug=debug_options
輸出調試記錄文件。debug_options字符串經常是’d:t:o,filename’。
-d, –description
打印出關於表的一些信息。
-e, –extend-check
非常徹底地檢查表。這僅在極端情況下是必要的。通常,myisamchk應該找出所有錯誤,即使沒有改選項。
-f, –force
覆蓋老的臨時文件。如果你在檢查表時使用-f (運行myisamchk沒有-r),myisamchk在檢查期間將自動爲出現一個錯誤的表用-r重啓。
–help
顯示一條幫助消息並且退出。
-i, –information
打印有關被檢查的表的信息統計。
-k #, –keys-used=#
與-r一起使用。告訴ISAM表處理器僅更新頭#個索引。較高編號的索引被撤銷。這能用來使插入變得更快!撤銷的索引能通過使用myisamchk -r被重新激活。
-l, –no-symlinks
在修復時,不跟隨符號連接。通常myisamchk修復一個符號連接所指的表。
-q, –quick
與-r一起使用使得一個修復更快。通常,原來的數據文件沒被接觸;你能指定第二個-q強制使用原來的數據文件。
-r, –recover
恢復模式。可以修復幾乎所有一切,除非唯一的鍵不是唯一。
-o, –safe-recover
恢復模式。使用一個老的恢復方法;這比-r慢些,但是能處理一-r不能處理的情況。
-O var=option, –set-variable var=option
設置一個變量的值。可能的變量列在下面。
-s, –silent
沉默模式。當錯誤發生時,僅寫輸出。你能使用-s兩次(-ss)非常沉默地做myisamchk。
-S, –sort-index
以從高到低的順序排序索引樹塊。這將優化搜尋並且將使按鍵值的表掃描更快。
-R index_num, –sort-records=index_num
根據一個索引排序記錄。這使你的數據更局部化並且可以加快在該鍵上的SELECT和ORDER BY的範圍搜索。(第一次做排序可能很慢!) 爲了找出一張表的索引編號,使用SHOW INDEX,它以myisamchk看見他們的相同順序顯示一張表的索引。索引從1開始編號。
-u, –unpack
解開一個用myisampack壓縮的表。
-v, –verbose
冗長模式。打印更多的信息。這能與-d和-e一起使用。爲了更冗長,使用-v多次(-vv, -vvv)!
-V, –version
打印myisamchk版本並退出。
-w, –wait
如果表被鎖定,等待。

myisamchk用法

注意:使用myisamchk前,要確保mysqld沒有在訪問要檢查的表。最好停止mysqld。

1 執行myisamchk –update-state -s *.myi,檢查有哪些索引文件出了問題(可能會化費比較長的時間)。

update-state選項只有在停止mysqld的時候使用,-s表示忽略一些正常的表列出的信息,只列出錯誤。

2 對於每一個損壞的表,嘗試myisamchk -r -q table_name。這是快速修復模式,會自動檢查索引表和數據表是否能夠一致。如果一致,則可以修復。

3 如果快速修復模式失敗,考慮:myisamchk -r table_name,會刪除不一致的數據和索引,並重新構建索引。

4 如果3失敗,考慮:myisamchk –safe-recover table_name

發佈了8 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章