分区管理和维护操作
删除分区(仅限于范围分区和列表分区,会丢失数据)
mysql
# 一次性删除一个分区
alter table emp drop partition p1;
# 一次性删除多个分区
alter table emp drop partition p1,p2;
1
2
3
4
5
2
3
4
5
增加分区
mysql
# 增加范围分区
alter table emp add partition (partition p3 values less than (5000));
# 增加列表分区
alter table emp add partition (partition p3 values in (5000));
1
2
3
4
5
2
3
4
5
分解分区(不会丢失数据)
reorganize partition
关键字可以对表的部分分区或全部分区进行修改,并且不会丢失数据。分解前后分区的整体范围应该一致。
mysql
alter table t
reorganize partition p1 into
(
partition p1 values less than (1000),
partition p3 values less than (2000)
);
1
2
3
4
5
6
2
3
4
5
6
合并分区(不会丢失数据)
随着分区数量的增多,有时需要把多个分区合并成一个分区,可以使用 into
指令实现。
mysql
alter table t
reorganize partition p1,p3 into
(partition p1 values less than (10000));
1
2
3
2
3
重新定义哈希分区(不会丢失数据)
想要对哈希分区进行扩容或缩容,可以对现有的哈希分区进行重新定义。
mysql
alter table t partition by hash(salary) partitions 8;
1
重新定义范围分区(不会丢失数据)
想要对范围分区进行扩容或缩容,可以对现有范围分区进行重新定义。
mysql
alter table t partition by range(salary)
(
partition p1 values less than (20000),
partition p2 values less than (30000)
);
1
2
3
4
5
2
3
4
5
删除表的所有分区(不会丢失数据)
如果要删除表的所有分区,但又不想删除数据,可以执行如下语句:
mysql
# 注意是 `partitioning`,不是 `partition`
alter table emp remove partitioning;
1
2
2
重建分区
这和先删除保存在分区中的所有记录,然后重新插入它们具有同样的效果,可用于整理分区碎片。
mysql
alter table emp rebuild partition p1,p2;
1
优化分区
如果从分区中删除了大量的行,或者对一个带有可变长度的行做了许多修改,那么可以使用 alter table ... optimize partition
来收回没有使用的空间,并整理分区数据文件的碎片。
mysql
alter table t optimize partition p1,p2;
1
分析分区
想要对现有的分区进行分析,可以执行如下语句:
mysql
-- 读取并保存分区的键分布
alter table t analyze partition p1,p2;
1
2
2
修补分区
mysql
-- 修补被破坏的分区
alter table t repairpartition p1,p2;
1
2
2
检查分区
想要查看现有的分区是否被破坏,可以执行如下语句:
mysql
-- 检查表指定的分区
alter table t check partition p1,p2;
1
2
2
这条语句可以告诉我们表 t
的分区 p1
、p2
中的数据或索引个是否已经被破坏了。如果分区被破坏了,那么可以使用 alter table ... repairpartition
来修补该分区。