记录一下那天晚上的排查过程。MySQL 5.7 开了独立表空间,删掉一张八十 G 的日志表后 df 一点没降,du 里也看不到对应的 ibd,data 目录的实际占用和 df 对不上。
刚开始盯着「文件被 mysqld 进程持有,句柄没关,df 看到的还是旧占用」,折腾了半个多小时,排掉了。
真正麻烦的地方在于,几个原因的现象几乎一样。purge 线程还在清理 undo,被删表的页要等 purge 完才真正释放。另一种情况是表上有未提交的事务持有 MDL 锁,DROP 只是把表标记成删除。
少数情况下是开了 innodb_file_per_table 之前建的表,数据在共享表空间里。
先确认表是不是真的删掉了
mysql -e "show tables like 'access_log_%'"
接着看 purge 进度和长事务
mysql -e "show engine innodb status\G" | grep -A5 'TRANSACTIONS'
然后确认进程是否还持有已删除的文件
lsof +L1 | grep -i ibd
剩下的就是把长事务清掉,必要时重启实例
mysql -e "show processlist" | awk '$6 ~ /Query/ {print $1}' | head
别只看报错消失,验证要多做一步。df 中数据目录所在分区的占用回落到删除前的水平,lsof +L1 里没有 ibd 句柄,information_schema.tables 里也查不到这张表。
DROP 之后空间不降,九成是 purge 没跑完或者事务卡着 MDL;先看 innodb_trx 再看 lsof,别急着重启实例。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
