思路:
1) 清理不需要的数据
2) 考虑将大表迁移至tidb
1.查找大表:
SELECT
TABLE_NAME,
data_free,
index_length,
concat(round(sum(data_length/1024/1024/1024),2),'GB') as dl
FROM `TABLES`
GROUP BY TABLE_NAME
having sum(data_length/1024/1024/1024)>2
ORDER BY DATA_LENGTH DESC
《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,推荐分库分表操作 ,那么这里就把大于2G的表作为大容量表处理。
2.删除binlog
在查找大表的时候发现表占用存储并不是很大
转而看日志情况,binlog占用磁盘空间最大
binlog其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中;
3.清理表空洞
删除过期数据之后,发现磁盘空间占用并没有减少,原来是innodb引擎的mysql库,用delete table where语句删除数据后 并不会回收碎片空间,而是有新数据之后,如果能存入该空间就会存进该空间,否则磁盘空间永远不会减少。
-- 列出所有已经产生碎片的表 ('information_schema', 'mysql'这两个库是mysql自带的库)
select
table_schema db,
table_name,
data_free,
engine,
table_rows,
data_length+index_length length
from
information_schema.tables
where
table_schema not in ('information_schema', 'mysql') and data_free > 0
ORDER BY data_free desc
;
处理表碎片
alter table gd_channel_app_retention engine=innodb;
note:这个语句处理碎片空间其实是先复制现有数据表 然后删除旧的数据表 。如果这个表占用空间巨大,还是直接迁移数据吧。