刪除 relationship 表 2000 萬行後,磁盤空間未釋放。執行 myisamchk -r relationship 整理碎片,完成後查詢報錯:
ERROR 1030 (00000): Got error 127 from table handler
Linux 默認啟用 --skip-locking (即 skip_external_locking),mysqld 不協調外部鎖。**在 mysqld 運行時直接對表文件操作,會導致緩存與磁盤不一致,甚至損壞表結構。**
/etc/init.d/mysql stop
myisamchk -r /var/lib/mysql/dbname/relationship
/etc/init.d/mysql start
myisamchk -r /var/lib/mysql/dbname/relationship
/etc/init.d/mysql restart
mysqladmin -u root -p flush-tables
myisamchk -r /var/lib/mysql/dbname/relationship
flush-tables 強制關閉所有打開表、刷新緩存到磁盤,此時文件處於一致性靜止狀態,安全運行 myisamchk。
-- MySQL 5.0+ 支持
OPTIMIZE TABLE relationship;
-- 等價於:ALTER TABLE relationship ENGINE=MyISAM; ANALYZE TABLE relationship;
-- 優勢:在線操作、自動處理鎖、無需外部工具、支持 InnoDB
OPTIMIZE TABLE**,避免直接操作文件。pt-online-schema-change 無鎖變更。Data_free ( SHOW TABLE STATUS ) 判斷碎片率,超 20% 觸發整理。myisamchk,依賴 OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 重建。