mysql .ibd 文件过大清理方法

问题

有一个 info_track 表用来临时存储告警推送数据,逻辑处理完成后,会执行 Delete 语句删除对应的记录。

问题:项目现场运行了几个月后,发现磁盘空间莫名占用了过多的存储,> 100GB,且无法释放。

生产环境出现了问题,心里当时咯噔一下,不妙,有个隐藏 bug 没有测出来。这不得赶紧沉下心来分析排查,经过抽丝剥茧逐步排查,功夫不负有心人,最终定位到是 info_track 这个表数据量大,执行 delete 删除后,虽然记录确实被删除了,但磁盘上 .ibd 文件大小并没有被释放。

既然定位到问题了,那就好解决。

解决方法

当时我们采用增加一个定时 job 的方法来修复该问题:每月定时对这个表执行一次 truncate table 操作。

这是好几年前的一个项目,各位朋友别吐槽解决方法的合理性,以解决问题优先,哈哈~

 根因分析:

truncate table 命令将快速删除数据表中的所有记录,保留数据表结构,但会清理磁盘 .ibd 空间,即数据不可以恢复。

delete from 命令也是快速删除数据表中的所有记录,保留数据表结构,但 .ibd 文件不会清理需要的时候,数据可以回滚恢复。

问题验证

以 45 环境 info_operate_log 表为例进行演示,该表总共有 3229 条记录。

1、登录服务器查看 mysql 表空间磁盘占用情况

# cd /var/lib/kubelet/pods/a5077c96-e7bf-11e8-bc9b-ac1f6b928894/volumes/kubernetes.io~local-volume/local-pv-e40a818a/mysql/senseguard

# du –hsl *

info_operate_log.ibd 占用磁盘空间为 9.0M

2、DELETE info_operate_log

3、查看磁盘占用情况

Info_operate_log.ibd 磁盘空间还是 9.0M

4、TRUNCATE TABLE info_operate_log

5、再次查看磁盘占用情况

 Info_operate_log.ibd 占用空间只有 80K 了,清理成功。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hyatt1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值