mysql删除的delete怎么找回(MySQL Delete 删数据后磁盘空间未释放的原因)
mysql删除的delete怎么找回
MySQL Delete 删数据后磁盘空间未释放的原因问题描述
在 MySQL 中使用 delete 语句删除数据之后,监控视图中可用的磁盘空间没有增加,磁盘使用率没有下降等等。
解决方案
delete 不释放空间是 MySQL 自身机制的原因,需要重建表才可以释放磁盘空间,可以参考的操作:
- 执行 optimize table ${table_name}。
- 如果是 InnoDB 的表,执行 alter table ${table_name} engine = innodb。
需要注意以下两个问题:
这两个命令都会重建表,尽量不要在磁盘空间紧张(>90%)的时候进行操作,先扩容磁盘,操作完之后再缩容。
这两个命令在开始和结束的时候都会尝试获取 metadata lock,所以尽量不要在业务高峰期执行。
问题分析
在 MySQL 的机制中,delete 删除的行只是被标记为删除状态,如果删除的行很多,整个数据页(innodb_page)的行都会被删除的时候,数据页也只会标记为删除,都不会真正的物理删除,而是一直占用,等待被复用。
例如:
可以看到 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 删数据后磁盘空间未释放的资料请关注开心学习网其它相关文章!
- phpstudy怎么升级mysql(phpStudy中升级MySQL版本到5.7.17的方法步骤)
- mysql给字段加默认值(MySQL 如何处理隐式默认值)
- 如何查找MySQL中查询慢的SQL语句
- mysql各种查询方式(mysql查询的控制语句图文详解)
- mysql必知必会索引(MySQL索引知识的一些小妙招总结)
- mysql8.0安装及配置(MySQL 8.0 之不可见列的基本操作)
- mysql数据表实例教程(mysql数据库入门第一步之创建表)
- mysql 查询都是0的值(MySQL按小时查询数据,没有的补0)
- mysql事务未提交会锁表吗(Mysql事务中Update是否会锁表?)
- mysql中的null是什么(浅谈为什么Mysql数据库尽量避免NULL)
- mysql语句性能分析(聊聊MySQL的COUNT*的性能)
- mysql8.0查询操作(MySQL 8.0 redo log的深入解析)
- mysql中length、char_length区别
- mysql中json的支持(MySQL中json字段的操作方法)
- mysql主键自增策略(MySQL的主键命名策略相关)
- mysql8.0配置优化参数(MySQL 8.0 新特性之检查约束的实现)
- 微信(微信分身)
- 双十二(双十二和双十一哪个划算)
- 佛肚竹盆景的养护之道(佛肚竹盆景的养护之道)
- 包水饺(包水饺手法怎么包视频)
- 越南河粉(越南河粉来自哪里)
- 按这几方面养护佛肚竹盆景,保证枝叶繁茂,造型优美(按这几方面养护佛肚竹盆景)
热门推荐
- 将mysql中的表导出来(MySQL之导出整个及单个表数据的操作)
- asp.net 文件操作
- reactmap给了key仍然提示错误(react为什么不推荐使用index作为key)
- phpredis常用方法(PHP针对redis常用操作实例详解)
- vue react和angular(详解React Angular Vue三大前端技术)
- docker容器运行环境(Docker 清理环境操作)
- docker安装镜像失败(阿里云镜像安装docker报错的问题及解决方案)
- dede优化教程(DEDE调用分类及分类下文章并限制标题字数及显示条数)
- position零基础入门(position:sticky 粘性定位的几种巧妙应用详解)
- sql两列内容合并(分组字符合并SQL语句 按某字段合并字符串之一简单合并)