網站突然出現如下錯誤:
MySQL Error : Duplicate entry '1' for key 'views'
MySQL Errno : 1062
Message : Duplicate entry '1' for key 'views'
我用
myisamchk cdb_posts.myi -r
修復了表,不過表views的內容被清空了(這個命令一定要在停止mysql的時候),還好我這邊是文章訪問量表,不是非常重要,之前也做了備份!
還有不用停止進行熱修復的mysqlcheck:
兩個命令介紹如下:
1、myisamchk
使用 myisamchk 必須暫時停止 MySQL 服務器。例如,我們要檢修 discuz 數據庫。執行以下操作:
# service mysql stop (停止 MySQL );
# myisamchk -r /數據庫文件的絕對路徑/*MYI
# service mysql start
myisamchk 會自動檢查並修復數據表中的索引錯誤。
2、mysqlcheck
使用 mysqlcheck 無需停止 MySQL ,可以進行熱修復。操作步驟如下:
# mysqlcheck –r DBname Tablename –uuser –ppassword
注意,無論是 myisamchk 還是 mysqlcheck ,一般情況下不要使用 -f 強制修復,-f 參數會在遇到一般修復無法成功的時候刪除部分出錯數據以嘗試修復。所以,不到萬不得已不要使用 -f。
推薦用下面的兩個修復表不過有點慢:
REPAIR TABLE `table_name` 修復表
OPTIMIZE TABLE `table_name` 優化表
在大多數情況下,你也可使用命令OPTIMIZE TABLES優化並修復表,如果不是非常情況還是少用myisamchk吧,雖然myisamchk快或可靠(在真正的致命錯誤的情況下)。
主要是OPTIMIZE TABLE較易使用並且你不必須關心清空表。
如果你刪除了一個表的大部分或如果你用變長的行對一個表(有VARCHAR、BLOB或TEXT列的表)做了改變,應該使用OPTIMZE TABLE。刪除的記錄以一個鏈接表維持並且隨后的INSERT操作再次使用老記錄的位置。你可以使用OPTIMIZE TABLE回收閑置的空間。
OPTIMIZE TABLE通過制作原來的表的一個臨時副本來工作。老的表被拷貝到新表中(沒有閑置的行),然后原來的表被刪除並且重命名一個新的。這樣做使得所有更新自動轉向新的表,沒有任何失敗的更新。當OPTIMIZE TABLE正在執行時,原來的表可被另外的客戶讀取。對表的更新和寫入延遲到新表准備好為止。