有的時候因為停電或者其他原因導致數據庫損壞,我們可以使用mysql自帶的mysqlcheck命令來快速修復所有的數據庫或者特定的數據庫;
接到監控系統進行報警,發現數據庫服務器死機,立刻重啟服務器,由于myqsql沒有正常關閉,導致在宕機是對數據庫中有操作的表損壞,需要進行修復數據表。
1、通過xshell的ssh協議登錄mysql服務器。
#ssh root@1.1.1.1 //回車,輸入密碼。
2、登錄mysql
#mysql -p //回車,輸入密碼。
3、進入數據庫,檢測表是否損壞,并修復數據表。
#use 數據庫名字。
#check table 表名 。//檢測表數據是否損壞。
#repair table 表名。//修復表數據。
舉個例子,如何判斷表叔家是否損壞。
數據表損壞
+—————————+——-+———-+————————————————————-+
| Table | Op | Msg_type | Msg_text |
+—————————+——-+———-+————————————————————-+
|test.123 | check | warning | Table is marked as crashed |
|test.123 | check | warning | 2 clients are using or haven’t closed the table properly |
|test.123 | check | warning | Size of datafile is: 3424854016 Should be: 3424853036 |
|test.123 | check | error | Record at pos: 3382461400 is not remove-marked |
|test.123 | check | error | record delete-link-chain corrupted |
|test.123 | check | error | Corrupt
數據表未損壞
+——————–+——-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+——————–+——-+———-+———-+
|test.123 | check | status | OK |
+——————–+——-+———-+———-+
如果數據庫較多,表較多,這樣修復是非常耗時的,所以采用如下方法:
1、通過xshell的ssh協議登錄mysql服務器。
#ssh root@1.1.1.1 //回車,輸入密碼。
2、檢測數據庫各個表的狀態。
# mysqlcheck -a -o 數據庫名字 -p //回車輸入密碼,然后回車。
如果有如下錯誤,進行表修復
Test.123
error : Found key at page 821865472 that points to record outside datafile
status : Operation failed
3、登錄mysql
#mysql -p //回車,輸入密碼。
4、進入數據庫,檢測表是否損壞,并修復數據表。
#use 數據庫名字。
#check table 表名 。//檢測表數據是否損壞。
#repair table 表名。//修復表數據。
PS:
為了安全起見,以下兩種方法不建議在生產環境中使用
#mysqlcheck -a -o -r -p //檢查優化并修復所有的數據庫
#mysqlcheck -A -o -r 數據庫名稱 -p //修復指定的數據庫
參數含意:
-a = Analyse given tables. //分析數據表
-c = Check table for errors //檢查數據庫中錯誤(損壞)的表
-o = Optimise table //優化數據表
-r = Can fix almost anything except unique keys that aren’t unique // 修復損壞的數據表
-m = –medium-check //
mysqlcheck說明:
mysqlcheck客戶端可以檢查和修復MyISAM表。它還可以優化和分析表。
mysqlcheck的功能類似myisamchk,但其工作不同。主要差別是當mysqld服務器在運行時必須使用mysqlcheck,而myisamchk應用于服務器沒有運行時。使用mysqlcheck的好處是不需要停止服務器來檢查或修復表。使用myisamchk修復失敗是不可逆的。
Mysqlcheck為用戶提供了一種方便的使用SQL語句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。它確定在要執行的操作中使用使用哪個語句,然后將語句發送到要執行的服務器上。