本文提供兩種檢查修復方式:mysqlcheck 和 myisamchk ,均在MySQL安裝目錄bin文件夾下。html
mysqlcheck 和 myisamchk 程序主要用於檢查和修復數據表(主要是 MyISAM 表),好比因爲服務器崩潰致使的 MyISAM 表損壞。如下是二者的比較:mysql
一、二者均能檢測、修復、分析 MyISAM 類型表。 mysqlcheck 還能優化 MyISAM 表,同時還能檢測 InnoDB 類型表,分析 BDB 表。但有些操做是 mysqlcheck 不能匹敵的,好比,myisamchk 能夠啓動和禁止索引。sql
二、兩者在使用上有着很大的區別。mysqlcheck 是一個客戶端程序,可經過網絡鏈接到服務器。他提供了一個可對接服務器表維護指令的命令行接口,好比 CHECK TABLE 和 REPAIR TABLE。mysqlcheck會依據命令行上輸入的指令,發送對應的SQL描述到服務器,供服務器執行。這就意味着服務器必須是處於啓動運行狀態,同時也意味着你可以經過 mysqlcheck 鏈接到遠程服務器。相反, myisamchk 不是客戶端程序,他是一個直接操做 MyISAM 物理表的通用工具。這就意味着你必須在 MyISAM 表文件所在的服務器上使用這個工具。同時,當你檢測表時須要有文件讀取權限,當修復表時須要有寫入權限。數據庫
三、二者在運行時,與服務器的關係也大不相同。使用 mysqlcheck 時,你仍能夠和服務器進行交互。由於 mysqlcheck 是要求服務器本身去進行表的檢測和修復。使用 myisamchk 時,你須要確保服務器並無打開目標表且目標表沒有被其餘人使用中。若是myisamchk和mysql server同時對錶操做,可能致使表被損壞。所以,爲了不這種狀況的發生,在使用 myisamchk 時應停掉MySQL服務。 myisamchk 在檢測修復表的過程當中可能會鎖定表文件。服務器
一、遠程檢測表,如圖(表正常):網絡
二、服務器端使用 mysqlcheck 時則不須要指定遠程服務器地址,如圖(表存在問題):工具
指令說明:優化
-c 檢查操做,後邊跟數據庫名稱 [表名]spa
-h 主機地址命令行
-P 端口號
-u 用戶名
-p 密碼
注意:
1)若是提示 「mysqlcheck: [ERROR] unknown option '--no-beep'」 ,則須要修改MySQL配置文件,將 [client] 下的 no-beep 註釋掉(註釋符號 #)
2)命令使用過程當中須要輸入用戶憑證,若是服務器端存在多個實例,還須要指定實例端口號。
三、使用 mysqlcheck 修復表,以下圖:
mysqlcheck 不能修復惟一鍵不惟一的錯誤...
指令說明:
-r 數據修復.Perform a repair that can fix almost anything except unique keys that are not unique.
更多相關操做,看這裏
如第一部分,該工具只能在服務器端使用,且須要關閉MySQL服務。
使用 Myisamchk 修復數據,須要進入到MySQL物理庫對應的文件夾,而後執行修復指令,以下圖:
指令說明:
-r 數據恢復。If you have lots of memory, you should increase the value of myisam_sort_buffer_size
.
注意:
第一次運行時, 拋出 「myisamchk: error: myisam_sort_buffer_size is too small」 錯誤,此時只須要在指令後面追加 --sort_buffer_size=2G(根據須要)便可。
更多相關操做,看這裏
myisamchk 修復數據時簡單粗暴,感受效率更快一下(感受,沒證據...)
上邊的兩種方法均已驗證,修復了個人三張表。
表錯誤的表現1:[Err] 1062 - Duplicate entry '31729205' for key 'PRIMARY' 主鍵爲自增(int類型),插入的主鍵數據在原表中不存在。
表錯誤的表現2:*** marked crashed...
表錯誤的表現3:查看錶對象信息時,表的基本信息表述爲空
問題解決,結貼。沒有更深刻的研究瞭解,歡迎評論交流~
參考:
1.How to Check and Repair MySQL Tables Using Mysqlcheck
2.MySQL Table is marked as crashed and last (automatic?) repair failed