CREATE TABLE tbl1(...)PROPERTIES("dynamic_partition.prop1" = "value1","dynamic_partition.prop2" = "value2",...)
ALTER TABLE tbl1 SET("dynamic_partition.prop1" = "value1","dynamic_partition.prop2" = "value2",...)
dynamic_partition. 为前缀:dynamic_partition.enable
是否开启动态分区特性。可指定为 TRUE 或 FALSE。如果不填写,默认为 TRUE。如果为 FALSE,则 Doris 会忽略该表的动态分区规则。dynamic_partition.time_unit
动态分区调度的单位。可指定为 HOUR、DAY、WEEK、MONTH。分别表示按天、按星期、按月进行分区创建或删除。HOUR 时,动态创建的分区名后缀格式为 yyyyMMddHH,例如2020032501。小时为单位的分区列数据类型不能为 DATE。DAY 时,动态创建的分区名后缀格式为 yyyyMMdd,例如20200325。WEEK 时,动态创建的分区名后缀格式为yyyy_ww。即当前日期属于这一年的第几周,例如 2020-03-25 创建的分区名后缀为 2020_13, 表明目前为2020年第13周。MONTH 时,动态创建的分区名后缀格式为 yyyyMM,例如 202003。dynamic_partition.start
动态分区的起始偏移,为负数。根据 time_unit 属性的不同,以当天(星期/月)为基准,分区范围在此偏移之前的分区将会被删除。如果不填写,则默认为 -2147483648,即不删除历史分区。dynamic_partition.end
动态分区的结束偏移,为正数。根据 time_unit 属性的不同,以当天(星期/月)为基准,提前创建对应范围的分区。dynamic_partition.buckets
动态创建的分区所对应的分桶数量。dynamic_partition.replication_num
动态创建的分区所对应的副本数量,如果不填写,则默认为该表创建时指定的副本数量。dynamic_partition.prefix
动态创建的分区名前缀。dynamic_partition.time_zone
动态分区的时区,如果不填写,则默认为当前机器的系统的时区,例如 Asia/Shanghai,如果想获取当前支持的时区设置,可以参考 https://en.wikipedia.org/wiki/List_of_tz_database_time_zones。dynamic_partition.start_day_of_week
当 time_unit 为 WEEK 时,该参数用于指定每周的起始点。取值为 1 到 7。其中 1 表示周一,7 表示周日。默认为 1,即表示每周以周一为起始点。dynamic_partition.start_day_of_month
当 time_unit 为 MONTH 时,该参数用于指定每月的起始日期。取值为 1 到 28。其中 1 表示每月1号,28 表示每月28号。默认为 1,即表示每月以1号位起始点。暂不支持以29、30、31号为起始日,以避免因闰年或闰月带来的歧义。dynamic_partition.create_history_partitionmax_dynamic_partition_num 会限制总分区数量,以避免一次性创建过多分区。当期望创建的分区个数大于 max_dynamic_partition_num 值时,操作将被禁止。start 属性时,该参数不生效。dynamic_partition.history_partition_num
当 create_history_partition 为 true 时,该参数用于指定创建历史分区数量。默认值为 -1, 即未设置。dynamic_partition.hot_partition_num
指定最新的多少个分区为热分区。对于热分区,系统会自动设置其 storage_medium 参数为SSD,并且设置 storage_cooldown_time。
我们举例说明。假设今天是 2021-05-20,按天分区,动态分区的属性设置为:hot_partition_num=2, end=3, start=-3。则系统会自动创建以下分区,并且设置 storage_medium 和 storage_cooldown_time 参数:p20210517:["2021-05-17", "2021-05-18") storage_medium=HDD storage_cooldown_time=9999-12-31 23:59:59p20210518:["2021-05-18", "2021-05-19") storage_medium=HDD storage_cooldown_time=9999-12-31 23:59:59p20210519:["2021-05-19", "2021-05-20") storage_medium=SSD storage_cooldown_time=2021-05-21 00:00:00p20210520:["2021-05-20", "2021-05-21") storage_medium=SSD storage_cooldown_time=2021-05-22 00:00:00p20210521:["2021-05-21", "2021-05-22") storage_medium=SSD storage_cooldown_time=2021-05-23 00:00:00p20210522:["2021-05-22", "2021-05-23") storage_medium=SSD storage_cooldown_time=2021-05-24 00:00:00p20210523:["2021-05-23", "2021-05-24") storage_medium=SSD storage_cooldown_time=2021-05-25 00:00:00
dynamic_partition.reserved_history_periods
需要保留的历史分区的时间范围。当dynamic_partition.time_unit 设置为 "DAY/WEEK/MONTH" 时,需要以 [yyyy-MM-dd,yyyy-MM-dd],[...,...] 格式进行设置。当dynamic_partition.time_unit 设置为 "HOUR" 时,需要以 [yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss],[...,...] 的格式来进行设置。如果不设置,默认为 "NULL"。
我们举例说明。假设今天是 2021-09-06,按天分类,动态分区的属性设置为:time_unit="DAY/WEEK/MONTH", end=3, start=-3, reserved_history_periods="[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]"
["2020-06-01","2020-06-20"],["2020-10-31","2020-11-15"]
time_unit="HOUR", end=3, start=-3, reserved_history_periods="[2020-06-01 00:00:00,2020-06-01 03:00:00]"
["2020-06-01 00:00:00","2020-06-01 03:00:00"]
reserved_history_periods 的每一个 [...,...] 是一对设置项,两者需要同时被设置,且第一个时间不能大于第二个时间。create_history_partition 为 true,即开启创建历史分区功能时,Doris 会根据 dynamic_partition.start 和 dynamic_partition.history_partition_num 来决定创建历史分区的个数。
假设需要创建的历史分区数量为 expect_create_partition_num,根据不同的设置具体数量如下:create_history_partition = truedynamic_partition.history_partition_num 未设置,即 -1。
expect_create_partition_num = end - start;dynamic_partition.history_partition_num 已设置。
expect_create_partition_num = end - max( start, -history_partition_num)。create_history_partition = false不会创建历史分区,expect_create_partition_num = end - 0;当 expect_create_partition_num 大于 max_dynamic_partition_num(默认500)时,禁止创建过多分区。create_history_partition=true, end=3, start=-3, history_partition_num=1,则系统会自动创建以下分区:p20210519p20210520p20210521p20210522p20210523
history_partition_num=5,其余属性与 1 中保持一致,则系统会自动创建以下分区:p20210517p20210518p20210519p20210520p20210521p20210522p20210523
history_partition_num=-1 即不设置历史分区数量,其余属性与 1 中保持一致,则系统会自动创建以下分区:p20210517p20210518p20210519p20210520p20210521p20210522p20210523
dynamic_partition.start 和 dynamic_partition.end 之间的某些分区丢失,那么当前时间与 dynamic_partition.end 之间的丢失分区会被重新创建,dynamic_partition.start与当前时间之间的丢失分区不会重新创建。CREATE TABLE tbl1(k1 DATE,...)PARTITION BY RANGE(k1) ()DISTRIBUTED BY HASH(k1)PROPERTIES("dynamic_partition.enable" = "true","dynamic_partition.time_unit" = "DAY","dynamic_partition.start" = "-7","dynamic_partition.end" = "3","dynamic_partition.prefix" = "p","dynamic_partition.buckets" = "32");
p20200529: ["2020-05-29", "2020-05-30")p20200530: ["2020-05-30", "2020-05-31")p20200531: ["2020-05-31", "2020-06-01")p20200601: ["2020-06-01", "2020-06-02")
p20200602: ["2020-06-02", "2020-06-03")
在 2020-06-06 时,因为 dynamic_partition.start 设置为 7,则将删除7天前的分区,即删除分区 p20200529。CREATE TABLE tbl1(k1 DATETIME,...)PARTITION BY RANGE(k1) ()DISTRIBUTED BY HASH(k1)PROPERTIES("dynamic_partition.enable" = "true","dynamic_partition.time_unit" = "WEEK","dynamic_partition.start" = "-2","dynamic_partition.end" = "2","dynamic_partition.prefix" = "p","dynamic_partition.buckets" = "8");
p2020_22: ["2020-05-25 00:00:00", "2020-06-01 00:00:00")p2020_23: ["2020-06-01 00:00:00", "2020-06-08 00:00:00")p2020_24: ["2020-06-08 00:00:00", "2020-06-15 00:00:00")
p2020_22。
在上面的例子中,假设用户指定了周起始日为 "dynamic_partition.start_day_of_week" = "3",即以每周三为起始日。则分区如下:p2020_22: ["2020-05-27 00:00:00", "2020-06-03 00:00:00")p2020_23: ["2020-06-03 00:00:00", "2020-06-10 00:00:00")p2020_24: ["2020-06-10 00:00:00", "2020-06-17 00:00:00")
p2019_53,如果分区的起始日期为 2020-01-01,则分区名为 p2020_01。CREATE TABLE tbl1(k1 DATE,...)PARTITION BY RANGE(k1) ()DISTRIBUTED BY HASH(k1)PROPERTIES("dynamic_partition.enable" = "true","dynamic_partition.time_unit" = "MONTH","dynamic_partition.end" = "2","dynamic_partition.prefix" = "p","dynamic_partition.buckets" = "8","dynamic_partition.start_day_of_month" = "3");
p202005: ["2020-05-03", "2020-06-03")p202006: ["2020-06-03", "2020-07-03")p202007: ["2020-07-03", "2020-08-03")
dynamic_partition.start,则不会删除历史分区。
假设今天为 2020-05-20,并设置以每月28号为起始日,则分区范围为:p202004: ["2020-04-28", "2020-05-28")p202005: ["2020-05-28", "2020-06-28")p202006: ["2020-06-28", "2020-07-28")
ALTER TABLE tbl1 SET("dynamic_partition.prop1" = "value1",...);
p20200519: ["2020-05-19", "2020-05-20")p20200520: ["2020-05-20", "2020-05-21")p20200521: ["2020-05-21", "2020-05-22")
["2020-05-01", "2020-06-01") 的分区,而该分区的分区范围和已有分区冲突,所以无法创建。而范围为 ["2020-06-01", "2020-07-01") 的分区可以正常创建。因此,2020-05-22 到 2020-05-30 时间段的分区,需要自行填补。mysql> SHOW DYNAMIC PARTITION TABLES;+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+| TableName | Enable | TimeUnit | Start | End | Prefix | Buckets | StartOf | LastUpdateTime | LastSchedulerTime | State | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods |+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+| d3 | true | WEEK | -3 | 3 | p | 1 | MONDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | [2021-12-01,2021-12-31] || d5 | true | DAY | -7 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL || d4 | true | WEEK | -3 | 3 | p | 1 | WEDNESDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL || d6 | true | MONTH | -2147483648 | 2 | p | 8 | 3rd | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL || d2 | true | DAY | -3 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL || d7 | true | MONTH | -2147483648 | 5 | p | 8 | 24th | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+7 rows in set (0.02 sec)
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true")
HTTP 协议:
curl --location-trusted -u username:password -XGET http://fe_host:fe_http_port/api/_set_config?dynamic_partition_enable=true
若要全局关闭动态分区,则设置此参数为 false 即可。ADMIN SET FRONTEND CONFIG ("dynamic_partition_check_interval_seconds" = "7200")
HTTP 协议:
curl --location-trusted -u username:password -XGET http://fe_host:fe_http_port/api/_set_config?dynamic_partition_check_interval_seconds=432000ALTER TABLE 在运行时修改动态分区相关属性来转化为动态分区,具体示例可以通过 HELP ALTER TABLE 查看。
开启动态分区功能后,Doris 将不再允许用户手动管理分区,会根据动态分区属性来自动管理分区。dynamic_partition.start,分区范围在动态分区起始偏移之前的历史分区将会被删除。ALTER TABLE tbl_name SET ("dynamic_partition.enable" = "false") 即可关闭动态分区功能,将其转换为手动分区表。
关闭动态分区功能后,Doris 将不再自动管理分区,需要用户手动通过 ALTER TABLE 的方式创建或删除分区。Could not create table with dynamic partition when fe config dynamic_partition_enable is false。
由于动态分区的总开关,也就是 FE 的配置 dynamic_partition_enable 为 false,导致无法创建动态分区表。
这时候请修改 FE 的配置文件,增加一行 dynamic_partition_enable=true,并重启 FE。或者执行命令 ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true") 将动态分区开关打开即可。文档反馈