key, op, values 字段的 JSON 组成,如下所示:{"key": "key1", "op": "op1", "values": ["value1","value2"]}
key | op | values |
region | "in", "notIn", "exists", "notExists" | 地域列表,如 ["guangzhou"] |
zone | "in", "notIn", "exists", "notExists" | 可用区列表,如 ["guangzhou-1"] |
rack | "in", "notIn", "exists", "notExists" | 机架列表,如 ["rack-1","rack-2"] |
host | "in", "notIn", "exists", "notExists" | 主机列表,如 ["host-1","host-2","host-3"] |
node | "in", "notIn" | 节点列表,如 ["node-tdsql3-xxx-001"] |
replica-count | "=" | 副本数量,如 ["3"] |
follower-count | "=" | RG follower 数量,如 ["2"] |
learner-count | "=" | RG learner 数量,如 ["1"] |
witness-count | "=" | RG witness 数量,如 ["1"] |
leader-preferences | "=" | RG leader 偏好,用法参考说明2 |
fault-tolerance-level | "=" | 容灾级别,如 ["zone"] |
tdsql-storage-type | "in", "notIn", "exists", "notExists" | 磁盘类型列表,如 ["CLOUD_TCS","CLOUD_BSSD"] |
key、op 字段对应关系如下:规则字段 | 对应 SQL 关键字 |
region | REGION |
zone | ZONE |
rack | RACK |
host | HOST |
node | NODE |
replica-count | REPLICA_COUNT |
follower-count | FOLLOWER_COUNT |
learner-count | LEARNER_COUNT |
witness-count | WITNESS_COUNT |
leader-preferences | LEADER_PREFERENCES |
fault-tolerance-level | FAULT_TOLERANCE_LEVEL |
tdsql-storage-type | STORAGE_TYPE |
in / notIn / exists / notExists | IN / NOT IN / EXISTS / NOT EXISTS |
distribution-policy-enabled 自 v18.0.0 起默认开启,一般无需手动设置。如果您需要关闭该功能,请联系腾讯云技术支持处理。CREATE DISTRIBUTION POLICY 语句创建 DP,一条 DP 可包含多条规则,多条规则之间使用 AND 连接:CREATE DISTRIBUTION POLICY "$policy_name" SET $key1 $op1 ($value1, $value2, ...) AND $key2 $op2 (...) ...;
policy_name,并通过 SET 子句设置一条或多条 DP 规则,各规则对应的 SQL 关键字请参见前文关键字对照表。ALTER DISTRIBUTION POLICY 语句修改 DP 的规则,使用 RENAME DISTRIBUTION POLICY 语句修改 DP 的名称:# 修改名称为 policy_1 的 DP 规则ALTER DISTRIBUTION POLICY "policy_1" SET $key $op (...);# 将 DP old_dp_name 的名称修改为 new_dp_nameRENAME DISTRIBUTION POLICY "old_dp_name" TO "new_dp_name";
DROP DISTRIBUTION POLICY 语句删除 DP:DROP DISTRIBUTION POLICY "$policy_name";
# 查看已创建的所有 DPSELECT * FROM information_schema.META_CLUSTER_DPS;# 按名称查看指定 DPSELECT * FROM information_schema.META_CLUSTER_DPS WHERE distribution_policy_name = '$policy_name';
CREATE DATABASE db1 USING distribution policy ${policy_name};
CREATE TABLE t1(a INT) USING distribution policy ${policy_name};
CREATE TABLE t1(a INT) PARTITION BY HASH(a) PARTITIONS 4 USING distribution policy ${policy_name};
CREATE DISTRIBUTION POLICY "policy_1" SET REPLICA_COUNT = 5;
CREATE DISTRIBUTION POLICY "policy_2" SET REPLICA_COUNT = 4 AND LEARNER_COUNT = 1;
CREATE DISTRIBUTION POLICY "policy_3" SET NODE IN ("node-001", "node-002", "node-003") ANDLEADER_PREFERENCES = (NODE IN ("node-001"));
CREATE DISTRIBUTION POLICY "policy_4" SET STORAGE_TYPE IN ("SSD");
CREATE DISTRIBUTION POLICY "policy_x" SET PARTITION_METHOD = "RANGE" ANDPARTITION_KEY_TO_TIME_TYPE = "predefined:TO_DAYS" ANDEXPIRE = "1 YEAR" ANDSTART_TIME = "2024-06-11 00:11:22" ANDEND_TIME = "2025-06-11 00:11:22" ANDSTORAGE_TYPE IN ("HDD");
PARTITION_METHOD:表示 DP 支持的分区表所对应的分区方式,目前仅支持 RANGE 和 RANGE COLUMNS。PARTITION_KEY_TO_TIME_TYPE:仅在 RANGE 分区方式时需要指定,用来将分区边界值转换为时间类型。该 key 对应的 values 是转换函数,系统提供了三个预定义的转换函数,即 TO_DAYS, UNIX_TIMESTAMP 和 YEAR。用户也可自定义转换函数,自定义函数需要给出年月日时分秒的计算公式,遵从的格式为:year/month/day/hour/minute/second:(含有标识符 v 的数学公式),其中 v 是标识符,表示的是分区边界的整型值。如将 values 设置为 ["year:v/100", "month:v%100"],省略的 day/hour/minute/second 则按照对应时间单位的零值处理。EXPIRE:分区过期时间,正整数 + 单位的格式,如 1 YEAR 。可用单位有:YEAR, MONTH, DAY, HOUR。START_TIME:非必选项,默认为分区的起始,如指定这一项,则表示从这个时间之后开始应用 DP 规则。END_TIME:非必选项,默认为分区的结束,如指定这一项,则表示从这个时间之后拒绝应用 DP 规则。# 使用预定义函数 UNIX_TIMESTAMP 创建 policy_x1CREATE DISTRIBUTION POLICY "policy_x1" SET PARTITION_METHOD = "RANGE" ANDPARTITION_KEY_TO_TIME_TYPE = ("predefined:UNIX_TIMESTAMP") ANDEXPIRE = "1 MONTH" ANDSTORAGE_TYPE IN ("HDD");# 创建 RANGE 分区表并绑定 policy_x1CREATE TABLE t_order_1(id bigint NOT NULL,gmt_modified timestamp NOT NULL)PARTITION BY RANGE(unix_timestamp(gmt_modified))(PARTITION p1 VALUES LESS THAN(unix_timestamp('2025-11-11')),PARTITION p2 VALUES LESS THAN(unix_timestamp('2025-12-11'))) USING DISTRIBUTION POLICY policy_x1;
# 使用自定义函数创建 policy_x2CREATE DISTRIBUTION POLICY "policy_x2" SET PARTITION_METHOD = "RANGE" ANDPARTITION_KEY_TO_TIME_TYPE = ("year:v/100", "month:v%100") ANDEXPIRE = "1 MONTH" ANDLEADER_PREFERENCES = (ZONE in ("zone1")) ANDSTART_TIME = "2025-12-10 00:00:00";# 创建 RANGE 分区表并绑定 policy_x2CREATE TABLE t_order_2(id bigint NOT NULL,gmt_modified datetime NOT NULL)PARTITION BY RANGE(YEAR(gmt_modified) * 100 + MONTH(gmt_modified))(PARTITION p1 VALUES LESS THAN(202511),PARTITION p2 VALUES LESS THAN(202512),PARTITION p3 VALUES LESS THAN(202601)) USING DISTRIBUTION POLICY policy_x2;
自定义函数: year:v/100, month:v%100分区边界值 v = YEAR(gmt_modified) * 100 + MONTH(gmt_modified)示例计算:- p1: v=202511 → year=202511/100=2025, month=202511%100=11- p2: v=202512 → year=202512/100=2025, month=202512%100=12- p3: v=202601 → year=202601/100=2026, month=202601%100=1
分区 | 边界值 | 转换后时间 | 调度触发时间 | 是否受约束 |
p1 | 202511 | 2025-11-01 00:00:00 | 2025-12-01 00:00:00 | 不受约束 |
p2 | 202512 | 2025-12-01 00:00:00 | 2026-01-01 00:00:00 | 不受约束 |
p3 | 202601 | 2026-01-01 00:00:00 | 2026-02-01 00:00:00 | 受约束 |
# 创建 policy_x3CREATE DISTRIBUTION POLICY "policy_x3" SET PARTITION_METHOD = "RANGE COLUMNS" ANDEXPIRE = "1 YEAR" ANDNODE NOT IN ("node-tdsql3-x-001") ANDSTART_TIME = "2025-12-10 00:00:00" ANDEND_TIME = "2026-12-10 00:00:00";# 创建 RANGE COLUMNS 分区表并绑定 policy_x3CREATE TABLE t_order_3(id bigint NOT NULL,gmt_modified datetime NOT NULL)PARTITION BY RANGE COLUMNS(gmt_modified)(PARTITION p1 VALUES LESS THAN("2024-12-10 00:00:00"),PARTITION p2 VALUES LESS THAN("2025-12-10 00:00:00"),PARTITION p3 VALUES LESS THAN("2026-12-10 00:00:00"),PARTITION p4 VALUES LESS THAN("2027-12-10 00:00:00")) USING DISTRIBUTION POLICY policy_x3;
分区 | 边界时间 | 调度触发时间 | 是否在时间窗口内 |
p1 | 2024-12-10 | 2025-12-10 | 早于 START_TIME |
p2 | 2025-12-10 | 2026-12-10 | 在 [START_TIME, END_TIME] 内 |
p3 | 2026-12-10 | 2027-12-10 | 在 [START_TIME, END_TIME] 内 |
p4 | 2027-12-10 | 2028-12-10 | 晚于 END_TIME |
文档反馈