english簡體中文繁體中文UTF8中文  設為主頁   收藏我們  幫助 
 
首頁 企業 服務 家政 二手 工作 商店 新聞 博覽 交友 車友 論壇 博客 相冊 軟件 健康 報價
   帳號: 密碼:   忘記密碼   注冊會員
推薦商品
十一月 2006
« 十月   Jan »
 12345
6789101112
13141516171819
20212223242526
27282930  
BLOG最新評論

用Myisamchk進行崩潰恢復MySQL

歸類︰ 電腦網絡阿Q | 2006年11月15日 @ 10:37 pm (閱讀: 1626)

由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調用語法。

標簽:

相關文章:

發表評論

抱歉,您必須登錄後才可以發表評論。


TAG標簽:

Google Linux MPX mysql Paypal SIGMA tar 安溪 安裝 貝寶 蔡氏古民居 狄恩.卡門 電腦網絡 俄羅斯方塊 發明 法學園地 公司企業 共享 孤單 官橋 海灘 喝麻 紅塔灣 後深溪 互聯網 惠女水庫 婚禮 教育學習 經濟金融 鏡頭 開源運動 科學技術 老家 理財 路由器 旅游自然 碼表 密碼 女兒 女人 皮膚病 清源山 泉州小吃 日志 森林公園 山地車 少兒樂園 社會文化 社團 生活資訊 收款 手機 手術 數據 雙絞線 獺窟 體育競技 土耳其烤肉歌 外匯 維基 文學世界 我想我不夠愛你 無題 無線 西格瑪 廈門 新年 新聞出版 幸福 雪峰寺 醫藥健康 醫院 藝術之窗 隱私 硬盤 游泳 有情人終成眷屬 娛樂休閑 樟腳 祝福 賺錢 自行車

  版權說明| 隱私保護| 網站地圖| 天氣預報| 記事日歷| 友情鏈接| 關于我們| 聯系我們
 閩ICP備05016518號 Powered by qzsq © 2004-2008 泉州社區服務信息 WAP RSS