共計 1167 個字符,預計需要花費 3 分鐘才能閱讀完成。
如何利用 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。