mysql 分区表
场景:数据库磁盘爆满,使用delete 无法清理磁盘 ,清理会有binlog,redolog ,磁盘无法释放。
个人遇到的真实场景:数据库数据上千万,要清理历史数据,但是delete 删除数据无法释放磁盘,运维老大哥给的方案,先分区表,然后再truncate 这样就能清理历史数据,磁盘也能释放。
操作步骤 :
1,查看数据库是否支持分区:partition 状态是active说明支持分区表。
show plugins;
2,将已存在的表进行分区:(也可以在建表的时候就分区)分区时会将同一个分区的数据存储到一起,所以对已存在的表进行分区是需要很多额外的磁盘的。
alter table users partition by RANGE(id) (PARTITION p1 VALUES less than (5), PARTITION p2 VALUES less than (10), PARTITION p3 VALUES less than MAXVALUE);
我自己使用的是 range方式(还有其他多种方式)进行分区,p1,p2,p3分别是分区名称,指定id为分区字段,最后要有一个默认的分区p3,如果没有这个,当插入id不在这个范围时会报错。
3,查看分区情况;
select * from INFORMATION_SCHEMA.PARTITIONS where table_name='users';
4,truncate 分区
ALTER TABLE users truncate PARTITION p2;
这样就将分p2 的数据清除掉了,磁盘也 能释放掉。再次查看分区情况,分区p2 还存在,但是里面的数据行数是0了。