熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

mysql數據文件破壞後的修復方法

2013-11-23 21:02:36  來源: MySQL 

  由於臨時斷電使用kill 中止MySQL服務進程所有的這些都可能會毀壞MySQL的數據文件如果在被干擾時服務正在改變文件文件可能會留下錯誤的或不一致的狀態因為這樣的毀壞有時是不容易被發現的當你發現這個錯誤時可能是很久以後的事了於是當你發現這個問題時也許所有的備份都有同樣的錯誤

  MySQL參考手冊的第十五章講述了MySQL自帶的myisamchk的功能以及如何使用它檢查和修復你的MySQL數據文件雖然這一章對於每個想要搭建一個強壯的MySQL服務的人都是推薦閱讀的我們還是有必要在這裡對其中的要點進行討論

  在我們繼續之前你必須意識到myisamchk程序對用來檢查和修改的MySQL數據文件的訪問應該是唯一的如果MySQL服務正在使用某一文件並對myisamchk正在檢查的文件進行修改myisamchk會誤以為發生了錯誤並會試圖進行修復這將導致MySQL服務的崩潰!這樣要避免這種情況的發生通常我們需要在工作時關閉MySQL服務作為選擇你也可以暫時關閉服務以制作一個文件的拷貝然後在這個拷貝上工作當你做完了以後重新關閉服務並使用新的文件取代原來的文件(也許你還需要使用期間的變更日志)

  MySQL數據目錄不是太難理解的每一個數據庫對應一個子目錄每個子目錄中包含了對應於這個數據庫中的數據表的文件每一個數據表對應三個文件它們和表名相同但是具有不同的擴展名tblNamefrm文件是表的定義它保存了表中包含的數據列的內容和類型tblNameMYD文件包含了表中的數據tblNameMYI文件包含了表的索引(例如它可能包含lookup表以幫助提高對表的主鍵列的查詢)

  要檢查一個表的錯誤只需要運行myisamchk(在MySQL的bin目錄下)並提供文件的位置和表名或者是表的索引文件名

  myisamchk /usr/local/mysql/var/dbName/tblName
    myisamchk /usr/local/mysql/var/dbName/tblNameMYI

  上面的兩個命令都可以執行對指定表的檢查要檢查數據庫中所有的表可以使用通配符

  myisamchk /usr/local/mysql/var/dbName/*MYI

  要檢查所有數據庫中的所有表可以使用兩個通配符 myisamchk /usr/local/mysql/var/*/*MYI

  如果不帶任何選項myisamchk將對表文件執行普通的檢查如果你對一個表有懷疑但是普通的檢查不能發現任何錯誤你可以執行更徹底的檢查(但是也更慢!)這需要使用extendcheck選項

  myisamchk extendcheck /path/to/tblName

  對錯誤的檢查是沒有破壞性的這意味著你不必擔心執行對你的數據文件的檢查會使已經存在的問題變得更糟另一方面修復選項雖然通常也是安全的但是它對你的數據文件的更改是無法撤消的因為這個原因我們強烈推薦你試圖修復一個被破壞的表文件時首先做個備份並確保在制作這個備份之前你的MySQL服務是關閉的

  當你試圖修復一個被破壞的表的問題時有三種修復類型如果你得到一個錯誤信息指出一個臨時文件不能建立刪除信息所指出的文件並再試一次這通常是上一次修復操作遺留下來的
    這三種修復方法如下所示

  myisamchk recover quick /path/to/tblName
    myisamchk recover /path/to/tblName
    myisamchk saferecover /path/to/tblName

  第一種是最快的用來修復最普通的問題而最後一種是最慢的用來修復一些其它方法所不能修復的問題

  檢查和修復MySQL數據文件
    如果上面的方法無法修復一個被損壞的表在你放棄之前你還可以試試下面這兩個技巧

  如果你懷疑表的索引文件(*MYI)發生了不可修復的錯誤甚至是丟失了這個文件你可以使用數據文件(*MYD)和數據格式文件(*frm)重新生成它首先制作一個數據文件(tblNameMYD)的拷貝重啟你的MySQL服務並連接到這個服務上使用下面的命令刪除表的內容

  mysql DELETE FROM tblName;

  在刪除表的內容的同時會建立一個新的索引文件退出登錄並重新關閉服務然後用你剛才保存的數據文件(tblNameMYD)覆蓋新的(空)數據文件最後使用myisamchk執行標准的修復(上面的第二種方法)根據表的數據的內容和表的格式文件重新生成索引數據

  如果你的表的格式文件(tblNamefrm)丟失了或者是發生了不可修復的錯誤但是你清楚如何使用相應的CREATE TABLE語句來重新生成這張表你可以重新生成一個新的frm文件並和你的數據文件和索引文件(如果索引文件有問題使用上面的方法重建一個新的)一起使用首先制作一個數據和索引文件的拷貝然後刪除原來的文件(刪除數據目錄下有關這個表的所有記錄)

  啟動MySQL服務並使用當初的CREATE TABLE文件建立一個新的表新的frm文件應該可以正常工作了但是最好你還是執行一下標准的修復(上面的第二種方法)

  可以使用mysql語句用 CHECK TABLE $table; //其中$table代表數據表的名字檢測表是否損壞如果損壞可以REPAIR TABLE $table 來修復如果一次不行可以多修復幾次!

  如果使用WIN服務器可以先登陸DB服務器進入此路徑不用進mysql裡

  D:\CD MYSQL

  D:\mysql>CD BIN

  D:\mysql\bin>MYISAMCHK r d:\mysql\data\guild\msg_tablemyi(msg_table)
    check key deletechain
    check record deletechain
    recovering (with sort) MyISAMtable d:\mysql\data\guild\msg_tablemyi
    Data records:
    Fixing index

  D:\mysql\bin>MYISAMCHK saferecover d:\mysql\data\guild\msg_tablemyi
    recovering (with keycache) MyISAMtable d:\mysql\data\guild\msg_tablemyi
    Data records:

  D:\mysql\bin>

  當不知道哪個表壞了可以進入mysql數據庫:
    use guild;
    desc msg_table; 看msg_table有沒有壞

  修復好了進入MYSQL數據庫中打命令檢查show table;


From:http://tw.wingwit.com/Article/program/MySQL/201311/29485.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.