占用磁盘的主要是binlog、数据占用、空洞占用、索引占用,binlog定时删除保留一定时长,我们无能为力,只能从数据下手
思路:
1) 清理不需要的数据
2) 考虑将大表迁移至tidb
1.查找大表:
SELECT
TABLE_NAME,
data_free/1024/1024/1024,
index_length/1024/1024/1024,
data_length/1024/1024/1024 ,
sum((data_length+index_length+data_free)/1024/1024/1024)as dl
FROM `TABLES`
GROUP BY TABLE_NAME
ORDER BY dl DESC
《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,推荐分库分表操作 ,那么这里就把大于2G的表作为大容量表处理。
2.删除binlog
在查找大表的时候发现表占用存储并不是很大
转而看日志情况,binlog占用磁盘空间最大
binlog其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中;
3.清理表空洞
删除过期数据之后,发现磁盘空间占用并没有减少,原来是innodb引擎的mysql库,用delete table where语句删除数据后 并不会回收碎片空间,而是有新数据之后,如果能存入该空间就会存进该空间,否则磁盘空间永远不会减少。