MySQL表損壞一般是數據損壞,引起損壞的原因可能是由于磁盤損壞、系統崩潰或者MySQL服務器被崩潰等外部原因。例如有人使用kill -9終止進程,導致MySQL進程未能正常關閉,那么就很有可能導致數據損壞。 對于不同的引擎,數據損壞修復的方式不一樣,作為一般情況可以嘗試使用CHECK TABLE和REPAIR TABLE命令修復。
MyISAM損壞有兩種修復方式:
查看表是否損壞:
mysql> CHECK TABLE t1;+---------------+-------+----------+----------+| Table | Op | Msg_type | Msg_text |+---------------+-------+----------+----------+| db1.t1 | check | status | OK |+---------------+-------+----------+----------+1 row in set (0.00 sec)修復表:
mysql> repair table t1;+---------------+--------+----------+---------------------------------------------------------+| Table | Op | Msg_type | Msg_text |+---------------+--------+----------+---------------------------------------------------------+| db1.t1 | repair | note | The storage engine for the table doesn't support repair |+---------------+--------+----------+---------------------------------------------------------+1 row in set (0.00 sec)如果單純執行REPAIR TABLE沒有起到什么效果,那么可以選擇另外兩個選項: - REPAIR TABLE EXTENDED,速度比REPAIR TABLE慢得多,但是可以修復99%的錯誤; - REPAIR TABLE USE_FRM,它會刪除索引并利用table_name.frm文件中的描述重建索引,并通過table_name.MYD文件填充健對應的值。
myisamchk可以直接訪問表文件,而無須啟動MySQL服務器。 進入datadir文件目錄,執行基本命令:
myisamchk --backup --recover t1其中,--backup選項是在嘗試修復表之前先進行數據文件備份,還有其他使用選項就不一一介紹了。
InnoDB是帶有事務的存儲引擎,并且其內部機制會自動修復大部分數據損壞錯誤,它會在服務器啟動時進行修復。 不過,有時候數據損壞得很嚴重并且InnoDB無法在沒有用戶交互的情況下完成修復,在這種情況下,有--innodb_force_recovery啟動選項。 該選項可以設置0~6(0 不強制修復 1是最低級別 6最高級別)。  如果發生損壞,可以從1開始嘗試修復,直到可以啟動服務器并且可以訪問有問題的表為止. 啟動后使用select into outfile將表轉儲到文件中,然后使用drop和create命令重新創建表,最后用--innodb_force_recovery=0重新啟動服務器,然后加載文件數據。 當需要在--innodb_force_recovery選項是正數的情況下修復數據庫時,錯誤日志通常會有明確的提示信息。
新聞熱點
疑難解答