多數(shù)情況下,數(shù)據(jù)庫被破壞只是指索引文件受到了破壞,真正的數(shù)據(jù)被破壞掉的情況非常少。大多數(shù)形式的數(shù)據(jù)庫破壞的的修復(fù)相當(dāng)簡單。
成都創(chuàng)新互聯(lián)公司是專業(yè)的集賢網(wǎng)站建設(shè)公司,集賢接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行集賢網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
和前面的校驗(yàn)一樣,修復(fù)的方式也有三種。
下面講的方法只對(duì)MyISAM格式的表有效。其他類型的損壞需要從備份中恢復(fù)。
1,REPAIR?TABLE?SQL?statement(mysql服務(wù)必須處于運(yùn)行狀態(tài))。
2,命令mysqlcheck(mysql服務(wù)可以處于運(yùn)行狀態(tài))。
3,命令myisamchk(必須停掉mysql服務(wù),或者所操作的表處于不活動(dòng)狀態(tài))。
在修復(fù)表的時(shí)候,最好先作一下備份。所以你需要兩倍于原始表大小的硬盤空間。請(qǐng)確保在進(jìn)行修復(fù)前你的硬盤空間還沒有用完。
1用”repair?table”方式修復(fù)
語法:repair?table?表名?[選項(xiàng)]
選項(xiàng)如下:
QUICK?用在數(shù)據(jù)表還沒被修改的情況下,速度最快
EXTENDED?試圖去恢復(fù)每個(gè)數(shù)據(jù)行,會(huì)產(chǎn)生一些垃圾數(shù)據(jù)行,萬般無奈的情況下用
USE_FRM?用在.MYI文件丟失或者頭部受到破壞的情況下。利用.frm的定義來重建索引
多數(shù)情況下,簡單得用”repair?table?tablename”不加選項(xiàng)就可以搞定問題。但是當(dāng).MYI文件丟失或者頭部受到破壞時(shí),這樣的方式不管用,例如:
mysql?REPAIR?TABLE?mytable;
+————————-+——–+———-+———————————————+
|?Table?|?Op?|?Msg_type?|?Msg_text?|
+————————-+——–+———-+———————————————+
|?sports_results.mytable?|?repair?|?error?|?Can’t?find?file:?‘mytable.MYI’?(errno:?2)?|
+————————-+——–+———-+———————————————+
修復(fù)失敗的原因時(shí)索引文件丟失或者其頭部遭到了破壞,為了利用相關(guān)定義文件來修復(fù),需要用USE_FRM選項(xiàng)。例如:
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表項(xiàng)的輸出信息”ok”,表名已經(jīng)成功修復(fù)受損表。
2用mysql內(nèi)建命令mysqlcheck來修復(fù)
當(dāng)mysql服務(wù)在運(yùn)行時(shí),也可以用mysql內(nèi)建命令mysqlcheck來修復(fù)。
語法:mysqlcheck?-r?數(shù)據(jù)庫名?表名?-uuser?-ppass
%mysqlcheck?-r?sports_results?mytable?-uuser?-ppass
sports_results.mytable?OK
利用mysqlcheck可以一次性修復(fù)多個(gè)表。只要在數(shù)據(jù)庫名后列出相應(yīng)表名即可(用空格隔開)?;蛘邤?shù)據(jù)庫名后不加表名,將會(huì)修復(fù)數(shù)據(jù)庫中的所有表,例如:
%mysqlcheck?-r?sports_results?mytable?events?-uuser?-ppass
sports_results.mytable?OK
sports_results.events?OK
%mysqlcheck?-r?sports_results?-uuser?-ppass
sports_results.mytable?OK
sports_results.events?OK
3用myisamchk修復(fù)
用這種方式時(shí),mysql服務(wù)必須停掉,或者所操作的表處于不活動(dòng)狀態(tài)(選項(xiàng)skip-external-locking沒被使用)。記著一定要在相關(guān).MYI文件的路徑下或者自己定義其路徑。
語法:myisamchk?[選項(xiàng)]?[表名]
下面是其選項(xiàng)和描述
–backup,?-B?在進(jìn)行修復(fù)前作相關(guān)表得備份
–correct-checksum?糾正校驗(yàn)和
–data-file-length=#,?-D?#?重建表時(shí),指定數(shù)據(jù)文件得最大長度
–extend-check,?-e?試圖去恢復(fù)每個(gè)數(shù)據(jù)行,會(huì)產(chǎn)生一些垃圾數(shù)據(jù)行,萬般無奈的情況下用
–force,?-f?當(dāng)遇到文件名相同的.TMD文件時(shí),將其覆蓋掉。
keys-used=#,?-k?#?指定所用的keys可加快處理速度,每個(gè)二進(jìn)制位代表一個(gè)key.第一個(gè)key為0
–recover,?-r?最常用的選項(xiàng),大多數(shù)破壞都可以通過它來修復(fù)。如果你的內(nèi)存足夠大,可以增大參數(shù)sort_buffer_size的值來加快恢復(fù)的速度。但是遇到唯一鍵由于破壞而不唯一?的表時(shí),這種方式不管用。
–safe-recover?-o?最徹底的修復(fù)方式,但是比-r方式慢,一般在-r修復(fù)失敗后才使用。這種方式讀出?所有的行,并以行為基礎(chǔ)來重建索引。它的硬盤空間需求比-r方式稍微小一點(diǎn),因?為它沒創(chuàng)建分類緩存。你可以增加key_buffer_size的值來加快修復(fù)的速度。
–sort-recover,?-n?mysql用它類分類索引,盡管結(jié)果是臨時(shí)文件會(huì)非常大
–character-sets-dir=…?包含字符集設(shè)置的目錄
–set-character-set=name?為索引定義一個(gè)新的字符集
–tmpdir=path,?-t?如果你不想用環(huán)境變量TMPDIR的值的話,可以自定義臨時(shí)文件的存放位置
–quick,?-q?最快的修復(fù)方式,當(dāng)數(shù)據(jù)文件沒有被修改時(shí)用,當(dāng)存在多鍵時(shí),第二個(gè)-q將會(huì)修改?數(shù)據(jù)文件
–unpack,?-u?解開被myisampack打包的文件
myisamchk應(yīng)用的一個(gè)例子
%?myisamchk?-r?mytable
-?recovering?(with?keycache)?MyISAM-table?‘mytable.MYI’
有兩種方法,一種方法使用mysql的check table和repair table 的sql語句,另一種方法是使用MySQL提供的多個(gè)myisamchk, isamchk數(shù)據(jù)檢測恢復(fù)工具。
前者使用起來比較簡便。推薦使用。
1、check table 和 repair table 登陸mysql 終端: mysql -uxxxxx -p dbname check table tabTest;
如果出現(xiàn)的結(jié)果說Status是OK,則不用修復(fù),如果有Error,可以用: repair table tabTest; 進(jìn)行修復(fù),修復(fù)之后可以在用check table命令來進(jìn)行檢查。
在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk 其中myisamchk適用于MYISAM類型的數(shù)據(jù)表,而isamchk適用于ISAM類型的數(shù)據(jù)表。
這兩條命令的主要參數(shù)相同,一般新的系統(tǒng)都使用MYISAM作為缺省的數(shù)據(jù)表類型,這里以myisamchk為例子進(jìn)行說明。
當(dāng)發(fā)現(xiàn)某個(gè)數(shù)據(jù)表出現(xiàn)問題時(shí)可以使用: myisamchk tablename.MYI 進(jìn)行檢測,如果需要修復(fù)的話,可以使用: myisamchk -of tablename.MYI 關(guān)于myisamchk的詳細(xì)參數(shù)說明,可以參見它的使用幫助。
需要注意的時(shí)在進(jìn)行修改時(shí)必須確保MySQL服務(wù)器沒有訪問這個(gè)數(shù)據(jù)表,保險(xiǎn)的情況下是最好在進(jìn)行檢測時(shí)把MySQL服務(wù)器Shutdown掉。
2、另外可以把下面的命令放在你的rc.local里面啟動(dòng)MySQL服務(wù)器前: [ -x /tmp/mysql.sock ] /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI 。
其中的/tmp/mysql.sock是MySQL監(jiān)聽的Sock文件位置,對(duì)于使用RPM安裝的用戶應(yīng)該是/var/lib/mysql/mysql.sock,對(duì)于使用源碼安裝則是/tmp/mysql.sock可以根據(jù)自己的實(shí)際情況進(jìn)行變更,而pathtochk則是myisamchk所在的位置,DATA_DIR是你的MySQL數(shù)據(jù)庫存放的位置。
需要注意的是,如果你打算把這條命令放在你的rc.local里面,必須確認(rèn)在執(zhí)行這條指令時(shí)MySQL服務(wù)器必須沒有啟動(dòng)!
最后檢測修復(fù)所有數(shù)據(jù)庫(表)。
1、先在運(yùn)行中輸入services.msc,找到MysQL的服務(wù),將其停止;
2、然后備份新安裝的MY.INI和DATA這兩個(gè)目錄,直接將其原來mysql/data下的文件拷到新安裝的mysql/data目錄下即可;
3、啟動(dòng)MysQL服務(wù)。該方法只在新安裝的數(shù)據(jù)庫與舊數(shù)據(jù)庫版本相同的情況下實(shí)驗(yàn)成果。重新打開navicat,發(fā)現(xiàn)原來的數(shù)據(jù)庫都可以使用了。