多數(shù)情況下,數(shù)據(jù)庫被破壞只是指索引文件受到了破壞,真正的數(shù)據(jù)被破壞掉的情況非常少。大多數(shù)形式的數(shù)據(jù)庫破壞的的修復相當簡單,修復的方式也有三種虫几。
下面講的方法只對MyISAM格式的表有效南蹂。其他類型的損壞需要從備份中恢復施蜜。
1,REPAIR TABLE SQL statement(mysql服務必須處于運行狀態(tài))。
2,命令mysqlcheck(mysql服務可以處于運行狀態(tài))。
3,命令myisamchk(必須停掉mysql服務,或者所操作的表處于不活動狀態(tài))坑雅。
在修復表的時候,最好先作一下備份。
1>用”repair table”方式修復
語法:repair table 表名 [選項]
選項如下:
QUICK 用在數(shù)據(jù)表還沒被修改的情況下,速度最快
EXTENDED 試圖去恢復每個數(shù)據(jù)行,會產(chǎn)生一些垃圾數(shù)據(jù)行,萬般無奈的情況下用
USE_FRM 用在.MYI文件丟失或者頭部受到破壞的情況下衬横。利用.frm的定義來重建索引
多數(shù)情況下,簡單得用”repair table tablename”不加選項就可以搞定問題裹粤。但是當.MYI文件丟失或者頭部受到破壞時,這樣的方式不管用,例如:
mysql> REPAIR TABLE mytable;
+————————-+——–+———-+———————————————+
| Table | Op | Msg_type | Msg_text |
+————————-+——–+———-+———————————————+
| sports_results.mytable | repair | error | Incorrect key file for table 'info_sigleday_pvuv'; try to repair it|
+————————-+——–+———-+———————————————+
修復失敗的原因時索引文件丟失或者其頭部遭到了破壞,為了利用相關(guān)定義文件來修復,需要用USE_FRM選項。例如:
mysql> REPAIR TABLE mytable USE_FRM;
+————————-+——–+———-+————————————+
| Table | Op | Msg_type | Msg_text |
+————————-+——–+———-+————————————+
| sports_results.mytable | repair | warning | Number of rows changed from 0 to 2 |
| sports_results.mytable | repair | status | OK |
+————————-+——–+———-+————————————+
我們可以看到Msg_test表項的輸出信息”ok”,表名已經(jīng)成功修復受損表蜂林。
2>用mysql內(nèi)建命令mysqlcheck來修復
當mysql服務在運行時,也可以用mysql內(nèi)建命令mysqlcheck來修復遥诉。
語法:mysqlcheck -r 數(shù)據(jù)庫名 表名 -uuser -ppass
%mysqlcheck -r sports_results mytable -uuser -ppass
sports_results.mytable OK
利用mysqlcheck可以一次性修復多個表。只要在數(shù)據(jù)庫名后列出相應表名即可(用空格隔開)噪叙“猓或者數(shù)據(jù)庫名后不加表名,將會修復數(shù)據(jù)庫中的所有表
3>用myisamchk修復
用這種方式時,mysql服務必須停掉,或者所操作的表處于不活動狀態(tài)(選項skip-external-locking沒被使用)。記著一定要在相關(guān).MYI文件的路徑下或者自己定義其路徑构眯。
語法:myisamchk [選項] [表名]