myisamchk 公用程式會取得資料庫表格的相關資訊,或檢查、修復或最佳化它們。myisamchk 適用於 MyISAM 表格(具有 .MYD 和 .MYI 檔案來儲存資料和索引的表格)。
您也可以使用 CHECK TABLE 和 REPAIR TABLE 陳述式來檢查和修復 MyISAM 表格。請參閱 第 15.7.3.2 節,「CHECK TABLE 陳述式」和 第 15.7.3.5 節,「REPAIR TABLE 陳述式」。
不支援將 myisamchk 與分割表格一起使用。
在執行表格修復操作之前,最好先備份表格;在某些情況下,該操作可能會導致資料遺失。可能的原因包括但不限於檔案系統錯誤。
像這樣呼叫 myisamchk
myisamchk [options] tbl_name ...options 指定您想要 myisamchk 執行的動作。它們在下列章節中說明。您也可以呼叫 myisamchk --help 來取得選項清單。
如果沒有選項,myisamchk 只會檢查您的表格作為預設操作。若要取得更多資訊或告知 myisamchk 採取更正動作,請指定選項,如下列討論所述。
tbl_name 是您想要檢查或修復的資料庫表格。如果您在資料庫目錄以外的某處執行 myisamchk,則必須指定資料庫目錄的路徑,因為 myisamchk 不知道資料庫的位置。事實上,myisamchk 實際上並不在意您正在處理的檔案是否位於資料庫目錄中。您可以將對應於資料庫表格的檔案複製到其他位置,並在那裡執行復原操作。
您可以在 myisamchk 命令列上指定多個表格。您也可以透過命名其索引檔案(具有 .MYI 副檔名的檔案)來指定表格。這可讓您透過使用模式 *.MYI 來指定目錄中的所有表格。例如,如果您在資料庫目錄中,則可以像這樣檢查該目錄中的所有 MyISAM 表格
myisamchk *.MYI如果您不在資料庫目錄中,則可以透過指定目錄的路徑來檢查其中的所有表格
myisamchk /path/to/database_dir/*.MYI您甚至可以透過使用 MySQL 資料目錄的路徑指定萬用字元來檢查所有資料庫中的所有表格
myisamchk /path/to/datadir/*/*.MYI快速檢查所有 MyISAM 表格的建議方式是
myisamchk --silent --fast /path/to/datadir/*/*.MYI如果您想要檢查所有 MyISAM 表格並修復任何已損壞的表格,您可以使用下列命令
myisamchk --silent --force --fast --update-state \
--key_buffer_size=64M --myisam_sort_buffer_size=64M \
--read_buffer_size=1M --write_buffer_size=1M \
/path/to/datadir/*/*.MYI此命令假設您有 64MB 以上的可用空間。如需關於使用 myisamchk 配置記憶體的更多資訊,請參閱 第 6.6.4.6 節,「myisamchk 記憶體使用量」。
如需關於使用 myisamchk 的其他資訊,請參閱 第 9.6 節,「MyISAM 表格維護和當機復原」。
您必須確保在執行 myisamchk 時,沒有其他程式正在使用這些表格。最有效的方法是在執行 myisamchk 時關閉 MySQL 伺服器,或鎖定 myisamchk 正在使用的所有表格。
否則,當您執行 myisamchk 時,它可能會顯示下列錯誤訊息
warning: clients are using or haven't closed the table properly這表示您正在嘗試檢查一個表格,該表格已由另一個尚未關閉檔案或在未正確關閉檔案的情況下停止的程式(例如 mysqld 伺服器)更新,這有時可能導致一個或多個 MyISAM 表格損壞。
如果 mysqld 正在執行,您必須使用 FLUSH TABLES 強制它將仍在記憶體中緩衝的任何資料表修改寫入磁碟。然後,您應該確保在執行 myisamchk 時沒有人正在使用這些資料表。
然而,避免這個問題最簡單的方法是使用 CHECK TABLE 來檢查資料表,而不是使用 myisamchk。請參閱第 15.7.3.2 節,「CHECK TABLE 陳述式」。
myisamchk 支援下列選項,這些選項可以在命令列上指定,也可以在選項檔案的 [myisamchk] 群組中指定。有關 MySQL 程式使用的選項檔案的資訊,請參閱第 6.2.2.2 節,「使用選項檔案」。
表 6.17 myisamchk 選項
| 選項名稱 | 描述 |
|---|---|
| --analyze | 分析索引鍵值的分配 |
| --backup | 建立 .MYD 檔案的備份,檔名為 file_name-time.BAK |
| --block-search | 找出給定偏移量的區塊所屬的記錄 |
| --character-sets-dir | 字元集所在的目錄 |
| --check | 檢查資料表是否有錯誤 |
| --check-only-changed | 僅檢查自上次檢查以來已變更的資料表 |
| --correct-checksum | 更正資料表的檢查總和資訊 |
| --data-file-length | 資料檔案的最大長度 (當重新建立已滿的資料檔案時) |
| --debug | 寫入除錯日誌 |
| --decode_bits | Decode_bits |
| --defaults-extra-file | 除了常用的選項檔案之外,還讀取具名的選項檔案 |
| --defaults-file | 僅讀取具名的選項檔案 |
| --defaults-group-suffix | 選項群組後綴值 |
| --description | 列印有關資料表的一些描述性資訊 |
| --extend-check | 執行非常徹底的資料表檢查或修復,嘗試從資料檔案中復原每個可能的資料列 |
| --fast | 僅檢查未正確關閉的資料表 |
| --force | 如果 myisamchk 在資料表中發現任何錯誤,則自動執行修復操作 |
| --force | 覆寫舊的暫存檔案。與 -r 或 -o 選項一起使用 |
| --ft_max_word_len | FULLTEXT 索引的最大單字長度 |
| --ft_min_word_len | FULLTEXT 索引的最小單字長度 |
| --ft_stopword_file | 使用此檔案中的停用字,而不是內建清單 |
| --HELP | 顯示說明訊息並結束 |
| --help | 顯示說明訊息並結束 |
| --information | 列印有關所檢查資料表的資訊統計資料 |
| --key_buffer_size | 用於 MyISAM 資料表索引區塊的緩衝區大小 |
| --keys-used | 指示要更新哪些索引的位元值 |
| --max-record-length | 如果 myisamchk 無法配置記憶體來容納它們,則跳過大於給定長度的資料列 |
| --medium-check | 執行比 --extend-check 操作更快的檢查 |
| --myisam_block_size | 用於 MyISAM 索引頁面的區塊大小 |
| --myisam_sort_buffer_size | 當執行 REPAIR 或使用 CREATE INDEX 或 ALTER TABLE 建立索引時,對索引排序時所配置的緩衝區 |
| --no-defaults | 不讀取任何選項檔案 |
| --parallel-recover | 使用與 -r 和 -n 相同的技術,但使用不同的執行緒平行建立所有索引鍵 (beta) |
| --print-defaults | 列印預設選項 |
| --quick | 藉由不修改資料檔案來實現更快的修復 |
| --read_buffer_size | 每個執行循序掃描的執行緒都會為它掃描的每個資料表配置此大小的緩衝區 |
| --read-only | 不要將資料表標記為已檢查 |
| --recover | 執行修復,可以修復幾乎所有問題,但非唯一的唯一索引鍵除外 |
| --safe-recover | 使用舊的復原方法執行修復,該方法會依序讀取所有資料列,並根據找到的資料列更新所有索引樹狀結構 |
| --set-auto-increment | 強制新記錄的 AUTO_INCREMENT 編號從給定值開始 |
| --set-collation | 指定用於排序資料表索引的定序 |
| --silent | 靜音模式 |
| --sort_buffer_size | 當執行 REPAIR 或使用 CREATE INDEX 或 ALTER TABLE 建立索引時,對索引排序時所配置的緩衝區 |
| --sort-index | 以高到低的順序排序索引樹狀結構區塊 |
| --sort_key_blocks | sort_key_blocks |
| --sort-records | 根據特定的索引排序記錄 |
| --sort-recover | 強制 myisamchk 使用排序來解析索引鍵,即使暫存檔案會非常大 |
| --stats_method | 指定 MyISAM 索引統計資料收集程式碼應如何處理 NULL 值 |
| --tmpdir | 用於儲存暫存檔案的目錄 |
| --unpack | 解壓縮使用 myisampack 壓縮的資料表 |
| --update-state | 將資訊儲存在 .MYI 檔案中,以指示資料表何時經過檢查以及資料表是否當機 |
| --verbose | 詳細模式 |
| --version | 顯示版本資訊並結束 |
| --wait | 等待鎖定的資料表解除鎖定,而不是終止 |
| --write_buffer_size | 寫入緩衝區大小 |