原文自:http://blog.csdn.net/wyzxg/article/details/7303486mysql
論述詳細,不由自主sql
複製粘貼,以防刪除shell
myisamchk命令使用總結數據庫
myisamchk實用程序能夠用來得到有關你的數據庫表的統計信息或檢查、修復、優化他們安全
1.經常使用於myisamchk的檢查選項
--information, -i
打印所檢查表的統計信息。服務器
--fast,-F
只檢查沒有正確關閉的表。性能
--force, -f
若是myisamchk發現表內有任何錯誤,則自動進行修復。維護類型與-r選項指定的相同。優化
--medium-check, -m
比--extend-check更快速地進行檢查。只能發現99.99%的錯誤,在大多數狀況下就足夠了。ui
長用命令以下:
快速的檢查
[root@localhost ~]# myisamchk -im /var/lib/MySQL/backup/t1.net
只檢查沒有正常關閉的表
[root@localhost ~]# myisamchk -iFm /var/lib/mysql/backup/*
僅顯示錶的最重要的信息
[root@localhost backup]# myisamchk -eis /var/lib/mysql/backup/t1
2.長用於myisamchk的修復選項
--backup, -B
將.MYD文件備份爲file_name-time.BAK
--correct-checksum
糾正表的校驗和信息。
--force, -f
覆蓋舊的中間文件(文件名相似tbl_name.TMD),而不是中斷。
--quick,-q
不修改數據文件,快速進行修復。出現複製鍵時,你能夠兩次指定該項以強制myisamchk修改原數據文件。
--recover, -r
能夠修復幾乎全部一切問題,除非惟一的鍵不惟一時(對於MyISAM表,這是很是不可能的狀況)。若是你想要恢復表,這是首先要嘗試的選項。若是myisamchk報告表不能用-r恢復,則只能嘗試-o。若是你有大量內存,你應增長sort_buffer_size的值。
--safe-recover, -o
使用一個老的恢復方法讀取,按順序讀取全部行,並根據找到的行更新全部索引樹。這比-r慢些,可是能處理-r不能處理的狀況。該恢復方法使用的硬盤空間比-r少。通常狀況,你應首先用-r維修,若是-r失敗則用-o。若是你有大量內存,你應增長sort_buffer_size的值。
--tmpdir=path, -t path
用於保存臨時文件的目錄的路徑。若是未設置,myisamchk使用TMPDIR環境變量的值。tmpdir能夠設置爲一系列目錄路徑,用於成功地以round-robin模式建立臨時文件。在Unix中,目錄名之間的間隔字符爲冒號(‘:’),在Windows、NetWare和OS/2中爲分號 (‘;’)。
--unpack,-u
將用myisampack打包的表解包。
經常使用恢復命令:
首先嚐試用這種恢復方式
[root@localhost ~]# myisamchk -iBfqr /var/lib/mysql/backup/t1
若是上面的恢復失敗,再嘗試用以下的方式,這個比較慢
[root@localhost ~]# myisamchk -iBfqo /var/lib/mysql/backup/t1
3.長用於myisamchk的分析選項
--analyze,-a
分析鍵值的分佈。這經過讓聯結優化器更好地選擇表應該以什麼次序聯結和應該使用哪一個鍵來改進聯結性能。要想獲取分佈相關信息,使用以下兩個命令
mysql> show keys from t1;
或
[root@localhost ~]# myisamchk --description --verbose /var/lib/mysql/backup/t1
--description, -d
打印出關於表的描述性信息
--sort-index, -S
以從高到低的順序排序索引樹塊。這將優化搜尋而且將使按鍵值的表掃描更快。
--sort-records=N, -R N
根據一個具體索引排序記錄。這使你的數據更局部化而且能夠加快在該鍵上的SELECT和ORDER BY的範圍搜索。(第一次作排序可能很慢!)爲了找出一張表的索引編號,使用SHOW INDEX,它以myisamchk看見他們的相同順序,顯示一張表的索引。索引從1開始編號。
若是鍵沒有打包(PACK_KEYS=0),它們的長度相同,所以當myisamchk 排序並移動記錄時,只覆蓋索引中的記錄偏移量。若是
鍵已經打包(PACK_KEYS=1),myisamchk必須先解開打包的鍵塊,而後從新建立索引並再次將鍵塊打包。(在這種狀況下,從新建立索引比更新每一個索引的偏移量要快)。
4.myisamchk內存使用
myisamchk默認只用3M的內存來修復,若是要修復大表的話,顯然速度會巨慢,咱們能夠經過爲myisamchk設置更多的內存,來使其運行的更快,
[root@localhost ~]# myisamchk --sort_buffer_size=16M --key_buffer_size=16M --read_buffer_size=1M --write_buffer_size=1M
通常sort_buffer_size的大小16m就足夠用了。
myisamchk默認使用選項「--tmpdir」做爲臨時文件的,若是tmpdir指定內存的話,恢復的表比較大,很容易報內存的錯誤,因此咱們能夠用tmpdir指定一個比較大的文件系統
[root@localhost ~]# myisamchk --sort_buffer_size=16m --key_buffer_size=16m --read_buffer_size=2m --write_buffer_size=1m --tmpdir=/tmp -iBfqr /var/lib/mysql/backup/t1
5.myisamchk用於崩潰恢復
在使用myisamdchk修復會優化表時,必須保證mysqld服務器沒有使用該表,最好關閉mysqld服務;若是不關閉mysqld,在運行myisamchk以前應執行mysqladmin flash-tables。若是服務器和myisamchk同時訪問表,表可能會被破壞。
使用「--skip-external-locking」通常是系統的默認啓用選項,mysql數據庫通常也是應禁用該選項,由於使用系統的lock和mysql很容易產生死鎖。
執行myisam表的恢復只要是修復表的三個文件,最常發生問題的文件是數據文件和索引文件
tbl_name.frm:定義(格式)文件
tbl_name.MYD:數據文件
tbl_name.MYI:索引文件
恢復步驟
A.檢查myisam表的錯誤
# myisamchk -im --verbose /var/lib/mysql/backup/t1
若是有錯誤,用perror命令查看錯誤碼
[root@localhost ~]# perror 126
OS error code 126: Required key not available
B.初級修復myisam表
試圖不接觸數據文件來修復索引文件,
# myisamchk -rq tablename
若是恢復失敗,繼續以下
#[root@localhost ~]# myisamchk -Br tablename
還不行就執行以下
#[root@localhost ~]# myisamchk -o tablename
C.中級修復myisam表
只有在索引文件的第一個16K塊被破壞,或包含不正確的信息,或若是索引文件丟失,你才應該到這個階段
1).把數據文件移到安全的地方。
2).使用表描述文件建立新的(空)數據文件和索引文件:
3).shell> mysql db_name
4).mysql> SET AUTOCOMMIT=1;
5).mysql> TRUNCATE TABLE tbl_name;
6).mysql> quit
若是沒有TRUNCATE TABLE,則使用DELETE FROM tbl_name。
7).將老的數據文件拷貝到新建立的數據文件之中。 (記得保留一個副本以防某些東西出錯)
8).在實行myisamchk -rq tablename應該就能夠了
或
mysql> REPAIR TABLE tbl_name USE_FRM
D.高級恢復
1).從一個備份恢復描述文件而後執行「myisamchk -r tablename」
2).若是沒有備份而知道表是怎樣建立的,在另外一個數據庫中建立表的一個拷貝。刪除新的數據文件,而後從其餘數據庫將描述文件和索引文件移到破壞的數據庫中。這樣在破壞的庫裏就有新的描述和索引文件,可是讓.MYD數據文件獨自留下來了。而後在執行「myisamchk -r tablename」
6.myisamchk對錶優化
爲了組合碎片記錄而且消除因爲刪除或更新記錄而浪費的空間
shell> myisamchk -r tbl_name
對全部的索引進行排序以便更快地查找鍵值
myisamch -S tablename
對指定的索引進行排序以便更快地查找鍵值
mysql> show index from tablename;
# myisamch -R 1 tablename
若是你用動態大小的行更改MyISAM表(含VARCHAR、BLOB或TEXT列的表)或有刪除了許多行的表,你可能想要不時地(每個月一次)整理/組合表的空間
能夠對有問題的表執行OPTIMIZE TABLE來優化。或者是,若是能夠停一會mysqld服務器,執行以下命令:# myisamchk -r -s --sort-index -O sort_buffer_size=16M */*.MYI