程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> Myisamchk進行崩潰恢復MySQL

Myisamchk進行崩潰恢復MySQL

編輯:關於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調用語法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved