咨詢電(diàn)話(huà):023-88959644    24小(xiǎo)時(shí)服務熱線:400-023-8809
NEWS CENTER ·
新聞動态
關注中技(jì)互聯 關注前沿

MySQL數(shù)據庫崩潰怎麽辦?用Myisamchk!

發表日期:2013-05-29    文章編輯:張氏    浏覽次數(shù):55    标簽:

www.zjcoo.com

   由MySQL用來(lái)存儲數(shù)據的文件格式以已經被廣泛地測試過,但(dàn)是總是有(yǒu)外部情況可(kě)以導緻數(shù)據庫表被破壞:

  mysqld進程在一個(gè)寫入當中被殺死;計(jì)算(suàn)機的意外關閉(例如,如果計(jì)算(suàn)機掉電(diàn));一個(gè)硬件錯誤。

  這章描述如何檢查和(hé)處理(lǐ)在MySQL數(shù)據庫中的數(shù)據損壞。如果你(nǐ)的表損壞很(hěn)多(duō),你(nǐ)應該嘗試找出其原因!見G.1 調試一個(gè)MySQL服務器(qì)。

  在執行(xíng)崩潰恢複時(shí),理(lǐ)解在一個(gè)數(shù)據庫中的每一個(gè)表tbl_name對應的在數(shù)據庫目錄中的3個(gè)文件是很(hěn)重要的:

  文件 用途

  “tbl_name.frm” 表定義(表格)文件

  “tbl_name.MYD” 數(shù)據文件

  “tbl_name.MYI” 索引文件

  這3個(gè)文件的每一個(gè)文件類型可(kě)能遭受不同形式的損壞,但(dàn)是問題最常發生(shēng)在數(shù)據文件和(hé)索引文件。

  myisamchk通(tōng)過一行(xíng)一行(xíng)地創建一個(gè)“.MYD”(數(shù)據 )文件的副本來(lái)工作(zuò),它通(tōng)過由删除老的“.MYD 文件并且重命名新文件到原來(lái)的文件名結束修複階段。如果你(nǐ)使用--quick,myisamchk不創建一個(gè)臨時(shí)“.MYD”文件,隻是假定“.MYD”文件是正确的并且僅創建一個(gè)新的索引文件,不接觸“.MYD”文件,這是安全的,因為(wèi)myisamchk自動檢測“.MYD”文件是否損壞并且在這種情況下,放棄修複。你(nǐ)也可(kě)以給myisamchk兩個(gè)--quick選項。在這種情況下,myisamchk不會(huì)在一些(xiē)錯誤上(shàng)(象重複鍵)放棄,相反試圖通(tōng)過修改“.MYD”文件解決它們。通(tōng)常,隻有(yǒu)在你(nǐ)在太少(shǎo)的空(kōng)閑磁盤空(kōng)間(jiān)上(shàng)實施一個(gè)正常修複,使用兩個(gè)--quick選項才有(yǒu)用。在這種情況下,你(nǐ)應該至少(shǎo)在運行(xíng)myisamchk前做(zuò)一個(gè)備份。

  一、怎樣檢查表的錯誤

  為(wèi)了檢查一張表,使用下列命令:

  myisamchk tbl_name

  這能找出所有(yǒu)錯誤的99.99%。它不能找出的是僅僅涉及數(shù)據文件的損壞(這很(hěn)不常見)。如果你(nǐ)想要檢查一張表,你(nǐ)通(tōng)常應該沒有(yǒu)選項地運行(xíng)myisamchk或用-s或--silent選項的任何一個(gè)。

  myisamchk -e tbl_name

  它做(zuò)一個(gè)完全徹底的數(shù)據檢查(-e意思是“擴展檢查”)。它對每一行(xíng)做(zuò)每個(gè)鍵的讀檢查以證實他們确實指向正确的行(xíng)。這在一個(gè)有(yǒu)很(hěn)多(duō)鍵的大(dà)表上(shàng)可(kě)能花(huā)很(hěn)長時(shí)間(jiān)。myisamchk通(tōng)常将在它發現第一個(gè)錯誤以後停止。如果你(nǐ)想要獲得(de)更多(duō)的信息,你(nǐ)能增加--verbose(-v)選項。這使得(de)myisamchk繼續一直到最多(duō)20個(gè)錯誤。在一般使用中,一個(gè)簡單的myisamchk(沒有(yǒu)除表名以外的參數(shù))就足夠了。

  myisamchk -e -i tbl_name

  象前面的命令一樣,但(dàn)是-i選項告訴myisamchk還(hái)打印出一些(xiē)統計(jì)信息。

  二、怎樣修複表

  一張損壞的表的症狀通(tōng)常是查詢意外中斷并且你(nǐ)能看到例如這些(xiē)錯誤:

  “tbl_name.frm”被鎖定不能改變。

  不能找到文件“tbl_name.MYI”(Errcode :### )。

  從表處理(lǐ)器(qì)的得(de)到錯誤###(此時(shí),錯誤135是一個(gè)例外)。

  意外的文件結束。

  記錄文件被毀壞。

  在這些(xiē)情況下,你(nǐ)必須修複表。myisamchk通(tōng)常能檢測并且修複出錯的大(dà)部分東西。

  修複過程包含最多(duō)4個(gè)階段,在下面描述。在你(nǐ)開(kāi)始前,你(nǐ)應該cd到數(shù)據庫目錄和(hé)檢查表文件的權限,确保他們可(kě)被運行(xíng)mysqld的Unix用戶讀取(和(hé)你(nǐ),因為(wèi)你(nǐ)需要存取你(nǐ)正在檢查的文件)。如果它拒絕你(nǐ)修改文件,他們也必須是可(kě)被你(nǐ)寫入的。

  階段1:檢查你(nǐ)的表

  運行(xíng)

  myisamchk *.MYI

  或(myisamchk -e *.MYI,如果你(nǐ)有(yǒu)更多(duō)的時(shí)間(jiān))。使用-s(沉默)選項禁止不必要的信息。

  你(nǐ)必須隻修複那(nà)些(xiē)myisamchk報告有(yǒu)一個(gè)錯誤的表。對這樣的表,繼續到階段2。

  如果在檢查時(shí),你(nǐ)得(de)到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。

  階段2 :簡單安全的修複

  首先,試試myisamchk -r -q tbl_name(-r -q意味着“快速恢複模式”)。這将試圖不接觸數(shù)據文件來(lái)修複索引文件。如果數(shù)據文件包含它應有(yǒu)的一切和(hé)在數(shù)據文件指向正确地點的删除連接,這應該管用并且表可(kě)被修複。開(kāi)始修理(lǐ)下一張表。否則,使用下列過程:

  在繼續前做(zuò)數(shù)據文件的一個(gè)備份。

  使用myisamchk -r tbl_name(-r意味着“恢複模式”)。這将從數(shù)據文件中删除不正确的記錄和(hé)已被删除的記錄并重建索引文件。

  如果前面的步驟失敗,使用myisamchk --safe-recover tbl_name。安全恢複模式使用一個(gè)老的恢複方法,處理(lǐ)常規恢複模式不行(xíng)的少(shǎo)數(shù)情況(但(dàn)是更慢)。 如果在修複時(shí),你(nǐ)得(de)到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。

  階段3 :困難的修理(lǐ)

  如果在索引文件的第一個(gè)16K塊被破壞,或包含不正确的信息,或如果索引文件丢失,你(nǐ)隻應該到這個(gè)階段 。在這種情況下,創建一個(gè)新的索引文件是必要的。按如下這樣做(zuò):

  把數(shù)據文件移更安全的地方。

  使用表描述文件創建新的(空(kōng))數(shù)據和(hé)索引文件:

  shell> mysql db_name

  mysql> DELETE FROM tbl_name;

  mysql> quit

  将老的數(shù)據文件拷貝到新創建的數(shù)據文件之中。(不要隻是将老文件移回新文件之中;你(nǐ)要保留一個(gè)副本以防某些(xiē)東西出錯。)

  回到階段2。現在myisamchk -r -q應該工作(zuò)了。(這不應該是一個(gè)無限循環)。

  階段4:非常困難的修複

  隻有(yǒu)描述文件也破壞了,你(nǐ)才應該到達這個(gè)階段。這應該從未發生(shēng)過,因為(wèi)在表被創建以後,描述文件就不再改變了。

  從一個(gè)備份恢複描述文件并且回到階段3。你(nǐ)也可(kě)以恢複索引文件并且回到階段2。對後者,你(nǐ)應該用myisamchk -r啓動。

  如果你(nǐ)沒有(yǒu)一個(gè)備份但(dàn)是确切地知道(dào)表是怎樣被創建的,在另一個(gè)數(shù)據庫中創建表的一個(gè)拷貝。删除新的數(shù)據文件,然後從其他數(shù)據庫将描述和(hé)索引文件移到破壞的數(shù)據庫中。這給了你(nǐ)新的描述和(hé)索引文件,但(dàn)是讓數(shù)據文件獨自留下來(lái)了。回到階段2并且嘗試重建索引文件。

  三、表優化

  為(wèi)了組合成碎片的記錄并且消除由于删除或更新記錄而浪費的空(kōng)間(jiān), 以恢複模式運行(xíng)myisamchk:

  shell> myisamchk -r tbl_name

  你(nǐ)可(kě)以用SQL的OPTIMIZETABLE語句使用的相同方式來(lái)優化一張表,OPTIMIZE TABLE比較容易,但(dàn)是myisamchk更快。也沒有(yǒu)在一個(gè)實用程序和(hé)服務器(qì)之間(jiān)不必要的交互可(kě)能性,因為(wèi)當你(nǐ)使用OPTIMIZE TABLE時(shí),服務器(qì)做(zuò)所有(yǒu)的工作(zuò)。

  myisamchk也有(yǒu)你(nǐ)可(kě)用來(lái)改進一個(gè)表的性能的很(hěn)多(duō)其他選項:

  -S, --sort-index

  -R index_num, --sort-records=index_num

  -a, --analyze

  對于選項完整的描述見myisamchk調用語法。

重慶中技互聯網信息咨詢有限公司 www.zjcoo.com

如沒特殊注明(míng),文章均為(wèi)中技(jì)互聯原創,轉載請(qǐng)注明(míng)來(lái)自www.zjcoo.com
相關新聞

CopyrightZJCOO technology Co., LTD. All Rights Reserved.    

渝ICP 備11003429号

  • qq客服
  • 公衆号
  • 手機版
  • 新浪微博