大量刪除relationship表資料(2000萬行)後,磁碟空間未釋放。執行myisamchk -r relationship碎片整理,MySQL運行中操作,查詢報錯:
ERROR 1030 (00000): Got error 127 from table handler
Linux預設啟用--skip-locking(即--skip-external-locking),MySQL不使用系統層檔案鎖。此模式下:
官方文檔明確警告:--skip-locking 環境下,mysqld 使用表時不可靠執行 myisamchk。
# 1. 正常關閉 MySQL
mysqladmin -u root -p shutdown
# 2. 執行碎片整理/修復
myisamchk -r /var/lib/mysql/dbname/relationship
# 3. 重啟 MySQL
/etc/init.d/mysql start
優點:零衝突風險。缺點:需停機維護窗口。
# 1. 線上執行 myisamchk (風險自負)
myisamchk -r /var/lib/mysql/dbname/relationship
# 2. 立即重啟 MySQL 強制重新載入表定義
/etc/init.d/mysql restart
重啟可清除快取不一致,但操作期間仍有資料損壞風險。
# 1. 刷新表快取,關閉所有開啟表,釋放鎖定
mysqladmin -u root -p flush-tables
# 2. 確認無長時間查詢運行 (SHOW PROCESSLIST)
# 3. 執行碎片整理
myisamchk -r /var/lib/mysql/dbname/relationship
# 4. 可選:再次 FLUSH TABLES 確保快取同步
mysqladmin -u root -p flush-tables
原理:FLUSH TABLES 關閉所有表檔案控制代碼,確保 myisamchk 獨佔存取。
# 在 MySQL 客戶端直接執行 (自動處理鎖定、重建)
OPTIMIZE TABLE relationship;
ALTER TABLE ... ENGINE=InnoDB 重建)SHOW TABLE STATUS LIKE 'relationship'\G → Engine: MyISAMskip-external-locking 狀態:SHOW VARIABLES LIKE 'skip_external_locking'OPTIMIZE TABLE 或停機 myisamchkmysqldump --single-transaction dbname relationship > backup.sqlInnoDB 不使用 myisamchk:
# 線上重建 (5.6+ 支援 ONLINE DDL)
OPTIMIZE TABLE innodb_table;
# 或
ALTER TABLE innodb_table ENGINE=InnoDB;
# 線上重建不阻塞 DML (視版本與參數)