-e, --extend-check
非常徹底地檢查表。這僅在極端情況下是必要的。通常,myisamchk應該找出所有錯誤,即使沒有改選項。
-f, --force
覆蓋老的臨時文件。如果你在檢查表時使用-f (運行myisamchk沒有-r),myisamchk在檢查期間將自動為出現一個錯誤的表用-r重啟。
--help
顯示一條幫助消息並且退出。
-i, --information
打印有關被檢查的表的信息統計。
-k #, --keys-used=#
與-r一起使用。告訴ISAM表處理器僅更新頭#個索引。較高編號的索引被撤銷。這能用來使插入變得更快!撤銷的索引能通過使用myisamchk -r被重新激活。
-l, --no-symlinks
在修復時,不跟隨符號連接。通常myisamchk修復一個符號連接所指的表。
-q, --quick
與-r一起使用使得一個修復更快。通常,原來的數據文件沒被接觸;你能指定第二個-q強制使用原來的數據文件。
-r, --recover
恢復模式。可以修復幾乎所有一切,除非唯一的鍵不是唯一。
-o, --safe-recover
恢復模式。使用一個老的恢復方法;這比-r慢些,但是能處理一-r不能處理的情況。
-O var=option, --set-variable var=option
設置一個變量的值。可能的變量列在下面。
-s, --silent
沉默模式。當錯誤發生時,僅寫輸出。你能使用-s兩次(-ss)非常沉默地做myisamchk。
-S, --sort-index
以從高到低的順序排序索引樹塊。這將優化搜尋並且將使按鍵值的表掃描更快。
-R index_num, --sort-records=index_num
根據一個索引排序記錄。這使你的數據更局部化並且可以加快在該鍵上的SELECT和ORDER BY的范圍搜索。(第一次做排序可能很慢!) 為了找出一張表的索引編號,使用SHOW INDEX,它以myisamchk看見他們的相同順序顯示一張表的索引。索引從1開始編號。
-u, --unpack
解開一個用myisampack壓縮的表。
-v, --verbose
冗長模式。打印更多的信息。這能與-d和-e一起使用。為了更冗長,使用-v多次(-vv, -vvv)!
-V, --version
打印myisamchk版本並退出。
-w, --wait
如果表被鎖定,等待。
對--set-variable(-O)選項,可能的變量是:
key_buffer_size 當前值: 16776192
read_buffer_size 當前值: 262136
write_buffer_size 當前值: 262136
sort_buffer_size 當前值: 2097144
sort_key_blocks 當前值: 16
decode_bits 當前值: 9
13.1.2 myisamchk內存使用
當你運行myisamchk時,內存分配很重要。myisamchk使用不超過
如果它發生,設定TMPDIR指向有更多空間的某個目錄並且重啟myisamchk。
13.2 建立一個數據庫表維護規范
在一個定期基礎而非等到問題出現才實施數據庫表的檢查是一個好主意。為維護目的,你能使用myisamchk -s檢查桌子。-s選項使myisamchk以沉默模式運行,當錯誤出現時,僅僅打印消息。
在服務器啟動時檢查表是一個好主意。例如,無論何時機器在更新當中重新啟動了,你通常需要檢查所有可能被影響了的表。(這是一個“期望破壞了的表”) 如果重啟後有一個舊的“.pid”(進程ID),你能為safe_mysqld加入一個測試,運行myisamchk檢查所有在過去24小時修改過的表)。(“.pid”文件在mysqld啟動時由它創建,並它正常終止時刪除。在系統啟動時存在一個“.pid”文件表明MySQLd異常地終止了。)
一個更好的測試將是檢查任何表,它的最後修改時間是比“.pid”文件更新。
你也應該定期在正常系統操作期間檢查表。在TcX,我們運行一個cron任務,每周一次檢查我們所有重要的表,在一個“crontab”文件中使用這樣的行:
35 0 * * 0 /path/to/myisamchk -s /path/to/datadir/*/*.MYI
這打印出損壞的表的信息,因此我們能檢驗並且在需要時修復他們。
當我們現在幾年(這確實是真的)都沒有任何意外損壞的表時(由於除硬件故障外的其他原因造成損壞的表),每周一次對我們是足夠了。
我們建議現在開始,你對所有最後24小時內被更新了表每晚都執行myisamchk -s,直到你變得象我們那樣信任MySQL。
13.3 獲得關於一個表的信息
為了獲得關於一個表的描述或統計,使用顯示在下面的命令。我們以後更詳細地解釋某些信息。
myisamchk -d tbl_name
以“描述模式”運行myisamchk,生成你的表的描述。如果你用--skip-locking選項啟動MySQL服務器,myisamchk可以當它運行時報告被一個更新的表的錯誤。然而,既然在描述模式中myisamchk不改變表,沒有破壞數據的任何風險。
myisamchk -d -v tbl_name
為了生成更多關於myisamchk正在做什麼的信息,加上-v告訴它以冗長模式運行。
myisamchk -eis tbl_name
僅顯示一個表最重要的信息。因為必須讀取整個表,它很慢。
myisamchk -eiv tbl_name
這類似-eis,只是告訴你正在做什麼。
myisamchk -d輸出的例子:
MyISAM file: company.MYI
Record format: Fixed length
Data records: 1403698 Deleted blocks: 0
Recordlength: 226
table description:
Key Start Len Index Type
1 2 8 unique double
2 15 10 multip. text packed stripped
3 219 8 multip. double
4 63 10 multip. text packed stripped
5 167 2 multip. unsigned short
6 177 4 multip. unsigned long
7 155 4 multip. text
8 138 4 multip. unsigned long
9 177 4 multip. unsigned long
193 1 text
myisamchk -d -v輸出的例子:
MyISAM file: company
您正在看的MySQL教程是:MySQL數據庫學習手冊之維護MySQL安裝。s輸出的例子:
Checking MyISAM file: company
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4
Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4
Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3
Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3
Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4
Total: Keyblocks used: 98% Packed: 17%
Records: 1403698 M.recordlength: 226 Packed: 0%
Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00
Record blocks: 1403698 Delete blocks: 0
Recorddata: 317235748 Deleted data: 0
Lost space: 0 Linkdata: 0
User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966
myisamchk -eiv輸出的例子:
Checking MyISAM file: company
Data records: 1403698 Deleted blocks: 0
- check file-size
- check delete-chain
block_size 1024:
index 1:
index 2:
index 3:
index 4:
index 5:
index 6:
index 7:
index 8:
index 9:
No recordlinks
- check index reference
- check data record references index: 1
Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4
- check data record references index: 2
Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4
- check data record references index: 3
Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4
- check data record references index: 4
Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3
- check data record references index: 5
Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 6
Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3
- check data record references index: 7
其他可能的值是Compressed和Packed.
table description
在表中所有鍵值的一張表。對每個鍵,給出一些底層的信息:
Key
該鍵的編號。
Start
該索引部分從記錄的哪裡開始。
Len
該索引部分是多長。對於緊湊的數字,這應該總是列的全長。對字符串,它可以比索引的列的全長短些,因為你能索引字符串列的前綴。
Index
unique或multip(multiple)。表明一個值是否能在該索引中存在多次。
Type
這索引部分有什麼數據類型。這是一個packed、stripped或empty選項的 ISAM 數據類型。
Root
根索引塊的地址。
Blocksize
每個索引塊的大小。缺省是1024,但是值可以在編譯時改變。
Rec/key
這是由優化器使用的統計值。它告訴對該鍵的每個值有多少條記錄。唯一鍵總是有一個1值。在一個表被裝載後(或改變很大),這可以用myisamchk -a更新。如果這根本沒被更新,給定一個30的缺省值。
在上面第一個例子中,第個9鍵是有2個部分的多部鍵。
Keyblocks used
鍵塊使用的百分比是什麼。因為在例子中使用的表只能用myisamchk被重新組織,值非常高(很接近理論上的最大值)。
Packed
MySQL試圖用一個公共後綴壓縮鍵。這只能被用於CHAR/VARCHAR/DECIMAL鍵。對長字符串如姓名,這能顯著地減少使用空間。在上面的第3個例子中,第4個鍵是10個字符長並且在空間上達到60%的縮減。
Max levels
對於該鍵的B樹有多深。有長鍵的大表有較高的值。
Records
表中有多少行。
M.recordlength
平均記錄長度。對於有定長記錄的表,這是准確的記錄長度。
Packed
MySQL從字符串的結尾去掉空格。Packed值表明這樣做達到的節約的百分比。
Recordspace used
數據文件被使用的百分比。
Empty space
數據文件未被使用的百分比。
Blocks/Record
每個記錄的平均塊數 (即,一個碎片記錄由多少個連接組成)。對固定格式表,這總是1。該值應該盡可能保持接近1.0。如果它變得太大,你可用myisamchk重新組織表。見13.4.3 表優化。
Recordblocks
多少塊(連接)被使用。對固定格式,它與記錄的個數相同。
Deleteblocks
多少塊(連接)被刪除。
Recorddata
在數據文件中使用了多少字節。
Deleted data
在數據文件中多少字節被刪除(未使用)。
Lost space
如果一個記錄被改為更短的長度,就損失了一些空間。這是所有這樣的損失之和,以字節計。
Linkdata
當使用動態表格式,記錄碎片用指針連接(每個4 ~ 7字節)。 Linkdata被這樣的指針使用的內存量之和。
如果一張表已經用myisampack壓縮了,myisamchk -d打印每個表列的附加信息。對於它的一個例子及其含義的描述,見12.5 MySQL壓縮只讀表生成器。
13.4 使用myisamchk進行崩潰恢復
由MySQL用來存儲數據的文件格式以已經被廣泛地測試過,但是總是有外部情況可以導致數據庫表被破壞:
* MySQLd進程在一個寫入當中被殺死。
* 計算機的意外關閉(例如,如果計算機掉電)。
* 一個硬件錯誤
這章描述如何檢查和處理在MySQL數據庫中的數據損壞。
您正在看的MySQL教程是:MySQL數據庫學習手冊之維護MySQL安裝。1 怎樣檢查表的錯誤
為了檢查一張表,使用下列命令:
myisamchk tbl_name
這能找出所有錯誤的99.99%。它不能找出的是僅僅涉及數據文件的損壞(這很不常見)。如果你想要檢查一張表,你通常應該沒有選項地運行myisamchk或用-s或--silent選項的任何一個。
myisamchk -e tbl_name
它做一個完全徹底的數據檢查(-e意思是“擴展檢查”)。它對每一行做每個鍵的讀檢查以證實他們確實指向正確的行。這在一個有很多鍵的大表上可能花很長時間。myisamchk通常將在它發現第一個錯誤以後停止。如果你想要獲得更多的信息,你能增加--verbose(-v)選項。這使得myisamchk繼續一直到最多20個錯誤。在一般使用中,一個簡單的myisamchk(沒有除表名以外的參數)就足夠了。
myisamchk -e -i tbl_name
象前面的命令一樣,但是-i選項告訴myisamchk還打印出一些統計信息。
13.4.2 怎樣修復表
一張損壞的表的症狀通常是查詢意外中斷並且你能看到例如這些錯誤:
* “tbl_name.frm”被鎖定不能改變。
* 不能找到文件“tbl_name.MYI”(Errcode :### )。
* 從表處理器的得到錯誤###(此時,錯誤135是一個例外)。
* 意外的文件結束。
* 記錄文件被毀壞。
在這些情況下,你必須修復表。myisamchk通常能檢測並且修復出錯的大部分東西。
修復過程包含最多4個階段,在下面描述。在你開始前,你應該cd到數據庫目錄和檢查表文件的權限,確保他們可被運行MySQLd的Unix用戶讀取(和你,因為你需要存取你正在檢查的文件)。如果它拒絕你修改文件,他們也必須是可被你寫入的。
階段1:檢查你的表
運行myisamchk *.MYI或(myisamchk -e *.MYI,如果你有更多的時間)。使用-s(沉默)選項禁止不必要的信息。
你必須只修復那些myisamchk報告有一個錯誤的表。對這樣的表,繼續到階段2。
如果在檢查時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。
舞台 2 :簡單安全的修復
首先,試試myisamchk -r -q tbl_name(-r -q意味著“快速恢復模式”)。這將試圖不接觸數據文件來修復索引文件。如果數據文件包含它應有的一切和在數據文件指向正確地點的刪除連接,這應該管用並且表可被修復。開始修理下一張表。否則,使用下列過程:
1. 在繼續前做數據文件的一個備份。
如果你使用一般的日志,你可以這樣做: