有的時候因為掉電或者其他原因導致資料庫損壞,我們可以使用MySQL內建的mysqlcheck命令來快速修複所有的資料庫或者特定的資料庫;例如
檢查最佳化並修複所有的資料庫用:
# mysqlcheck -A -o -r -p
Enter password:
database1 OK
database2 OK
----------
修複指定的資料庫用
# mysqlcheck -A -o -r Database_NAME -p
即可
另外如果只是對某個表進行修複可以用:myisamchk或isamchk
其中myisamchk適用於MYISAM類型的資料表,而isamchk適用於ISAM類型的資料表。這兩條命令的主要參數相同,一般新的系統都使用MYISAM作為預設的資料表類型,這裡以myisamchk為例子進行說明。當發現某個資料表出現問題時可以使用:
myisamchk tablename.MYI
進行檢測,如果需要修複的話,可以使用:
myisamchk -of tablename.MYI
關於myisamchk的詳細參數說明,可以參見它的使用協助。需要注意的時在進行修改時必須確保MySQL伺服器沒有訪問這個資料表,保險的情況下是最好在進行檢測時把MySQL伺服器Shutdown掉。
另外可以把下面的命令放在你的rc.local裡面啟動MySQL伺服器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL監聽的Sock檔案位置,對於使用RPM安裝的使用者應該是 /var/lib/mysql/mysql.sock,對於使用源碼安裝則是/tmp/mysql.sock可以根據自己的實際情況進行變更,而 pathtochk則是myisamchk所在的位置,DATA_DIR是你的MySQL資料庫存放的位置。
1,簡單的修複模式
myisamchk -r -q path/資料庫/壞表.MYI
注:-r ----復原模式 -q ----快速修複
2,使用安全修複模式
myisamchk --safe-recover path/資料庫/壞表.MYI
3,困難的修複模式
如果在索引檔案的第一個16K塊被破壞,或包含不正確的資訊,或如果索引檔案丟失,你只應該到這個階段 。在這種情況下,建立一個新的索引檔案是必要的。按如下這樣做:
把資料檔案移更安全的地方。
使用表描述檔案建立新的(空)資料和索引檔案:
shell> mysql db_name
mysql> Delete FROM tbl_name;
mysql> quit
將老的資料檔案拷貝到新建立的資料檔案之中。(不要只是將老檔案移回新檔案之中;你要保留一個副本以防某些東西出錯。)
回到階段2。現在myisamchk -r -q應該工作了。(這不應該是一個無限迴圈)。
4,非常困難的修複模式
只有描述檔案也破壞了,你才應該到達這個階段。這應該從未發生過,因為在表被建立以後,描述檔案就不再改變了。
從一個備份恢複描述檔案並且回到階段3。你也可以恢複索引檔案並且回到階段2。對後者,你應該用myisamchk -r啟動。
如果你沒有一個備份但是確切地知道表是怎樣被建立的,在另一個資料庫中建立表的一個拷貝。刪除新的資料檔案,然後從其他資料庫將描述和索引檔案移到破壞的資料庫中。這給了你新的描述和索引檔案,但是讓資料檔案獨自留下來了。回到階段2並且嘗試重建索引檔案。
5,最佳化表結構
myisamchk -r 表
也可以使用sql語句來最佳化OPTIMIZE TABLE