有兩種方法,一種方法使用mysql的check table和repair table 的sql語句,另一種方法是使用MySQL提供的多個myisamchk, isamchk數(shù)據(jù)檢測恢復工具。
創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元硚口做網(wǎng)站,已為上家服務(wù),為硚口各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
前者使用起來比較簡便。推薦使用。
1、check table 和 repair table 登陸mysql 終端: mysql -uxxxxx -p dbname check table tabTest;
如果出現(xiàn)的結(jié)果說Status是OK,則不用修復,如果有Error,可以用: repair table tabTest; 進行修復,修復之后可以在用check table命令來進行檢查。
在新版本的phpMyAdmin里面也可以使用check/repair的功能。
2. myisamchk, isamchk 其中myisamchk適用于MYISAM類型的數(shù)據(jù)表,而isamchk適用于ISAM類型的數(shù)據(jù)表。
這兩條命令的主要參數(shù)相同,一般新的系統(tǒng)都使用MYISAM作為缺省的數(shù)據(jù)表類型,這里以myisamchk為例子進行說明。
當發(fā)現(xiàn)某個數(shù)據(jù)表出現(xiàn)問題時可以使用: myisamchk tablename.MYI 進行檢測,如果需要修復的話,可以使用: myisamchk -of tablename.MYI 關(guān)于myisamchk的詳細參數(shù)說明,可以參見它的使用幫助。
需要注意的時在進行修改時必須確保MySQL服務(wù)器沒有訪問這個數(shù)據(jù)表,保險的情況下是最好在進行檢測時把MySQL服務(wù)器Shutdown掉。
2、另外可以把下面的命令放在你的rc.local里面啟動MySQL服務(wù)器前: [ -x /tmp/mysql.sock ] /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI 。
其中的/tmp/mysql.sock是MySQL監(jiān)聽的Sock文件位置,對于使用RPM安裝的用戶應(yīng)該是/var/lib/mysql/mysql.sock,對于使用源碼安裝則是/tmp/mysql.sock可以根據(jù)自己的實際情況進行變更,而pathtochk則是myisamchk所在的位置,DATA_DIR是你的MySQL數(shù)據(jù)庫存放的位置。
需要注意的是,如果你打算把這條命令放在你的rc.local里面,必須確認在執(zhí)行這條指令時MySQL服務(wù)器必須沒有啟動!
最后檢測修復所有數(shù)據(jù)庫(表)。
[代碼] [Shell/批處理]代碼#!/bin/bash #此腳本的主要用途是檢測mysql服務(wù)器上所有的db或者單獨db中的壞表 #變量說明 pass mysql賬戶口令 name mysql賬號名稱 data_path mysql目錄路徑 directory_list 目錄列表 file_list文件列表 db_name 數(shù)據(jù)庫名稱 repair_count單庫中待修復的表總數(shù) #變量說明 repair_count_all所有庫中待修復的表總數(shù) mysql_version mysql版本 _file_name 數(shù)據(jù)表名稱 echo -e "此腳本的主要用途是檢測mysql服務(wù)器上所有的數(shù)據(jù)庫或者單獨數(shù)據(jù)庫中的壞表\n\n" pass=123456 name=root read -p "輸入mysql存儲路徑: " choose data_path=$choose unset choose read -p "請輸入mysql命令路徑: " mysql_version #標準輸入、標準輸出、標準錯誤輸出的文件標示符 由 0、1、2標識 read -p "請選擇是檢查服務(wù)器上所有數(shù)據(jù)庫還是指定的數(shù)據(jù)庫 1:檢查全部數(shù)據(jù)庫 2:只檢查指定數(shù)據(jù)庫: " choose if [ $choose == 1 ]; then cd $data_path for directory_list in $(ls) do if [ -d $directory_list ];then if [ "mysql" != "${directory_list}" -a "test" != "${directory_list}" ];then cd ${directory_list} echo "當前檢查數(shù)據(jù)庫為:"${directory_list} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" /tmp/check_table_all.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${directory_list}.${_file_name} 21 /tmp/check_table_all.log done cd .. fi fi done cat /tmp/check_table_all.log | grep "Table is marked as crashed" /tmp/check_table_repair.log repair_count_all=` awk 'END{print NR}' /tmp/check_table_repair.log ` echo -e "所有數(shù)據(jù)庫用有${repair_count_all}張表需要修復!" more /tmp/check_table_repair.log else read -p "請輸入要檢查的數(shù)據(jù)庫名稱: " db_name cd ${data_path}/${db_name} for file_list in $(ls *.frm) do _file_name=${file_list%.frm} echo -e "\n" /tmp/check_${db_name}.log ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${db_name}.$_file_name 21 /tmp/check_${db_name}.log done cat /tmp/check_${db_name}.log | grep "Table is marked as crashed" /tmp/check_${db_name}_Repair.log repair_count=`awk 'END{print NR}' /tmp/check_${db_name}_Repair.log` echo -e "${db_name}中共有${repair_count}個表需要修復!\n " more /tmp/check_${db_name}_Repair.log fi
mysqlcheck 是 MySQL 自帶的一個工具,作用就是保養(yǎng) 表,其實就是檢查,分析,修復和優(yōu)化了。下面來介紹 mysqlcheck 工具的簡單使用,官方文檔在這里
以下的例子都是基于 MySQL 5.6 版本運行狀態(tài)下(mysqlcheck是個在線工具), 不同的存儲引擎對于這個命令的支持程度不同(指的是 check, repair, analyze, optimize),下面內(nèi)容偏于操作,主要基于 innodb 引擎。
提示:OPTIMIZE 在大表時候可能會消耗很多時間,不清楚原理情況下請謹慎使用!!! innodb 一般不用 OPTIMIZE,請參見 Using MySQL OPTIMIZE tables? For InnoDB? Stop
檢查特定的表
注意在shell中執(zhí)行,不是在mysql的交互環(huán)境下
如果應(yīng)用中提示某個表壞了,使用下面的命令來檢查。
$ mysqlcheck -c newmandela order -uroot -pEnter password:
newmandela.order
OK
newmandela 是庫名, order是表名,還需要輸入用戶名和密碼
檢查一個庫中的所有表
$ mysqlcheck -c newmandela -uroot -p
Enter password:
newmandela.account OK
newmandela.alarm OK
newmandela.alarm_settings OK
newmandela.auth_group OK
newmandela.auth_group_permissions OK
newmandela.auth_permission OK...
5.9.4. 表維護和崩潰恢復
后面幾節(jié)討論如何使用myisamchk來檢查或維護MyISAM表(對應(yīng).MYI和.MYD文件的表)。
你可以使用myisamchk實用程序來獲得有關(guān)你的數(shù)據(jù)庫表的信息或檢查、修復、優(yōu)化他們。下列小節(jié)描述如何調(diào)用myisamchk(包括它的選項的描述),如何建立表的維護計劃,以及如何使用myisamchk執(zhí)行各種功能。
盡管用myisamchk修復表很安全,在修復(或任何可以大量更改表的維護操作)之前先進行備份也是很好的習慣
影響索引的myisamchk操作會使ULLTEXT索引用full-text參數(shù)重建,不再與MySQL服務(wù)器使用的值兼容。要想避免,請閱讀5.9.5.1節(jié),“用于myisamchk的一般選項”的說明。
在許多情況下,你會發(fā)現(xiàn)使用SQL語句實現(xiàn)MyISAM表的維護比執(zhí)行myisamchk操作要容易地多:
· 要想檢查或維護MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想優(yōu)化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
可以直接這些語句,或使用mysqlcheck客戶端程序,可以提供命令行接口。
這些語句比myisamchk有利的地方是服務(wù)器可以做任何工作。使用myisamchk,你必須確保服務(wù)器在同一時間不使用表。否則,myisamchk和服務(wù)器之間會出現(xiàn)不期望的相互干涉。
5.9.5. myisamchk:MyISAM表維護實用工具
5.9.5.1. 用于myisamchk的一般選項
5.9.5.2. 用于myisamchk的檢查選項
5.9.5.3. myisamchk的修復選項
5.9.5.4. 用于myisamchk的其它選項
5.9.5.5. myisamchk內(nèi)存使用
5.9.5.6. 將myisamchk用于崩潰恢復
5.9.5.7. 如何檢查MyISAM表的錯誤
5.9.5.8. 如何修復表
5.9.5.9. 表優(yōu)化
可以使用myisamchk實用程序來獲得有關(guān)數(shù)據(jù)庫表的信息或檢查、修復、優(yōu)化他們。myisamchk適用MyISAM表(對應(yīng).MYI和.MYD文件的表)。
調(diào)用myisamchk的方法:
shell myisamchk [options] tbl_name ...
options指定你想讓myisamchk做什么。在后面描述它們。還可以通過調(diào)用myisamchk --help得到選項列表。
tbl_name是你想要檢查或修復的數(shù)據(jù)庫表。如果你不在數(shù)據(jù)庫目錄的某處運行myisamchk,你必須指定數(shù)據(jù)庫目錄的路徑,因為myisamchk不知道你的數(shù)據(jù)庫位于哪兒。實際上,myisamchk不在乎你正在操作的文件是否位于一個數(shù)據(jù)庫目錄;你可以將對應(yīng)于數(shù)據(jù)庫表的文件拷貝到別處并且在那里執(zhí)行恢復操作。
如果你愿意,可以用myisamchk命令行命名幾個表。還可以通過命名索引文件(用“ .MYI”后綴)來指定一個表。它允許你通過使用模式“*.MYI”指定在一個目錄所有的表。例如,如果你在數(shù)據(jù)庫目錄,可以這樣在目錄下檢查所有的MyISAM表:
shell myisamchk *.MYI
如果你不在數(shù)據(jù)庫目錄下,可通過指定到目錄的路徑檢查所有在那里的表:
shell myisamchk /path/to/database_dir/*.MYI
你甚至可以通過為MySQL數(shù)據(jù)目錄的路徑指定一個通配符來檢查所有的數(shù)據(jù)庫中的所有表:
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的自由內(nèi)存。關(guān)于用myisamchk分配內(nèi)存的詳細信息,參見5.9.5.5節(jié),“myisamchk內(nèi)存使用”。
當你運行myisamchk時,必須確保其它程序不使用表。否則,當你運行myisamchk時,會顯示下面的錯誤消息:
warning: clients are using or haven't closed the table properly
這說明你正嘗試檢查正被另一個還沒有關(guān)閉文件或已經(jīng)終止而沒有正確地關(guān)閉文件的程序(例如mysqld服務(wù)器)更新的表。
如果mysqld正在運行,你必須通過FLUSH TABLES強制清空仍然在內(nèi)存中的任何表修改。當你運行myisamchk時,必須確保其它程序不使用表。避免該問題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表。
5.9.5.1. 用于myisamchk的一般選項
本節(jié)描述的選項可以用于用myisamchk執(zhí)行的任何類型的表維護操作。本節(jié)后面的章節(jié)中描述的選項只適合具體操作,例如檢查或修復表。
· --help,-?
顯示幫助消息并退出。
· --debug=debug_options, -# debug_options
輸出調(diào)試記錄文件。debug_options字符串經(jīng)常是'd:t:o,filename'。
· --silent,-s
沉默模式。僅當發(fā)生錯誤時寫輸出。你能使用-s兩次(-ss)使myisamchk沉默。
· --verbose,-v
冗長模式。打印更多的信息。這能與-d和-e一起使用。為了更冗長,使用-v多次(-vv, -vvv)!
· --version, -V
顯示版本信息并退出。
· --wait, -w
如果表被鎖定,不是提示錯誤終止,而是在繼續(xù)前等待到表被解鎖。請注意如果用--skip-external-locking選項運行mysqld,只能用另一個myisamchk命令鎖定表。
還可以通過--var_name=value選項設(shè)置下面的變量:
變量
默認值
decode_bits
9
ft_max_word_len
取決于版本
ft_min_word_len
4
ft_stopword_file
內(nèi)建列表
key_buffer_size
523264
myisam_block_size
1024
read_buffer_size
262136
sort_buffer_size
2097144
sort_key_blocks
16
stats_method
nulls_unequal
write_buffer_size
262136
可以用myisamchk --help檢查myisamchk變量及其 默認值:
當用排序鍵值修復鍵值時使用sort_buffer_size,使用--recover時這是很普通的情況。
當用--extend-check檢查表或通過一行一行地將鍵值插入表中(如同普通插入)來修改鍵值時使用Key_buffer_size。在以下情況通過鍵值緩沖區(qū)進行修復:
· 使用--safe-recover。
· 當直接創(chuàng)建鍵值文件時,需要對鍵值排序的臨時文件有兩倍大。通常是當CHAR、VARCHAR、或TEXT列的鍵值較大的情況,因為排序操作在處理過程中需要保存全部鍵值。如果你有大量臨時空間,可以通過排序強制使用myisamchk來修復,可以使用--sort-recover選項。
通過鍵值緩沖區(qū)的修復占用的硬盤空間比使用排序么少,但是要慢。
如果想要快速修復,將key_buffer_size和sort_buffer_size變量設(shè)置到大約可用內(nèi)存的25%??梢詫蓚€變量設(shè)置為較大的值,因為一個時間只使用一個變量。
myisam_block_size是用于索引塊的內(nèi)存大小。
stats_method影響當給定--analyze選項時,如何為索引統(tǒng)計搜集處理NULL值。它如同myisam_stats_method系統(tǒng)變量。詳細信息參見5.3.3節(jié),“服務(wù)器系統(tǒng)變量”和7.4.7節(jié),“MyISAM索引統(tǒng)計集合”的myisam_stats_method的描述。
ft_min_word_len和ft_max_word_len表示FULLTEXT索引的最小和最大字長。ft_stopword_file為停止字文件的文件名。需要在以下環(huán)境中對其進行設(shè)置。
如果你使用myisamchk來修改表索引(例如修復或分析),使用最小和最大字長和停止字文件的 默認全文參數(shù)值(除非你另外指定)重建FULLTEXT索引。這樣會導致查詢失敗。
出現(xiàn)這些問題是因為只有服務(wù)器知道這些參數(shù)。它們沒有保存在MyISAM索引文件中。如果你修改了服務(wù)器中的最小或最大字長或停止字文件,要避免該問題,為用于mysqld的myisamchk指定相同的ft_min_word_len,ft_max_word_len和ft_stopword_file值。例如,如果你將最小字長設(shè)置為3,可以這樣使用myisamchk來修復表:
shell myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
要想確保myisamchk和服務(wù)器使用相同的全文
檢查特定的表注意在shell中執(zhí)行,不是在mysql的交互環(huán)境下如果應(yīng)用中提示某個表壞了,使用下面的命令來檢查。$ mysqlcheck -c newmandela order -uroot -pEnter password:newmandela.orderOKnewmandela 是庫名, order是表名,還需要輸入用戶名和密碼檢查一個庫中的所有表$ mysqlcheck -c newmandela -uroot -pEnter password:newmandela.account OKnewmandela.alarm OKnewmandela.alarm_settings OKnewmandela.auth_group OKnewmandela.auth_group_permissions OKnewmandela.auth_permission OK...
是壞表嗎,打開表有什么提示。
我遇到的有2種
查詢表報錯 (只能重命名表,重新創(chuàng)建表)
查詢數(shù)據(jù)mysql崩潰
為了防止數(shù)據(jù)丟失,提前設(shè)置備份 主從設(shè)置,開啟log-bin ?日志,條件可以的話使用固態(tài)硬盤+UPS ,避免異常斷電