功能介绍
exchange subpartition template 功能允许用户将一个分区的子分区模板交换到另一个分区中,同时将另一个分区的子分区模板交换到原来的分区中。这样,就可以快速更改分区表的分区策略,而无需重新创建表或者进行数据迁移。
支持版本
内核版本 TXSQL 8.0 3.1.15及以上。
适用场景
适用于需要快速交换表中数据的场景。
使用说明
使用语法
ALTER TABLE pt EXCHANGE SUBPARTITION TEMPLATE p WITH TABLE nt WITH VALIDATION / WITHOUT VALIDATION
使用限制
pt 和 nt 表不能有全局索引。
pt 和 nt 表不能有触发器和 check 约束。
pt 和 nt 表的分区类型以及子分区类型只支持 range 和 list。
pt 和 nt 表的一级分区定义必须保持一致。
示例
-- 将 s20240111中的数据从 hash_range_1转到 hash_range_2CREATE TABLE hash_range_1(id INT NOT NULL,fname VARCHAR(30),hired date NOT NULL DEFAULT '9999-12-31',primary key (id, hired))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4PARTITION BY LIST(murmurHashCodeAndMod(id,2))SUBPARTITION BY RANGE(tdsql_day(hired))SUBPARTITION TEMPLATE(SUBPARTITION s20240111 VALUES LESS THAN (20240111),SUBPARTITION s20240112 VALUES LESS THAN (20240112),SUBPARTITION s20240113 VALUES LESS THAN (20240113))(PARTITION p1 VALUES IN (0),PARTITION p2 VALUES IN (1));-- (hash_range_2与 hash_range_1完全相同)CREATE TABLE hash_range_2(id INT NOT NULL,fname VARCHAR(30),hired date NOT NULL DEFAULT '9999-12-31',primary key (id, hired))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4PARTITION BY LIST(murmurHashCodeAndMod(id,2))SUBPARTITION BY RANGE(tdsql_day(hired))SUBPARTITION TEMPLATE(SUBPARTITION s20230111 VALUES LESS THAN (20240111),SUBPARTITION s20230112 VALUES LESS THAN (20240112),SUBPARTITION s20230113 VALUES LESS THAN (20240113))(PARTITION p1 VALUES IN (0),PARTITION p2 VALUES IN (1));-- 新建一个临时 temp 表,一级分区和表结构和 hash_range_1一致CREATE TABLE temp(id INT NOT NULL,fname VARCHAR(30),hired date NOT NULL DEFAULT '9999-12-31',primary key (id, hired))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4PARTITION BY LIST(murmurHashCodeAndMod(id,2))(PARTITION p1 VALUES IN (0),PARTITION p2 VALUES IN (1));-- 语法演示-- 第一步: hash_range_1--> tempALTER TABLE hash_range_1EXCHANGE subpartition template s20240111with table temp with validation;-- 第二步: temp --> hash_range_2ALTER TABLE hash_range_2EXCHANGE subpartition template s20240111with table temp with validation;
数据校验说明
同官方一样,显式指定 WITH VALIDATION 来进行数据校验或者 WITHOUT VALIDATION 不进行数据校验。默认进行数据校验。
数据校验主要是验证 nt 表中一级分区的数据是否满足在 pt 表中对应一级分区下,二级分区的定义。在上面的示例中,如果第一步 temp 表 p1 分区有 hired 列存在数据满足 tdsql_day(hired)>=20240111,那么将不满足二级分区定义。SUBPARTITION s20240111 VALUES LESS THAN (20240111) 数据校验将会失败。