MySQL 資料庫往往包含成百上千張表,逐一人工檢查不切實際。myisamchk 是官方提供的 MyISAM 存儲引擎專用離線維護工具,能高效檢測、修復表損壞,堪比資料庫的「年度體檢儀」——早發現、早治療,避免小問題演變成災難性數據丟失。
myisamchk 效能高度依賴可用記憶體,關鍵參數 -O(或 --set-variable)控制排序緩衝區大小。預設僅 3MB,對 GB 級大表嚴重不足。
myisamchk *.MYI 觀察耗時)。myisamchk -O sort_buffer_size=16M ...,16MB 為通用甜點,視機器記憶體上調至 64-256MB,但勿佔用超過物理記憶體 50%,免影響其他服務。修復過程需建立臨時檔案,空間需求嚴格:
--quick 模式:不重建資料檔,僅修復索引,大幅降低空間需求,但無法修復資料層損壞。--recover(或 -r):採用排序緩衝重建索引,需約 資料量 2 倍 排序空間,能解決 90%+ 損壞,但「唯一鍵重複」等邏輯錯誤無效。前置動作(強制):
systemctl stop mysqld),防止寫入衝突。cp -a /var/lib/mysql /backup/mysql_$(date +%F)),哪怕工具再安全,備份是底線。# 僅檢查,標記損壞表,更新狀態旗標
myisamchk --update-state /var/lib/mysql/db_name/*.MYI
後續修復可加 --fast 僅處理標記表,提升效率。
myisamchk -r -q /var/lib/mysql/db_name/tbl_name.MYI
-r:恢復模式,刪除錯誤記錄、重建索引。-q:快速模式,不掃描資料檔,僅修復索引樹。mv tbl_name.MYD /safe/path/.frm 結構檔重建空表:mysql -e "CREATE TABLE db_name.tbl_name ...;"(或用 mysqlfrm 反向生成 DDL)。cp /safe/path/tbl_name.MYD /var/lib/mysql/db_name/myisamchk -r -q 重建索引。無法從 .frm 重建結構時,唯有從完整備份集(全量+增量 Binlog) 做時間點恢復(PITR)。這再次證明:備份策略才是最後防線,myisamchk 只是輔助手段。
myisamchk /var/lib/mysql/*/*.MYI 一鍵巡檢全庫。.MYD/.MYI 操作,無需進入 MySQL。Myisamchk 是 MyISAM 表維護的利器,核心在於「備份優先、記憶體充足、磁碟預留、分級修復」。但請牢記:InnoDB 已成主流,MyISAM 漸趨邊緣;若業務允許,遷移至 InnoDB 並善用 CHECK TABLE/REPAIR TABLE 線上命令與 innodb_force_recovery 才是長久之計。