事件起因:
今天运维人员找我,说我们的数据库磁盘空间满了。于是提供了一些删除表数据的sql给他,让他执行下。
执行之后,查询数据库,表数据是不在了,但是问题来了。
磁盘空间并没有释放,这是为啥咧????
于是乎,上网查找资料,功夫不负有心人,终于找到问题原因:
使用delete 加上 where条件的删除都不是真删除,在删除数据的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。
被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql会利用这些已删除的空间再写入。删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。
解决方法:
执行完delete语句的时候,再执行下:OPTIMIZE TABLE XXXTable(自己的表名)
注意事项:
执行OPTIMIZE TABLE的时候,会导致锁表,而且没有必要每次delete之后都执行,一个月定时清理下即可。另外,OPTIMIZE 操作会导致锁表,建议在访问量小的时候执行!
自我总结
今天才碰到这样的问题,mysql的delete方法,之前一直以为是直接删除掉了,数据占用的表空间也自然会释放,但是今天才发现,delete语句后加where条件删除的数据会自动加个delete标识而不会真的删掉。学的太浅了,还需多多努力!