注意事項
本文要求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 #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 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 #tgname或alter tablegroup by #tb。
情境4:目標資料分割是非模板化的二級分區
和情境3不一樣,當二級分區是非模板化分區時,遷移二級分區就是遷移具體的分區,文法請參見情境3:目標資料分割是模板化的二級分區。