也可能其中任意方法都可以適用於本數據庫。我暫時沒有條件測試,有條件的去測試一下,有望解決數據庫報此錯誤的問題。
預防措施:
1、一定要備份一次數據庫,起碼保留了表結構,有些可有可無的數據,可以直接覆蓋。
2、重要的數據要經常注意備份,一般一個月左右備份一次。
3、出現此類錯誤,一般能夠解決,經jb51.net測試下面的方法是比較可行的。但偶爾會有數據丟失的情況,強烈建議先備份。
復制代碼 代碼如下:
解決辦法:首先需要定位到你的mysql的bin目錄,裡面包含myisamchk.exe文件的目錄
./myisamchk -c -r 數據庫表MYI文件的路徑(例如:/home/mysql/var/crawlerfeedsky/aaaa.MYI)
如果還不行,就-f 強制修復
windows服務器下mysql的修復方法:
F:\sqldata\mysql\bin>cd .. 返回上級目錄
F:\sqldata\mysql>cd data 進入數據庫所在目錄(mysql的數據庫文件都是放在data這個目錄裡面的)
F:\sqldata\mysql\data>cd jb51 進入數據庫,windows服務器中數據庫就是一個文件夾(這裡以jb51為例子)
F:\sqldata\mysql\data\jb51>myisamchk -r jb51_soft
- recovering (with sort) MyISAM-table 'jb51_soft'
Data records: 7216
- Fixing index 1
- Fixing index 2
- Fixing index 3
F:\sqldata\mysql\data\jb51>
jb51_soft為數據庫的表名,提示哪個表錯誤,就修復哪個表。
為了以後方便,我們可以寫成一個批處理,將這個文件保存為fixit.bat放到數據庫所在的目錄即可。
復制代碼 代碼如下:
myisamchk -r jb51_soft
下面是網上收集的多種方法,大家可以測試下。
(一)
昨晚浏覽自己的Blog的時候,突然發現所有頁面都無法顯示,到後台查看的時候,發現一個”Table ‘xxx' is marked as crashed and should be repaired” 的錯誤。連忙上網搜索,原來修改這個嚴重的錯誤很簡單:
1. 進入管理mysql的phpmyadmin
2. 在左則選中自己的數據庫
3. 在右則勾選中錯誤信息中的那個'xxx'表
4. 滾動屏幕到下面,有個下拉菜單(With selected:),選擇”Repair table”
修改之後,並沒有發現有什麼數據損失,連忙備份了一份數據庫到郵件裡面,備份還是很重要的!
(二)
現象:
mysql> use yourealcn
Database changed
mysql> select user,company from biz_user where commend='1' order by regtime desc,checked desc limit 0,5;
ERROR 145 (HY000): Table './yourealcn/biz_user' is marked as crashed and should be repaired
mysql> exit
使用命令myisamchk修復數據庫的MYI文件即可
# /usr/local/mysql5/bin/myisamchk -c -r /bak/lib/mysql/yourealcn/biz_user.*
myisamchk: error: '/bak/lib/mysql/yourealcn/biz_user.frm' is not a MyISAM-table
---------
myisamchk: error: '/bak/lib/mysql/yourealcn/biz_user.MYD' is not a MyISAM-table
---------
- recovering (with sort) MyISAM-table '/bak/lib/mysql/yourealcn/biz_user.MYI'
Data records: 20414
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
(三)
Caused by: java.sql.SQLException: Table '表名' is marked as crashed and should be repaired
解決辦法:
./myisamchk -c -r 數據庫表MYI文件的路徑(例如:/home/mysql/var/crawlerfeedsky/aaaa.MYI)
如果還不行,就-f 強制修復
(四)
今天上服務器一看,發現網頁錯誤,無法連接數據庫服務器。mysql服務自己down掉了,然後重新啟動服務器,發現網頁無法打開,提示: [mysql]Table tblName is marked as crashed and should be repaired
Mysql提示tblName表格已損壞,需要修復,解決方法:
進入到對應的數據庫目錄:
cd /var/lib/mysql/dbname
使用myisamchk修復:
shell> myisamchk -r tblName
(五)
我用的修復命令是: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來檢查表。