| 命令 | 用途 | 適用引擎 | 鎖表行為 |
|---|---|---|---|
| REPAIR TABLE | 修復損壞的索引/資料檔 | MyISAM, ARCHIVE, CSV | 寫鎖定(阻塞讀寫) |
| OPTIMIZE TABLE | 回收碎片、重排資料、更新索引統計 | MyISAM, InnoDB, ARCHIVE | 重建表期間持有排他鎖 |
REPAIR TABLE tbl_name [QUICK] [EXTENDED] [USE_FRM];
.MYI),不掃描資料檔,速度最快,適用索引損壞、資料完好。.MYI 遺失或頭部損壞時,用 .frm 定義重建索引。INSERT INTO tmp SELECT * FROM tbl ORDER BY PK)。InnoDB 實際執行 ALTER TABLE ... ENGINE=InnoDB(重建聚簇索引)。
Table is marked as crashed、Can't open file .MYI、查詢結果不完整、CHECK TABLE 回報錯誤。DELETE/UPDATE 後、定期維護(週/月)、Data_free 佔比 > 20%、SHOW TABLE STATUS 顯示碎片大。-- 1. 檢查
CHECK TABLE tbl_name;
-- 或
CHECK TABLE tbl_name FAST; -- 僅檢查未正確關閉的表
CHECK TABLE tbl_name EXTENDED; -- 逐行掃描
-- 2. 修復
REPAIR TABLE tbl_name; -- 標準修復
REPAIR TABLE tbl_name USE_FRM; -- 索引檔遺失
-- 3. 優化(修復完成後)
OPTIMIZE TABLE tbl_name;
-- 4. 驗證
CHECK TABLE tbl_name;
ANALYZE TABLE tbl_name; -- 更新統計資訊
#!/bin/bash
# 每週日凌晨 3 點執行
mysqlcheck --auto-repair --optimize --all-databases -u root -p'password' > /var/log/mysql_weekly_maintenance.log 2>&1
mysqldump 或檔案級快照)。REPAIR TABLE,損壞需從備份恢復或 innodb_force_recovery。