公司的程序和数据库部署在阿里云上,数据库使用的是阿里云的RDS,这天,经理在开发群中发了一个信息:
您的RDS实例rm********0oq的磁盘在过去一周平均使用率已超过80.%,建议您对实例规格进行升级,以免磁盘资源不足,影响业务运行。详情请您查看您阿里云注册邮箱中的邮件。
1、首先我在Navicat上远程delete阿里云RDS数据表中的数据,
找到对应的表,然后delete 删除部分数据,单个表中的数据达五千万条,所以操作起来很笨重。(懊恼啊,为什么当初没有做分表操作。。)
按照产品经理的原话是“近期的任务不要删除,把以前的数据删掉!”
so,切割表的想法就打消了。还好我们的id是自增的,根据id删除了前面的数据。(每次也就几十万)
在复杂一些的就是根据任务字段删除数据。
删了一个小时,MD累死了,才删了几百万条数据,这时候我看了一下RDS的磁盘空间。
!!!!!!!!!!!!!!
MD,我奔溃啊,磁盘空间快满了,什么鬼啊!
吓得我赶紧喝了口82年的拉菲。
我打开百度(全球最大的中文搜索引擎),搜了一下本文的题目“MySQL 删除数据后空间没有减少处理方法”,给出了方法:
https://help.aliyun.com/knowledge_detail/41720.html
我就迅速的登上了DMS,找到了表维护--》优化。然后开始庆幸,幸好及时发现,不然就满了。。满了。满了!真的是满了。。。。。。。在我优化的时候我看了一下实例状态:
你TM在逗我?
越优化越满了?什么情况啊。。。。。。。。。
再次打开了全球最大的中文搜索引擎。
给出下面的解决方案,使用命令行:
OPTIMIZE TABLE mission_picture
这个命令执行时间比较长,可能是数据量较大的原因:但是结果并不理想,
执行结果失败
note:Table does not support optimize, doing recreate + analyze instead
error:The table 'mission_picture' is full
status:Operation failed
查询资料,解决方案有下面几个:
1、mysql本身的机制,delete后空间不会自动回收的,需要用optimize table回收。
2、alter table 表 ENGINE = 'InnoDB';
analyze table 表;
最后解决方法是:
在DMS中的sql执行第一个方法。执行结束,依然提示“Table does not support optimize, doing recreate + analyze instead”
但是碎片率已经释放了。
算是完成了。。