MySql5.0 Table錯誤:is marked as crashed and last (automatic?) repair failed
myisamchk -f -o ../data/database1/cms_session.MYI
最後我解決的(de)方法是
- myisamchk -f -o ../data/database1/cms_session.MYI
以下是 網友的BLOG詳細資料!
我的網站出問題了,訪問一看,果然全屏報錯,檢查mysql日(rì)誌,錯誤信息為:
- Table ‘.\dedecmsv4\dede_archives’ is marked as crashed and should be repaired
提示說cms的(de)文章表dede_archives被標記有問題,需要修複。於是趕快恢複曆史數據,上網查找原因(yīn)。最終將問題解決。解決方法(fǎ)如下:
找到mysql的安裝目(mù)錄的bin/myisamchk工具,在命令行中(zhōng)輸入:
- myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
然後myisamchk 工具(jù)會幫助你(nǐ)恢複數據表的索引。重新啟動mysql,問題解決。
問題分析:
1、錯(cuò)誤(wù)產生原因,有網友說是頻繁查詢和更新dede_archives表造成的索引錯誤,因為我的頁麵沒有靜態生成,而是動態(tài)頁麵,因此比較同(tóng)意這種(zhǒng)說法。還有說法為是MYSQL數據庫因為某種原因而受到(dào)了損壞,如:數據庫服務器突發(fā)性的斷(duàn)電、在提在數據(jù)庫表提供(gòng)服務時對表(biǎo)的原文件進行某種操作都有可能導致MYSQL數據庫(kù)表被損壞(huài)而無法讀取數據。總之就是因為某些不可測的問(wèn)題造成表的損壞。
問(wèn)題的編號為(wéi)145
2、問題解決(jué)辦法。
當你試圖修複一(yī)個被(bèi)破壞的表的問題時,有三種修複類型。如果你得到(dào)一個錯誤信息指(zhǐ)出一個臨時文件不能建立,刪除信息(xī)所(suǒ)指出的(de)文件並再試一次–這通常是上一次修複操作遺留下來的。 這三(sān)種修複方法如下所示:
- % myisamchk –recover –quick /path/to/tblName
- % myisamchk –recover /path/to/tblName
- % myisamchk –safe-recover /path/to/tblName
第一種是最快的,用來修複(fù)最普通的問(wèn)題;而最後一種(zhǒng)是最慢的,用(yòng)來修複一(yī)些其它方法所不能修複的問題。
檢查和修複MySQL數據文件 如果上麵的方法無法修複一個被損壞的表,在你放(fàng)棄之前,你還(hái)可以試試下麵這兩個技巧: 如果(guǒ)你懷(huái)疑表的索引文(wén)件(jiàn)(*.MYI)發生了不可修複的錯誤,甚至是丟失了這個文(wén)件,你可以使用數(shù)據文(wén)件(*.MYD)和(hé)數據格式文件(*.frm)重新生成它。首先製作一個數據文件(tblName.MYD)的拷(kǎo)貝。重啟你的MySQL服務並連(lián)接到這個服務上,使用下麵的命令刪除表的內容: mysql> DELETE FROM tblName; 在刪除表的內容的同時,會建立一個(gè)新的索引文件。退出登錄並重新關閉(bì)服務,然後用你剛才保存的數據文件(tblName.MYD)覆蓋新的(空)數據文件。最後,使用myisamchk執行標準的修複(上麵的第(dì)二種方法),根據表的(de)數據的內容和表的格式文(wén)件重新生成索引數據。
如果你的表的格式文件(tblName.frm)丟失了(le)或者是發生了不可修複的錯誤,但是你(nǐ)清楚如何使用相應的CREATE TABLE語句來重新生(shēng)成這張表,你可以重新生成一個新的.frm文件並和你的數據文件和索引文件(如果索引文件有問題,使用上麵的方法重建一個新的)一起使(shǐ)用。首先製作一個數據和索引文件的拷貝,然後刪除原來的文件(刪除(chú)數據目錄(lù)下有關這個表的所有記錄)。
啟動MySQL服務(wù)並使(shǐ)用當初的CREATE TABLE文件建立一個新(xīn)的表。新的.frm文(wén)件應該可以正(zhèng)常工作了,但是最好你(nǐ)還是執行一下標準的修複(上麵的第二種方法)。 3、myisamchk工具介(jiè)紹(見mysql的官(guān)方手冊)
可以使用myisamchk實用程序來獲得有關數據庫表的信息(xī)或檢查、修複(fù)、優化他們。myisamchk適用MyISAM表(對應.MYI和.MYD文件(jiàn)的表)。
調用myisamchk的方(fāng)法:
shell> myisamchk [options] tbl_name … options指定你想讓(ràng)myisamchk做什麽。在後麵描述它(tā)們。還可以通過調(diào)用myisamchk –help得到(dào)選項列表。
tbl_name是你想要檢查或修複的數(shù)據庫表。如果你不在(zài)數(shù)據庫(kù)目錄的某處運行(háng)myisamchk,你(nǐ)必須指定數據庫目錄的路(lù)徑,因為myisamchk不知道你的數據庫(kù)位於哪兒。實際上,myisamchk不在(zài)乎你正在操作的(de)文件(jiàn)是否位於一個(gè)數據庫目錄;你可以將(jiāng)對應於數(shù)據庫(kù)表的文件拷貝到別處並且在那裏(lǐ)執行恢複操作。
如果你願意,可以用myisamchk命令行命名幾個表。還可以通過(guò)命(mìng)名(míng)索引文件(jiàn)(用(yòng)“ .MYI”後綴)來指定一個表。它允許你通(tōng)過使用模式“*.MYI”指定在一個目錄所有的表。例如,如果你在數據庫目(mù)錄,可以這(zhè)樣在目錄下檢查(chá)所有的MyISAM表:
shell> myisamchk *.MYI 如果你不在(zài)數據庫目錄下,可通過指定到目(mù)錄的路徑檢查所有在那裏的表:
shell> myisamchk /path/to/database_dir/*.MYI 你甚至可以通(tōng)過為MySQL數據目錄(lù)的路徑指定一個通(tōng)配符來檢查所有的數據庫中的所有(yǒu)表:
shell> myisamchk /path/to/datadir/*/*.MYI 推薦的快速檢查所有MyISAM表的(de)方式是:
- shell> myisamchk –silent –fast /path/to/datadir/*/*.MYI
如(rú)果你想要檢(jiǎn)查所有MyISAM表並(bìng)修複任何破壞的表,可以使用下麵(miàn)的(de)命令:
- 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
該命(mìng)令假定你有大於(yú)64MB的自由內存。關(guān)於用myisamchk分配內存的詳細信息,參見5.9.5.5節,“myisamchk內存(cún)使用”。
當你運行(háng)myisamchk時,必須確保其它程序(xù)不使用表。否(fǒu)則,當你運行myisamchk時,會顯示下麵的錯誤消息:
- warning: clients are using or haven’t closed the table properly
這說明你正嚐試(shì)檢查正被另一(yī)個還沒(méi)有關閉文件(jiàn)或已經終止而沒有正確地關閉(bì)文件的程序(例如mysqld服務(wù)器)更新的表。
如果mysqld正在運(yùn)行,你必須通過(guò)FLUSH TABLES強製(zhì)清空仍然在內存中(zhōng)的(de)任何表修改。當你運行myisamchk時,必須確保其它(tā)程序不使(shǐ)用表。避免該問題的最容易的方(fāng)法(fǎ)是使用CHECK TABLE而不用myisamchk來檢查表。
關鍵詞:MySql
閱讀本文後您有什麽感想? 已有 人給(gěi)出評價!
- 1
- 2
- 1
- 1
- 1
- 1