1. 程式人生 > >MySQL表損壞修復解決方案

MySQL表損壞修復解決方案

資料損壞原因

MySQL表損壞一般是資料損壞,引起損壞的原因可能是由於磁碟損壞、系統崩潰或者MySQL伺服器被崩潰等外部原因。例如有人使用kill -9終止程序,導致MySQL程序未能正常關閉,那麼就很有可能導致資料損壞。
對於不同的引擎,資料損壞修復的方式不一樣,作為一般情況可以嘗試使用CHECK TABLEREPAIR 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將錶轉儲到檔案中,然後使用dropcreate命令重新建立表,最後用--innodb_force_recovery=0重新啟動伺服器,然後載入檔案資料。
當需要在--innodb_force_recovery選項是正數的情況下修復資料庫時,錯誤日誌通常會有明確的提示資訊。