用的修複命令是:myisamchk -r bbsthreads
其中bbsthreads是我出問題的表名,當然使用這個命令還得進入mysql你所出問題的資料庫的表的存放路徑,具體更詳細的命令可以看協助:myisamchk --help;
如果用以上命令你不能解決問題請看後面,後面的內容是我轉載的。
我的網站出問題了,訪問一看,果然全屏報錯,檢查mysql日誌,錯誤資訊為:
Table '.\dedecmsv4\dede_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,問題解決。
問題分析:
1、錯誤產生原因,有網友說是頻繁查詢和更新dede_archives表造成的索引錯誤,因為我的頁面沒有靜態產生,而是動態網頁面,因此比較同意這種說法。還有說法為是MYSQL資料庫因為某種原因而受到了損壞,如:資料庫伺服器突發性的斷電、在提在資料庫表提供服務時對錶的原檔案進行某種操作都有可能導致MYSQL資料庫表被損壞而無法讀取資料。總之就是因為某些不可測的問題造成表的損壞。
問題的編號為145
2、問題解決辦法。
當你試圖修複一個被破壞的表的問題時,有三種修複類型。如果你得到一個錯誤資訊指出一個臨時檔案不能建立,刪除資訊所指出的檔案並再試一次--這通常是上一次修複操作遺留下來的。
這三種修複方法如下所示:
% myisamchk --recover --quick /path/to/tblName
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /path/to/tblName
第一種是最快的,用來修複最普通的問題;而最後一種是最慢的,用來修複一些其它方法所不能修複的問題。
檢查和修複MySQL資料檔案
如果上面的方法無法修複一個被損壞的表,在你放棄之前,你還可以試試下面這兩個技巧:
如果你懷疑表的索引檔案(*.MYI)發生了不可修複的錯誤,甚至是丟失了這個檔案,你可以使用資料檔案(*.MYD)和資料格式檔案(*.frm)重建它。首先製作一個資料檔案(tblName.MYD)的拷貝。重啟你的MySQL服務並串連到這個服務上,使用下面的命令刪除表的內容:
mysql> DELETE FROM tblName;
在刪除表的內容的同時,會建立一個新的索引檔案。退出登入並重新關閉服務,然後用你剛才儲存的資料檔案(tblName.MYD)覆蓋新的(空)資料檔案。最後,使用myisamchk執行標準的修複(上面的第二種方法),根據表的資料的內容和表的格式檔案重建索引資料。
如果你的表的格式檔案(tblName.frm)丟失了或者是發生了不可修複的錯誤,但是你清楚如何使用相應的CREATE TABLE語句來重建這張表,你可以重建一個新的.frm檔案並和你的資料檔案和索引檔案(如果索引檔案有問題,使用上面的方法重建一個新的)一起使用。首先製作一個資料和索引檔案的拷貝,然後刪除原來的檔案(刪除資料目錄下有關這個表的所有記錄)。
啟動MySQL服務並使用當初的CREATE TABLE檔案建立一個新的表。新的.frm檔案應該可以正常工作了,但是最好你還是執行一下標準的修複(上面的第二種方法)。
3、myisamchk工具介紹(見mysql的官方手冊)
可以使用myisamchk公用程式來獲得有關資料庫表的資訊或檢查、修複、最佳化他們。myisamchk適用MyISAM表(對應.MYI和.MYD檔案的表)。
調用myisamchk的方法:
shell> myisamchk [options] tbl_name ...
options指定你想讓myisamchk做什麼。在後面描述它們。還可以通過調用myisamchk --help得到選項列表。
tbl_name是你想要檢查或修複的資料庫表。如果你不在資料庫目錄的某處運行myisamchk,你必須指定資料庫目錄的路徑,因為myisamchk不知道你的資料庫位於哪兒。實際上,myisamchk不在乎你正在操作的檔案是否位於一個資料庫目錄;你可以將對應於資料庫表的檔案拷貝到別處並且在那裡執行恢複操作。
如果你願意,可以用myisamchk命令列命名幾個表。還可以通過命名索引檔案(用“ .MYI”尾碼)來指定一個表。它允許你通過使用模式“*.MYI”指定在一個目錄所有的表。例如,如果你在資料庫目錄,可以這樣在目錄下檢查所有的MyISAM表:
shell> myisamchk *.MYI
如果你不在資料庫目錄下,可通過指定到目錄的路徑檢查所有在那裡的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至可以通過為MySQL資料目錄的路徑指定一個萬用字元來檢查所有的資料庫中的所有表:
shell> myisamchk /path/to/datadir/*/*.MYI
推薦的快速檢查所有MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
如果你想要檢查所有MyISAM表並修複任何破壞的表,可以使用下面的命令:
shell> myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
該命令假定你有大於64MB的自由記憶體。關於用myisamchk分配記憶體的詳細資料,參見5.9.5.5節,“myisamchk記憶體使用量”。
當你運行myisamchk時,必須確保其它程式不使用表。否則,當你運行myisamchk時,會顯示下面的錯誤訊息:
warning: clients are using or haven't closed the table properly
這說明你正嘗試檢查正被另一個還沒有關閉檔案或已經終止而沒有正確地關閉檔案的程式(例如mysqld伺服器)更新的表。
如果mysqld正在運行,你必須通過FLUSH TABLES強制清空仍然在記憶體中的任何錶修改。當你運行myisamchk時,必須確保其它程式不使用表。避免該問題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表。