天天看點

mysql修複壞表的方法

有的時候因為掉電或者其他原因導緻資料庫損壞,我們可以使用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

本文轉自holy2009 51CTO部落格,原文連結:http://blog.51cto.com/holy2010/376116