MySQLDelete删数据后磁盘空间未释放的原因
⽬录
问题描述
解决⽅案
问题分析
问题描述
在 MySQL 中使⽤ delete 语句删除数据之后,监控视图中可⽤的磁盘空间没有增加,磁盘使⽤率没有下降等等。
解决⽅案
delete 不释放空间是 MySQL ⾃⾝机制的原因,需要重建表才可以释放磁盘空间,可以参考的操作:
1. 执⾏ optimize table ${table_name}。
2. 如果是 InnoDB 的表,执⾏ alter table ${table_name} engine = innodb。
需要注意以下两个问题:
这两个命令都会重建表,尽量不要在磁盘空间紧张(>90%)的时候进⾏操作,先扩容磁盘,操作完之后再缩容。
这两个命令在开始和结束的时候都会尝试获取 metadata lock,所以尽量不要在业务⾼峰期执⾏。
问题分析
在 MySQL 的机制中,delete 删除的⾏只是被标记为删除状态,如果删除的⾏很多,整个数据页(innodb_page)的⾏都会被删除的时候,数据页也只会标记为删除,都不会真正的物理删除,⽽是⼀直占⽤,等待被复⽤。
例如:
mysql下载哪个盘可以看到 delete 前后,data_length 并没有发⽣变化,但是 data_free 增加了很多。这说明数据虽然删了,但是并没有被释放,仍旧被 test1 表占⽤,只是显⽰处于 free 状态,以后再写⼊新数据的时候就可以直接复⽤,⽽不需要在申请新的磁盘空间了。
这个时候使⽤alter table test1 engine = innodb看看效果:
可以看到 data_length 和 data_free 都变成了空表的状态,仅有⼀个 innodb_page (默认 16k)。
PS:data_free 本⾝也可以⽤来评估表的空间碎⽚,当这个数字⾮常⾼的时候,可以考虑⽤同样的⽅法重建表,回收⼀部分磁盘空间。
以上就是MySQL Delete 删数据后磁盘空间未释放的原因的详细内容,更多关于MySQL 删数据后磁盘空间未释放的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。