myisamchk)進行線上檢查/修復,無需停服務-- 加鎖
LOCK TABLES tbl_name {READ | WRITE} [, tbl_name {READ | WRITE} ...];
-- 解鎖
UNLOCK TABLES;
| 鎖類型 | 持有者可做 | 其他線程可做 | 典型場景 |
|---|---|---|---|
READREAD [LOCAL] |
讀取 | 讀取(LOCAL 允許並發插入) |
檢查表、備份、只讀報表 |
| WRITE | 讀取、寫入、修改結構 | 阻塞(不可讀寫) | 修復表、大批量寫入、DDL |
LOCK TABLES 需一次獲得所有請求的鎖,否則等待(無超時)。LOCK TABLES、連線關閉、執行緒結束均會釋放當前線程所有鎖。READ LOCAL:MyISAM 支援並發插入(表尾追加),備份工具常用。mysql -e "LOCK TABLES tbl READ; FLUSH TABLES;"
myisamchk tbl
mysql -e "UNLOCK TABLES;"
mysql -e "LOCK TABLES tbl WRITE; FLUSH TABLES;"
cp tbl.* /backup/
myisamchk --recover tbl # 或 OPTIMIZE TABLE tbl
mysql -e "FLUSH TABLES; UNLOCK TABLES;"
注意:修復後必須再次 FLUSH TABLES,讓服務重新載入新的索引檔(.MYI),否則服務仍使用舊快取導致錯誤。
LOCK TABLES 仍可用但會降低併發度。ALGORITHM=INPLACE)大多無需鎖表。mysqldump --single-transaction 或 Percona XtraBackup,避免全表鎖。內部鎖定是 MySQL 服務層協調併發的基礎設施。掌握 LOCK TABLES 與 FLUSH TABLES 的配合,能安全完成 MyISAM 表的線上維護;InnoDB 場景下則應優先使用行級鎖與 MVCC 特性。