注意事項
本文要求PolarDB-X實例版本必須為5.4.14-16539836及以上;
若要對二級分區進行修改操作,要求PolarDB-X實例版本必須為5.4.17-16952556及以上。
Hash/Key/Co_Hash的哈希分區策略,不支持執行該操作。
Range/Range Columns的分區策略,不支持執行該操作。
List/List Columns的分區策略,若分區定義使用了default等“catch-all”分區,不支持執行該分區操作。
全局索引表不支持Drop Values操作。
含全局索引的分區表不支持Drop Values操作。
名詞解釋
表組:分區列完全相同的一組邏輯表或全局索引表的集合。
全局索引:使用另一個維度進行水平分區的數據與主表始終保持強一致的分區表。
語法
ALTER alter_target_definition modify_partition_values_operation_definition
alter_target_definition:
TABLE [db_name.]tbl_name
| TABLE tbl_name.index_name
| TABLEGROUP tg_name
| INDEX index_name ON TABLE [db_name.]tbl_name
| TABLEGROUP BY TABLE [db_name.]tbl_name
| TABLEGROUP BY INDEX index_name ON TABLE [db_name.]tbl_name
modify_partition_values_operation_definition:
MODIFY PARTITION part_name values_operation_definition
| MODIFY SUBPARTITION subpart_name values_operation_definition
values_operation_definition:
ADD VALUES (value_list)
| DROP VALUES (value_list)
場景1:目標分區是一級分區
假設l_t1與l_t2都采用List分區,建表SQL如下所示:
CREATE TABLE `l_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(YEAR(`c`))
(
PARTITION p0 VALUES IN (2020,2022,2024,2026),
PARTITION p1 VALUES IN (2021,2023,2025,2027)
);
CREATE TABLE `l_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY LIST(YEAR(`c`))
(
PARTITION p0 VALUES IN (2020,2022,2024,2026),
PARTITION p1 VALUES IN (2021,2023,2025,2027)
);
示例1:修改一級List分區并增加Values
給l_t1表的p1分區增加2個values,新的values值是(2017,2019)。具體用法如下所示:
表級用法
## 基于表名字進行表級的分區變更操作
ALTER TABLE l_t1 /*表名*/
MODIFY PARTITION p1 ADD VALUES (2017,2019);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即上述兩個表同時執行分區變更:
## 基于表組名字進行表組級的分區變更操作, 假設表組名是tg1
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY PARTITION p1 ADD VALUES (2017,2019);
## 基于表名進行表組級的分區變更操作(即基于表名自動找查對應的表組并進行操作)
ALTER TABLEGROUP BY TABLE l_t1 /*表名*/
MODIFY PARTITION p1 ADD VALUES (2017,2019);
示例2:修改一級List分區并刪除Values
給l_t1表的p1分區刪除兩個values,這兩個values是2021與2025。具體用法如下所示:
表級用法
## 基于表名字進行表級的分區變更操作
ALTER TABLE l_t1 /*表名*/
MODIFY PARTITION p1 DROP VALUES (2021,2025);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即上述兩個表同時執行分區變更:
## 基于表組名字進行表組級的分區變更操作
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY PARTITION p1 DROP VALUES (2021,2025);
## 基于表名進行表組級的分區變更操作(即基于表名自動找查對應的表組并進行操作)
ALTER TABLEGROUP BY TABLE l_t1 /*表名*/
MODIFY PARTITION p1 DROP VALUES (2021,2025);
場景2:目標分區是模板化的二級分區
假設k_l_tp_t1與k_l_tp_t2都采用Key+List的二級分區,建表SQL如下所示:
CREATE TABLE `k_l_tp_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY LIST(YEAR(`c`))
(
SUBPARTITION sp0 VALUES IN (2020,2022,2024,2026),
SUBPARTITION sp1 VALUES IN (2021,2023,2025,2027)
);
CREATE TABLE `k_l_tp_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY LIST(YEAR(`c`))
(
SUBPARTITION sp0 VALUES IN (2020,2022,2024,2026),
SUBPARTITION sp1 VALUES IN (2021,2023,2025,2027)
);
示例1:修改模板化二級List分區并增加Values
給k_l_tp_t1表的二級分區模板sp1增加2個values,新的values值是(2017,2019)。具體用法如下所示:
表級用法
## 基于表名字進行表級的分區變更操作
ALTER TABLE k_l_tp_t1 /*表名*/
MODIFY SUBPARTITION sp1 /*二級分區模板名字*/ ADD VALUES (2017,2019);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即上述兩個表同時執行分區變更:
## 基于表組名字進行表組級的分區變更操作, 假設表組名是tg1
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY SUBPARTITION sp1 /*二級分區模板名字*/ ADD VALUES (2017,2019);
## 基于表名進行表組級的分區變更操作(即基于表名自動找查對應的表組并進行操作)
ALTER TABLEGROUP BY TABLE k_l_tp_t1 /*表名*/
MODIFY SUBPARTITION sp1 /*二級分區模板名字*/ ADD VALUES (2017,2019);
示例2:修改模板化二級List分區并刪除Values
給k_l_tp_t1表的二級分區模板sp1刪除兩個values,這兩個values是2021與2025。具體用法如下所示:
表級用法
## 基于表名字進行表級的分區變更操作
ALTER TABLE k_l_tp_t1 /*表名*/
MODIFY SUBPARTITION sp1 /*二級分區模板名字*/ DROP VALUES (2021,2025);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即上述兩個表同時執行分區變更:
## 基于表組名字進行表組級的分區變更操作
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY SUBPARTITION sp1 /*二級分區模板名字*/ DROP VALUES (2021,2025);
## 基于表名進行表組級的分區變更操作(即基于表名自動找查對應的表組并進行操作)
ALTER TABLEGROUP BY TABLE k_l_tp_t1 /*表名*/
MODIFY SUBPARTITION sp1 /*二級分區模板名字*/ DROP VALUES (2021,2025);
場景3:目標分區是非模板化的二級分區
k_l_ntp_t1與k_l_ntp_t2都采用Key+List的二級分區,建表SQL如下所示:
CREATE TABLE `k_l_ntp_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY LIST(YEAR(`c`))
(
PARTITION p1 (
SUBPARTITION p1sp1 VALUES IN (2020,2022,2024,2026,2028),
SUBPARTITION p1sp2 VALUES IN (2021,2023,2025,2027,2029)
),
PARTITION p2 (
SUBPARTITION p2sp1 VALUES IN (2020,2022,2024,2026,2028),
SUBPARTITION p2sp2 VALUES IN (2021,2023,2025,2027,2029),
SUBPARTITION p2sp3 VALUES IN (2030,2031)
)
);
CREATE TABLE `k_l_ntp_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`) PARTITIONS 2
SUBPARTITION BY LIST(YEAR(`c`))
(
PARTITION p1 (
SUBPARTITION p1sp1 VALUES IN (2020,2022,2024,2026,2028),
SUBPARTITION p1sp2 VALUES IN (2021,2023,2025,2027,2029)
),
PARTITION p2 (
SUBPARTITION p2sp1 VALUES IN (2020,2022,2024,2026,2028),
SUBPARTITION p2sp2 VALUES IN (2021,2023,2025,2027,2029),
SUBPARTITION p2sp3 VALUES IN (2030,2031)
)
);
示例1:修改非模板化二級List分區并增加Values
給k_l_ntp_t1表的第1個一級分區p1的二級分區p1sp2增加2個values,新的values值是(2017,2019)。具體用法如下所示:
表級用法
## 基于表名字進行表級的分區變更操作
ALTER TABLE k_l_ntp_t1 /*表名*/
MODIFY SUBPARTITION p1sp2 ADD VALUES (2017,2019);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即上述兩個表同時執行分區變更:
## 基于表組名字進行表組級的分區變更操作, 假設表組名是tg1
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY SUBPARTITION p1sp2 /*實際的非模板化二級分區的名字*/ ADD VALUES (2017,2019);
## 基于表名進行表組級的分區變更操作(即基于表名自動找查對應的表組并進行操作)
ALTER TABLEGROUP BY TABLE k_l_ntp_t1 /*表名*/
MODIFY SUBPARTITION p1sp2 /*實際的非模板化二級分區的名字*/ ADD VALUES (2017,2019);
示例2:修改非模板化二級List分區并刪除Values
給k_l_tp_t1表的一級分區p1下的二級分區p1sp1刪除兩個values,這兩個values是2021與2025。具體用法如下所示:
表級用法
## 基于表名字進行表級的分區變更操作
ALTER TABLE k_l_tp_t1 /*表名*/
MODIFY SUBPARTITION p1sp2 /*實際的非模板化二級分區的名字*/ DROP VALUES (2021,2025);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即上述兩個表同時執行分區變更:
## 基于表組名字進行表組級的分區變更操作
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY SUBPARTITION p1sp2 DROP VALUES (2021,2025);
## 基于表名進行表組級的分區變更操作(即基于表名自動找查對應的表組并進行操作)
ALTER TABLEGROUP BY TABLE k_l_ntp_t1 /*表名*/
MODIFY SUBPARTITION p1sp2 /*實際的非模板化二級分區的名字*/ DROP VALUES (2021,2025);
場景4:目標分區是全局索引表的分區
示例1:給指定的全局索引表的指定的一級LIST分區增加Values
r_gl_t1是一個使用全局索引的表, 全局索引g_l使用了LIST進行分區,建表SQL如下所示:
CREATE TABLE `r_gl_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL,
GLOBAL INDEX `g_l` (`a`) COVERING (`c`)
PARTITION BY LIST(`a`) (
PARTITION `p0` VALUES IN (10000,10002,10004,10006,10008),
PARTITION `p1` VALUES IN (20000,20001,20002,20003,20004),
PARTITION `p2` VALUES IN (30000,30001,30002)
)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(PARTITION `p0` VALUES LESS THAN (2020),
PARTITION `p1` VALUES LESS THAN (2021));
CREATE TABLE `r_gl_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL,
GLOBAL INDEX `g_l` (`a`) COVERING (`c`)
PARTITION BY LIST(`a`) (
PARTITION `p0` VALUES IN (10000,10002,10004,10006,10008),
PARTITION `p1` VALUES IN (20000,20001,20002,20003,20004),
PARTITION `p2` VALUES IN (30000,30001,30002)
)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(PARTITION `p0` VALUES LESS THAN (2020),
PARTITION `p1` VALUES LESS THAN (2021));
給r_gl_t1表的全局索引g_r的一級分區p2增加兩個新values,新values是(30003,30004)。具體用法如下所示:
表級用法
## 基于 `表名`.`全局索引名` 進行全局索引表的分區變更操作
ALTER TABLE `r_gl_t1`.`g_l`
MODIFY PARTITION p2 ADD VALUES (30003,30004);
## 基于 `全局索引` ON TALBE `表名` 進行全局索引表的分區變更操作
ALTER INDEX `g_l`/*全局索引名*/ ON TABLE `r_gl_t1` /*表名*/
MODIFY PARTITION p2 ADD VALUES (30003,30004);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即上述兩個表同時執行分區變更。例如讓r_gl_t1表的全局索引g_l與r_gl_t2表的全局索引g_l都同時發生變更:
## 基于表組名字進行表組級的分區變更操作,假如全局索引表的表組名是tg1
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY PARTITION sp2 ADD VALUES (30003,30004);;
## 基于 `全局索引` ON TALBE `表名` 進行全局索引表的表組的分區變更操作
ALTER TABLEGROUP BY INDEX `g_l`/*全局索引名*/ ON TABLE `r_gl_t1` /*表名*/
MODIFY PARTITION p2 ADD VALUES (30003,30004);
示例2:給指定的全局索引表的指定的二級LIST分區增加Values
r_g_kl_t1是一個使用全局索引的分區表,其中全局索引使用Key+List的二級分區,建表SQL如下所示:
CREATE TABLE `r_g_kl_t1` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL,
GLOBAL INDEX `g_kl` (`a`,`b`) COVERING (`c`)
PARTITION BY KEY(`b`) PARTITIONS 2
SUBPARTITION BY LIST(`a`)
(
SUBPARTITION `sp0` VALUES IN (10000,10002,10004,10006,10008),
SUBPARTITION `sp1` VALUES IN (20000,20001,20002,20003,20004),
SUBPARTITION `sp2` VALUES IN (30000,30001,30002)
)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(PARTITION `p0` VALUES LESS THAN (2020),
PARTITION `p1` VALUES LESS THAN (2021));
CREATE TABLE `r_g_kl_t2` (
`a` bigint(20) UNSIGNED NOT NULL,
`b` bigint(20) UNSIGNED NOT NULL,
`c` datetime NOT NULL,
`d` varchar(16) NOT NULL,
`e` varchar(16) NOT NULL,
GLOBAL INDEX `g_kl` (`a`,`b`) COVERING (`c`)
PARTITION BY KEY(`b`) PARTITIONS 2
SUBPARTITION BY LIST(`a`)
(
SUBPARTITION `sp0` VALUES IN (10000,10002,10004,10006,10008),
SUBPARTITION `sp1` VALUES IN (20000,20001,20002,20003,20004),
SUBPARTITION `sp2` VALUES IN (30000,30001,30002)
)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY RANGE(YEAR(`c`))
(PARTITION `p0` VALUES LESS THAN (2020),
PARTITION `p1` VALUES LESS THAN (2021));
給r_g_kl_t1表的全局索引g_kl的二級分區模板sp2增加新的values,新的values是 (30003, 30004)。具體用法如下所示:
表級用法
## 基于 `表名`.`全局索引名` 進行全局索引表的分區變更操作
ALTER TABLE `r_g_kl_t1`.`g_kl`
MODIFY SUBPARTITION sp2 ADD VALUES (30003,30004);
## 基于 `全局索引` ON TALBE `表名` 進行全局索引表的分區變更操作
ALTER INDEX g_kl/*全局索引名*/ ON TABLE `r_g_kl_t1` /*表名*/
MODIFY SUBPARTITION sp2 ADD VALUES (30003,30004);
表組級用法
同一個表組的所有邏輯表同時進行增加分區的操作,即修改全局索引所對應的表組的分區定義。例如讓 r_g_kl_t1表的全局索引g_kl與r_g_kl_t2表的全局索引g_kl都同時發生變更:
## 基于表組名字進行表組級的分區變更操作,假如全局索引表的表組名是tg1
ALTER TABLEGROUP tg1 /*表組名*/
MODIFY SUBPARTITION sp2 ADD VALUES (30003,30004);
## 基于 INDEX `全局索引` ON TALBE `表名` 進行全局索引表的表組的分區變更操作
ALTER TABLEGROUP BY INDEX `g_kl`/*全局索引名*/ ON TABLE `r_g_kl_t1` /*表名*/
MODIFY SUBPARTITION sp2 ADD VALUES (30003,30004);