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 | 寫入緩衝區大小 |