外部鎖定(External Locking),又稱檔案級鎖定,是 MySQL 服務進程透過作業系統提供的檔案鎖 API(如 fcntl(), lockf())協調多進程對 MyISAM/ISAM 表檔案(.MYD, .MYI)的存取,防止 mysqld 與 myisamchk/isamchk 等維護工具同時操作同一張表導致資料損壞。
| 參數 | 預設值 | 說明 |
|---|---|---|
skip_external_locking / --skip-locking |
Linux/Unix 預設 ON(停用) |
Windows 預設 OFF(啟用) |
查看當前狀態:
mysqladmin variables | grep skip_locking
| 場景 | skip_locking=OFF(啟用) | skip_locking=ON(停用,Linux預設) |
|---|---|---|
| 檢查/修復表 | 服務與工具協作鎖定,可線上操作 | 服務不知情,必須停服務 或用內部鎖定協議 |
| 前置操作 | 執行 mysqladmin flush-tables 刷新快取 |
需手動 LOCK TABLES ... READ/WRITE + FLUSH TABLES |
| 風險 | 部分網路/分散式檔案系統(NFS, SMB)鎖不可靠 | 需人工協調,易誤操作 |
fcntl() 在 NFS、某些本地檔案系統上表現不穩,易導致死鎖或資料損壞。LOCK TABLES):跨平台一致、無檔案系統相依性。external-locking 簡化維護流程。cp tbl_name.* /backup/)。InnoDB 為預設引擎,不依賴外部鎖定,問題自然規避。# 啟用外部鎖定啟動服務
mysqld --external-locking
# 內部鎖定檢查流程
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
mysql -e "FLUSH TABLES; UNLOCK TABLES;"