某日收到数据库服务器磁盘报警超过75%,突然想到架构师让每月清理一次流水表这个月还没有清理,于是在18:00提交变更申请清理上个月之前的数据。
执行操作为:
mysql> delete from st_event_water where create_time < “-12-01”;
一共三张表,删除了大约1000w条数据的样子,删除后查看发现磁盘空间使用率成了96%,原来删除数据期间产生了大量的binlog,于是紧急修改binlog保留时间为1天,删除binlog释放磁盘空间
mysql> set global expire_logs_days=1;
mysql> flush logs;
此刻再次查看磁盘空间发现依然是76%使用率
查看磁盘碎片情况
data_free即为磁盘空洞,delete操作并不会释放磁盘空间
尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小。这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变。这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在。这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率。
于是进行清理磁盘空洞
mysql> optimize table st_event_water;
在清理的时候会产生和原表一样大小的临时表,通知相关人员清理过程会产生磁盘报警以及从库延时报警,待完成后磁盘空间释放报警解除。
如果觉得《记一次delete MySQL数据释放磁盘空间》对你有帮助,请点赞、收藏,并留下你的观点哦!