MySQL Delete 删数据后磁盘空间未释放的原因

这篇文章主要介绍了MySQL Delete 删数据后磁盘空间未释放的原因,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下

问题描述

MySQL 中使用 delete 语句删除数据之后,监控视图中可用的磁盘空间没有增加,磁盘使用率没有下降等等。

解决方案

delete 不释放空间是 MySQL 自身机制的原因,需要重建表才可以释放磁盘空间,可以参考的操作:

  • 执行 optimize table ${table_name}。
  • 如果是 InnoDB 的表,执行 alter table ${table_name} engine = innodb。
  • 需要注意以下两个问题:

    这两个命令都会重建表,尽量不要在磁盘空间紧张(>90%)的时候进行操作,先扩容磁盘,操作完之后再缩容。
    这两个命令在开始和结束的时候都会尝试获取 metadata lock,所以尽量不要在业务高峰期执行。

    问题分析

    在 MySQL 的机制中,delete 删除的行只是被标记为删除状态,如果删除的行很多,整个数据页(innodb_page)的行都会被删除的时候,数据页也只会标记为删除,都不会真正的物理删除,而是一直占用,等待被复用。

    例如:

    MySQL Delete 删数据后磁盘空间未释放的原因

    可以看到 delete 前后,data_length 并没有发生变化,但是 data_free 增加了很多。这说明数据虽然删了,但是并没有被释放,仍旧被 test1 表占用,只是显示处于 free 状态,以后再写入新数据的时候就可以直接复用,而不需要在申请新的磁盘空间了。

    这个时候使用alter table test1 engine = innodb 看看效果:

    MySQL Delete 删数据后磁盘空间未释放的原因

    可以看到 data_length 和 data_free 都变成了空表的状态,仅有一个 innodb_page (默认 16k)。

    PS:data_free 本身也可以用来评估表的空间碎片,当这个数字非常高的时候,可以考虑用同样的方法重建表,回收一部分磁盘空间。

    以上就是MySQL Delete 删数据后磁盘空间未释放的原因的详细内容,更多关于MySQL 删数据后磁盘空间未释放的资料请关注钦钦技术栈其它相关文章!

    版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/7640/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

    (0)
    上一篇 2022年 8月 1日 9:50:24
    下一篇 2022年 8月 1日 9:50:30

    软件定制开发公司

    相关阅读

    发表回复

    登录后才能评论
    通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!