分区迁移

注意事项

  • 本文要求PolarDB-X实例版本必须为5.4.14-16539836及以上;

  • 若要对二级分区进行迁移操作,要求PolarDB-X实例版本必须为5.4.17-16952556及以上。

名词解释

  • 表组:分区列完全相同的一组逻辑表或全局索引表的集合。

  • 全局索引:使用另一个维度进行水平分区的数据与主表始终保持强一致的分区表。

  • 分区迁移:将分区表的分区从一个存储节点(DN)挪到另一个存储节点。

语法

ALTER { TABLE tbl_name | TABLEGROUP tg_name | TABLEGROUP BY TABLE tbl_name } 
		move_partition_specs_definition
 | move_subpartition_specs_definition

 
move_partition_specs_definition:
MOVE PARTITIONS part_name[,...,part_name] to dn_id

move_subpartition_specs_definition:
MOVE SUBPARTITIONS subpartition_name[,...,subpartition_name] to dn_id
说明

其中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迁移到指定的存储节点DN2(其中DN2是存储节点的ID)中:

alter table tb1 move partitions p1,p3 to 'DN2';
表组级用法
说明

对表组的分区进行迁移,意味着表组内所有表的相应分区会同步的迁移到指定存储节点。

假设表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。

执行以下语法,将表组的p1、p3迁移到指定的存储节点DN2(其中DN2是存储节点的ID)中:

alter tablegroup mytg1 move partitions p1,p3 to 'DN2';

场景2:目标分区是含有二级分区的一级分区

迁移含二级分区的一级分区,会将该分区下的所有二级分区全部迁移到指定的存储节点。

表级用法

对于以下表:

create table t1 (
a bigint unsigned not null,
b bigint unsigned not null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (a,b) partitions 4
subpartition by range columns (c,d)
(
partition p1
(
subpartition p1sp1 values less than ( '2020-01-01', 'abc' ),
subpartition p1sp2 values less than ( maxvalue, maxvalue )
),
partition p2
(
subpartition p2sp1 values less than ( '2020-01-01', 'abc' ),
subpartition p2sp2 values less than ( '2021-01-01', 'abc' ),
subpartition p2sp3 values less than ( '2022-01-01', 'abc' ),
subpartition p2sp4 values less than ( maxvalue, maxvalue )
),
partition p3
(
subpartition p3sp1 values less than ( '2020-01-01', 'abc' ),
subpartition p3sp2 values less than ( maxvalue, maxvalue )
),
partition p4
(
subpartition p4sp1 values less than ( '2020-01-01', 'abc' ),
subpartition p4sp2 values less than ( maxvalue, maxvalue )
)
);

执行以下语法,将表组的p1、p3迁移到指定的存储节点DN2(其中DN2是存储节点的ID)中:

alter table t1 move partitions p1,p3 to 'DN2';

这个迁移命令背后会将p1、p3的所有子分区都迁移到DN2,所以上面SQL等同于以下SQL:

alter table t1 move subpartitions p1sp1,p1sp2,p3sp1,p3sp2 to 'DN2';

表组级用法

说明

对表组的分区进行迁移,意味着表组内所有表的相应分区会同步的迁移到指定存储节点。

和表级类似,仅需将语法规则alter table #tb改成alter tablegroup #tgnamealter 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 move subpartitions sp1 to 'DN-1'

以上命令会将所有一级分区下sp1模板分区都迁移到DN-1,等同于以下命令:

alter table tb1 move subpartitions p1sp1, p2sp1, p3sp1, p4sp1 to 'DN-1'

也可以只迁移某个具体的二级分区,例如:

alter table tb1 move subpartitions p1sp1, p2sp1 to 'DN-1'
表组级用法
说明

对表组的分区进行迁移,意味着表组内所有表的相应分区会同步的迁移到指定存储节点。

和表级类似,仅需将语法规则alter table #tb改成alter tablegroup #tgnamealter tablegroup by #tb

场景4:目标分区是非模板化的二级分区

和场景3不一样,当二级分区是非模板化分区时,迁移二级分区就是迁移具体的分区,语法请参见场景3:目标分区是模板化的二级分区