李逍遙

如何利用myisamchk和mysqlcheck快速修復損壞的MySQL數據庫

李逍遙 網絡干貨 2020-01-20

如何利用myisamchk和mysqlcheck快速修復損壞的MySQL數據庫

由于服務器的數據庫硬盤空間滿了,由于大量寫入數據失敗導致了出現“Duplicate entry '' for key 'username'”的錯誤。

如果,出現這樣的mysql數據庫錯誤很可能是mysql數據庫索引出了問題。那么,什么是mysql數據庫索引?

分析:索引如果是primary unique這兩兩種,那么數據表的數據對應的這個字段就必須保證其每條記錄的唯一性。否則就會產生這個錯誤。

一般發生在對數據庫寫操作的時候,例如Discuz!4.1論壇程序要求所有會員的用戶名username必須唯一,即username 的索引是unique,這時如果強行往cdb_members表里插入一個已有的username的記錄就會發上這個錯誤,或者將一條記錄的username更新為已有的一個username。

比如某網友的dedecms網站出問題了,訪問一看,果然全屏報錯,檢查mysql日志,錯誤信息為:

Table .dedecmsv4dede_archives is marked as crashed and should be repaired

提示說cms的文章表dede_archives被標記有問題,需要修復。

于是趕快恢復歷史數據,上網查找原因。最終將問題解決。

解決方法如下:

找到mysql的安裝目錄的bin/myisamchk工具,在命令行中輸入:

myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI

然后myisamchk 工具會幫助你恢復數據表的索引。重新啟動mysql,問題解決。

那么,修復mysql數據庫一般可以myisamchk工具或者mysqlcheck工具用這二種方法:

1、myisamchk工具

使用 myisamchk 必須暫時停止 MySQL 服務器。例如,我們要檢修 discuz 數據庫。執行以下操作:

# service mysql stop (停止 MySQL );

# myisamchk -r /數據庫文件的絕對路徑/*MYI

# service mysql start

myisamchk 會自動檢查并修復數據表中的索引錯誤。

2、mysqlcheck工具

使用 mysqlcheck 無需停止 MySQL ,可以進行熱修復。操作步驟如下:

# mysqlcheck -r discuz.*

# service mysql stop (停止 MySQL );

# myisamchk -r /數據庫文件的絕對路徑/*MYI

# service mysql start

myisamchk 會自動檢查并修復數據表中的索引錯誤。

注意:無論是 myisamchk 還是 mysqlcheck ,一般情況下不要使用 -f 強制修復,-f 參數會在遇到一般修復無法成功的時候刪除部分出錯數據以嘗試修復。所以,不到萬不得已不要使用 -f。

繼續瀏覽有關 MySQL數據庫 的文章
發表評論