[[374540]]
本文转载自微信公众号「Linux开发那些事儿」,作者 LinuxThings 。回收转载本文请联系Linux开发那些事儿公众号。确姿
不知道大家有没有遇到这样的空间一种情况,线上业务在MySQL表上做增删改查操作,回收随着时间的确姿推移,表里面的空间数据越来越多,表数据文件越来越大,回收数据库占用的确姿空间自然也逐渐增长
为了缩小磁盘上表数据文件占用的空间,我们在最大的一张业务表中用delete命令删除了一半儿的旧数据,删除之后,磁盘上表数据文件并没有缩小,即使删除整张表的数据,文件依然没有变小,这是为什么呢?
本文将详细的分析上述问题,并给出正确回收表空间的方法
前置说明
目前大部分MySQL数据库都是用的 InnoDB 引擎,所以如无特殊说明,文中的实例都是基于InnoDB引擎的
在MySQL配置中有个配置项叫 innodb_file_per_table 将它设置为1之后, 每个表的数据会单独存储在一个以 .ibd 为后缀的文件中
如果 innodb_file_per_table 没有开启的话, 表的数据是存储在系统的共享表空间,这样即使删除了表,共享表空间也不会释放这部分空间
所以,通常情况下,都是将 innodb_file_per_table 选项设置为 1, 同时为了能直观的看到表数据文件的大小变化,文中的实例也都是基于开启了 此选项来说明的
问题重现
新建一张表ta,表的结构如下
- mysql> show create table ta\G
(责任编辑:热点)
CV大咖齐聚于此,追忆一代宗师Thomas S. Huang为人、为师、为学
绝不破例!苹果发出最强硬威胁:要全面封杀 Epic Games,恐影响上百款游戏
*ST康得(002450.SZ)2020年度实现归母净亏损32.05亿元 公司总资产81.01亿元