MySQL表損壞修復解決方案
資料損壞原因
MySQL表損壞一般是資料損壞,引起損壞的原因可能是由於磁碟損壞、系統崩潰或者MySQL伺服器被崩潰等外部原因。例如有人使用kill -9
終止程序,導致MySQL程序未能正常關閉,那麼就很有可能導致資料損壞。
對於不同的引擎,資料損壞修復的方式不一樣,作為一般情況可以嘗試使用CHECK TABLE
和REPAIR TABLE
命令修復。
MyISAM損壞的修復方案
MyISAM損壞有兩種修復方式:
1.通過SQL修復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檔案填充健對應的值。
2. 使用myisamchk修復MyISAM
myisamchk可以直接訪問表文件,而無須啟動MySQL伺服器。
進入datadir檔案目錄,執行基本命令:
myisamchk --backup --recover t1
其中,--backup
選項是在嘗試修復表之前先進行資料檔案備份,還有其他使用選項就不一一介紹了。
InnoDB資料損壞修復
InnoDB是帶有事務的儲存引擎,並且其內部機制會自動修復大部分資料損壞錯誤,它會在伺服器啟動時進行修復。
不過,有時候資料損壞得很嚴重並且InnoDB無法在沒有使用者互動的情況下完成修復,在這種情況下,有--innodb_force_recovery
啟動選項。
該選項可以設定0~6(0 不強制修復 1是最低級別 6最高級別)。
如果發生損壞,可以從1開始嘗試修復,直到可以啟動伺服器並且可以訪問有問題的表為止.
啟動後使用select into outfile
將錶轉儲到檔案中,然後使用drop
和create
命令重新建立表,最後用--innodb_force_recovery=0
重新啟動伺服器,然後載入檔案資料。
當需要在--innodb_force_recovery
選項是正數的情況下修復資料庫時,錯誤日誌通常會有明確的提示資訊。