萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MyISAM 表大量刪除後碎片回收實戰:myisamchk -r 避坑指南與正確姿勢

現象

刪除 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。

現代替代方案:SQL 層面無感整理


-- MySQL 5.0+ 支持
OPTIMIZE TABLE relationship;
-- 等價於:ALTER TABLE relationship ENGINE=MyISAM; ANALYZE TABLE relationship;
-- 優勢:在線操作、自動處理鎖、無需外部工具、支持 InnoDB

最佳實踐建議

  1. 常規維護**優先使用 OPTIMIZE TABLE**,避免直接操作文件。
  2. 大表整理建議低峰期,或使用 pt-online-schema-change 無鎖變更。
  3. 定期監控 Data_free ( SHOW TABLE STATUS ) 判斷碎片率,超 20% 觸發整理。
  4. InnoDB 表無需 myisamchk,依賴 OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 重建。
copyright © 萬盛學電腦網 all rights reserved