引言
IoTDB 支持在设备(device)级别设置数据保留时间(TTL),系统会根据设定的 TTL 自动清理过期数据,从而有效管理存储空间并确保查询性能。TTL 默认采用毫秒计时,数据过期后将不可查询且禁止写入,但实际物理删除会在数据压缩时完成。需要注意:修改 TTL 设置可能导致数据可见性短暂波动,若缩短或取消 TTL 设置,原先因 TTL 限制而不可见的数据可能会重新显示。
TTL 设置为毫秒,不受配置文件时间精度影响 TTL 变更可能影响数据的可查询性 系统最终会移除过期数据,但存在延迟 TTL 判断数据是否过期依据的是数据点时间,非写入时间 系统最多支持设置 1000 条 TTL 规则,达到上限需先删除部分规则才能设置新规则
一、TTL 路径规则与优先级
1.1 路径规则
设置的路径 path 只支持前缀路径(即路径中间不能带 * ,且必须以 ** 结尾),该路径会匹配到设备,也允许用户指定不带星的 path 为具体的 database 或 device,当 path 不带 * 时,会检查是否匹配到 database,若匹配到 database,则会同时设置 path 和 path.**。 注意:设备 TTL 设置不会对元数据的存在性进行校验,即允许对一条不存在的设备设置 TTL。
合格的 path:root.** root.db.** root.db.group1.** root.db root.db.group1.d1 不合格的 path:root..db root.**.db. root.db.*
1.2 智能路径扩展与优先级
当一个设备适用多条 TTL 规则时,优先适用较精确和较长的规则。例如对于设备'root.bj.hd.dist001.turbine001'来说,规则'root.bj.hd.dist001.turbine001'比'root.bj.hd.dist001.'优先,而规则'root.bj.hd.dist001.'比'root.bj.hd.**'优先。
为兼容历史版本,IoTDB 实现智能路径扩展机制。当用户输入 SET TTL TO root.sg 360000 时,系统自动转换。
SET TTL TO root.sg.** 360000;
系统对路径合法性进行严格校验,以下为合法路径示例:
root.** root.db.** root.db.group1.** root.db.group1.d1
非法路径示例:
root.*.db -路径中间包含非法星号
root.**.db -路径结尾前存在星号
root.db.*-路径结尾星号前无字符
规则数量也有限制,IoTDB 系统最多支持 1000 条 TTL 规则。当达到数量上限的时候,需要先删除部分规则才能设置新规则。需要限制确保系统性能不受过量规则影响。
二、TTL 设置操作
set ttl 操作可以理解为设置一条 TTL 规则,比如 set ttl to root.sg.group1.** 就相当于对所有可以匹配到该路径模式的设备挂载 ttl。unset ttl 操作表示对相应路径模式卸载 TTL,若不存在对应 TTL,则不做任何事。若想把 TTL 调成无限大,则可以使用 INF 关键字。
语法
设置 TTL 的标准语法:
SET TTL TO<pathPattern><ttlValue>;
示例:
set ttl to pathPattern 360000;
pathPattern 是前缀路径,即路径中间不能带 * 且必须以 ** 结尾。pathPattern 匹配对应的设备。为了兼容老版本 SQL 语法,允许用户输入的 pathPattern 匹配到 db,则自动将前缀路径扩展为 path.。
例如,写 set ttl to root.sg 360000 则会自动转化为 set ttl to root.sg.** 360000,转化后的语句对所有 root.sg 下的 device 设置 TTL。
但若写的 pathPattern 无法匹配到 db,则上述逻辑不会生效。如写 set ttl to root.sg.group 360000,由于 root.sg.group 未匹配到 db,则不会被扩充为 root.sg.group.。也允许指定具体 device,不带 *
三、取消 TTL 操作
3.1 语法
取消 TTL 的标准语法:
unset ttl from root.**
示例:
unset ttl from root.ln
取消设置 TTL 后,root.ln 路径下所有的数据都会被保存。
unset ttl from root.sgcc.**
取消设置 root.sgcc 路径下的所有的 TTL。
unset ttl from root.**
3.2 批量取消
IoTDB 是支持批量取消 TTL。
取消整个存储组:
UNSET TTL FROM root.bj.**;
取消多级分组 TTL:
UNSET TTL FROM root.sg.group1.**;
四、显示 TTL 信息
显示 TTL 的 SQL 语句如下
显示所有的 TTL:
SHOW ALL TTL;
示例:
+--------------+--------+
| path | TTL |
+--------------+--------+
| root.** | 55555555|
| root.sg2.a.**| 44440000|
+--------------+--------+
显示指定路径 TTL:
SHOW TTL ON root.db.**;
示例:
+--------------+--------+
| path | TTL |
+--------------+--------+
| root.db.** | 55555555|
| root.db.a.** | 44440000|
+--------------+--------+
显示设备的 TTL:
show devices
示例:
+---------------+---------+---------+
| Device | IsAligned| TTL |
+---------------+---------+---------+
| root.sg.device1| false | 36000000|
| root.sg.device2| true | INF |
+---------------+---------+---------+
显示表级 TTL:
SHOW TABLES DETAILS;
示例:
+---------+-------+----------+
| TableName| TTL(ms)| Status |
+---------+-------+----------+
| bean | 300 | PRE_CREATE|
| grass | 1000 | USING |
| bamboo | 300 | USING |
| flower | INF | USING |
+---------+-------+----------+
IoTDB 数据库 TTL 显示结果包含路径、TTL 值和状态信息。INF 表示无限 TTL,数字表示具体毫秒数。
五、总结
Apache IoTDB 的 TTL 机制通过智能化的数据生命周期管理,帮助企业实现存储成本与查询性能的平衡。本文从路径规则、适用规则到操作实践,全面解析了 IoTDB 的 TTL 管理机制,帮助构建高效可靠的数据保留时间管理体系。


