注意事项
本文要求PolarDB-X实例版本必须为5.4.14-16539836及以上;
若要对二级分区进行重命名操作,要求PolarDB-X实例版本必须为5.4.17-16952556及以上。
名词解释
表组:分区列完全相同的一组逻辑表或全局索引表的集合。
全局索引:使用另一个维度进行水平分区的数据与主表始终保持强一致的分区表。
语法
ALTER { TABLE tbl_name | TABLEGROUP tg_name | TABLEGROUP BY TABLE tbl_name }
rename_partition_specs_definition
| rename_subpartition_specs_definition
rename_partition_specs_definition:
RENAME PARTITION part_name to new_part_name[,part_name to new_part_name...]
rename_subpartition_specs_definition:
RENAME SUBPARTITION subpart_name to new_subpart_name[,subpart_name to new_subpart_name...]
其中ALTER TABLEGROUP BY TABLE tbl_name
是根据表名[db_name.]tbl_name自动查找目标表的表组tg_name进行表组级的分区重命名,语义上与给定具体表组名的SQL:ALTER TABLEGROUP tg_name
进行分区操作是一样的。
场景1:目标分区是不含二级分区的一级分区
表级用法
假设表tb1的定义为:
CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3;
默认的这三个分区的名字依次是p1、p2、p3。
执行以下SQL,将p1、p3 重命名成p10、p30:
ALTER TABLE tb1 RENAME PARTITION p1 to p10, p3 to p30;
表组级用法
对表组的分区重命名,意味着表组内所有表的相应分区会同步的重命名。
假设表tb1、tb2的分区定义一致,且在一个表组mytg1(名字唯一即可,实例中全部以mytg1为例):
create tablegroup mytg1;
CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3 tablegroup=mytg1;
CREATE TABLE tb2(a int) PARTITION BY key(a) partitions 3 tablegroup=mytg1;
默认的这三个分区的名字依次是p1、p2、p3。
可以通过以下语法,将表组mytg1的p1、p3重命名成p10、p30:
alter tablegroup mytg1 RENAME PARTITION p1 to p10, p3 to p30;
场景2:目标分区是含有二级分区的一级分区
当二级分区为非模板分区时,重命名一级分区对二级分区没有影响,语法规则与场景1一致。
当二级分区为模板分区时,重命名一级分区会让该分区下的所有分区的名称都发生变化。
表级用法
对于以下表tb1的定义为:
create table tb1 (
a bigint unsigned not null,
b bigint unsigned not null,
c bigint NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (a,b) partitions 4
subpartition by range (c) (
subpartition sp1 values less than ( 1000 ),
subpartition sp2 values less than ( 2000 ),
subpartition sp3 values less than ( maxvalue )
);
默认4个一级分区的分区名称分别是p1、p2、p3、p4, 这个表一共有12个二级分区,分别是:
p1sp1,p2sp1,p3sp1,p4sp1
p1sp2,p2sp2,p3sp2,p4sp2
p1sp3,p2sp3,p3sp3,p4sp3
重命名p1为p10:
alter table tb1 rename partition p1 to p10
以上命令会将所有p1分区下的所有二级分区名字都发生变更,{p1sp1, p1sp2, p1sp3} 变更为 {p10sp1, p10sp2, p10sp3} 。
表组级用法
对表组的分区重命名,意味着表组内所有表的相应分区会同步的重命名。
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
场景3:目标分区是模板化的二级分区
不可以只重命名具体的二级分区,只能重命名模板二级分区,意味着所有一级分区下的该模板二级分区都会同步重命名。
对于以下表tb1的定义为:
create table tb1 (
a bigint unsigned not null,
b bigint unsigned not null,
c bigint NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (a,b) partitions 4
subpartition by range (c) (
subpartition sp1 values less than ( 1000 ),
subpartition sp2 values less than ( 2000 ),
subpartition sp3 values less than ( maxvalue )
);
默认地,4个一级分区的分区名称分别是p1、p2、p3、p4, 这个表一共有12个二级分区,分别是:
p1sp1,p2sp1,p3sp1,p4sp1
p1sp2,p2sp2,p3sp2,p4sp2
p1sp3,p2sp3,p3sp3,p4sp3
可以重命名整个分区模板,例如:
alter table tb1 rename subpartition sp1 to sp10
以上命令会将所有一级分区下sp1模板分区都重命名,等同于同时将{p1sp1, p2sp1, p3sp1, p4sp1} 重命名为 {p1sp10, p2sp10, p3sp10, p4sp10}。
表组级用法
对表组的分区重命名,意味着表组内所有表的相应分区会同步的重命名。
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
场景4:目标分区是非模板化的二级分区
和场景3不一样,当二级分区是非模板化分区时,重命名二级分区就是重命名具体的分区,语法同场景3:目标分区是模板化的二级分区,