
TDengine 3.3.8.1 版本说明RSMA 可修改能力与 11 项关键修复深度解析【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine本指南以 TDengine 3.3.8.1 版本说明发布于 2025-10-11为骨架逐一解读该版本新增的「支持修改 RSMA」能力并对 11 项修复按「查询正确性、流计算、数据同步、可观测性、稳定性、数据订阅」等维度归类展开。文章结合当前仓库中的 SQL 语法定义如 sql.y、管理节点实现如 mndRsma.c与官方功能文档如 降采样存储、性能数据视图帮助读者理解每个修复背后的技术背景、涉及模块与升级后的行为变化从而评估 3.3.8.1 对自身业务的价值并完成平滑升级。一、版本概览3.3.8.1 的定位与核心变化3.3.8.1 是 TDengine 3.3.8 系列的一个维护性版本发布时间为2025-10-11。整个版本包含1 项功能优化与11 项问题修复覆盖了降采样存储RSMA、流计算、数据订阅、多级存储迁移、WebSocket/STMT 协议、性能观测视图等多个子系统。其中唯一的功能优化——「支持修改 RSMA」——是本次版本的最大亮点。它补齐了 RSMARollup Small Materialized Aggregation降采样存储在创建CREATE RSMA、删除DROP RSMA之外缺失的「修改」能力使降采样聚合定义可以在线演进例如超级表新增列之后为该列补充聚合函数无需删除重建。RSMA 功能自v3.3.8.0起在 TDengine 企业版提供本版本属于该功能的快速迭代完善。其余 11 项修复均聚焦于正确性与稳定性其中「同时对时间戳列执行 first 和 last 返回结果错误」「流计算定时触发时 taosd 重启后首个窗口结果错误」「大量写入查询时落盘线程可能死锁」等问题都属于生产环境中容易触发且排查成本较高的疑难问题建议相关业务用户优先升级。二、核心优化支持修改 RSMAALTER RSMA1. RSMA 是什么在深入理解本次优化之前先明确 RSMA 的定位。RSMARollup SMASmall Materialized Aggregation是 TDengine 企业版提供的数据降采样存储功能按时间窗口对用户数据做降采样downsampling并存储适用于「原始数据保存时长较短、降采样数据保存时长较长」的场景。降采样数据体积远小于原始数据可减少磁盘占用查询时可直接扫描降采样数据响应更快。完整说明参见 降采样存储。其基本逻辑如下自动触发数据由低存储层级向高存储层级level 1 → 2 → 3迁移时自动完成降采样存储由数据库KEEPkeep0/keep1/keep2控制多级存储说明参见 多级存储。手动触发适用于「降采样数据更新或删除后需要重算」「已迁移至目标存储层级但尚未降采样」等场景。RSMA不影响查询语义本身查询时间范围跨越多个存储层级时结果中可能同时包含原始数据与降采样数据。2. ALTER RSMA 的语法与语义3.3.8.1 新增的修改能力对应 SQL 语法如下ALTER RSMA [IF EXISTS] [db_name.]rsma_name FUNCTION ([func_name(col_name)[, ...]]);其用途是修改列的聚合函数主要用于新增列场景。约束与注意事项包括只允许修改此前未显式指定函数的列即默认聚合为LAST的列未指定函数的列默认聚合为LAST修改可能导致前后聚合语义不一致操作前请确认业务需求修改后的函数列表会与原有显式函数合并下文源码分析会说明合并规则同一列不允许重复指定函数。为便于对照这里给出 RSMA 的完整 SQL 命令族均来自 降采样存储命令语法说明创建CREATE RSMA [IF NOT EXISTS] rsma_name ON [dbname.]table_name FUNCTION([func_name(col_name)[, ...]]) INTERVAL(interval1[, interval2]);只能基于超级表创建列含BLOB/MEDIUMBLOB时暂不支持修改ALTER RSMA [IF EXISTS] [db_name.]rsma_name FUNCTION ([func_name(col_name)[, ...]]);本版本新增用于为新增列补充聚合函数删除DROP RSMA [IF EXISTS] [db_name.]rsma_name;删除后重建可能造成聚合函数前后不一致显示创建语句SHOW CREATE RSMA [db_name.]rsma_name;可查看完整可复现的创建语句显示全部SHOW [db_name.]RSMAS;/SELECT * FROM information_schema.ins_rsmas [WHERE db_name {db_name}];func_list只显示显式指定的函数手动计算ROLLUP DATABASE db_name [start_opt] [end_opt]/ROLLUP [db_name] VGROUPS IN (vgroup_ids) [start_opt] [end_opt]可带START WITH/END WITH时间范围显示任务SHOW RETENTIONS;/SHOW RETENTION {retention_id};查看 rollup 任务的进度与剩余时间中止任务KILL RETENTION {retention_id};中止指定的 rollup 任务例如查看某个 RSMA 的创建语句taos SHOW CREATE RSMA rsma7\G; *************************** 1.row *************************** RSMA: rsma7 Create RSMA: CREATE RSMA rsma7 ON d0.stb1 FUNCTION(min(c0),max(c1),avg(c2),sum(c3),first(c4),last(c5),first(c6)) INTERVAL(60000a,300000a) Query OK, 1 row(s) in set (0.005250s)3. 源码视角ALTER RSMA 的实现链路从当前仓库源码可以看到ALTER RSMA从语法解析到元数据落库、再到下发各 vnode 的完整链路语法解析在 sql.y 中定义了文法规则cmd :: ALTER RSMA exists_opt(B) full_rsma_name(C) rsma_func_list(D)并调用createAlterRsmaStmt生成语法树节点QUERY_NODE_ALTER_RSMA_STMTrsma_func_list支持FUNCTION(...)形式见 sql.y。权限校验ALTER RSMA需要PRIV_CM_ALTERPRIV_OBJ_RSMA权限见 tpriv.c对应角色T_ROLE_SYSDBA。管理节点在处理请求时会执行mndCheckObjPrivilegeRecF(pMnode, pUser, PRIV_CM_ALTER, PRIV_OBJ_RSMA, ...)见 mndRsma.c。消息类型ALTER RSMA在元数据节点与 vnode 之间通过TDMT_MND_ALTER_RSMA、TDMT_VND_ALTER_RSMA消息号 577见 msgTypeTable.ini等消息传递注册与分发见 mmHandle.c 与 vmHandle.c。核心合并逻辑在 mndRsma.c 的mndAlterRsma函数中当pAlter-alterType TSDB_ALTER_RSMA_FUNCTION时会将旧的函数列表与ALTER 新指定的函数列表按列号funcColIds做有序合并同一列只允许出现一次若旧列表与新列表在相同列号上都有函数则报TSDB_CODE_MND_RSMA_FUNC_CONFLICT函数冲突。这与文档「只允许修改此前未显式指定函数的列」的限制完全对应——因为未显式指定的列默认使用LAST新指定后即按新函数聚合而显式指定的列再指定就会冲突。事务与下发修改操作通过 mnode 事务mndTransCreate冲突策略TRN_CONFLICT_DB_INSIDE执行先写 prepare/commit 日志再通过 redo action 将TDMT_VND_ALTER_RSMA请求下发到数据库内所有 vgroup 对应的 vnode见 mndRsma.cvnode 侧在 metaTable2.c 按alterType处理并持久化。审计当tsAuditLevel AUDIT_LEVEL_DATABASE时会记录alterRsma审计日志包含 RSMA 名称、表全名与alterType见 mndRsma.c。值得注意的是源码中mndAlterRsma目前仅实现TSDB_ALTER_RSMA_FUNCTION一种修改类型其他类型会返回TSDB_CODE_OPS_NOT_SUPPORT操作不支持说明 3.3.8.1 的「修改 RSMA」范围聚焦在聚合函数列表的调整上。4. 实战建议在超级表新增普通列后若希望该列也参与降采样聚合无需删除 RSMA 重建直接执行ALTER RSMA [db_name.]rsma_name FUNCTION (func_name(new_col));即可。由于「删除后再重建有可能造成聚合函数前后不一致」见 降采样存储本版本的ALTER能力提供了更安全的演进路径。修改聚合函数后若需要让降采样数据按新函数重算可配合手动ROLLUP DATABASE db_name [START WITH ...] [END WITH ...]触发重算并用SHOW RETENTIONS/SHOW RETENTION {id}观察任务进度。三、查询正确性修复1. 同时对时间戳列执行 first 和 last 返回结果错误FIRST(expr)与LAST(expr)分别是统计表/超级表中某列值「最先写入」与「最后写入」的非 NULL 值见 函数参考 中FIRST/LAST章节。例如SELECT FIRST(ts), LAST(ts) FROM stable1;本版本修复了「同一查询中同时对时间戳列执行first和last时返回结果错误」的问题。时间戳列作为主键列其取首尾值的路径与其他普通列不同涉及扫描方向上对首行/尾行的判定当两个函数同时出现在一个查询计划中时旧版本存在结果串扰或取值错误的缺陷。修复后二者可以安全地组合使用。相关函数定义与使用说明可参见 函数参考其中的注意事项如全部为 NULL 时返回空、复合主键场景按主键最小/最大取值在修复后依然适用。2. 流计算count window 指定 DELETE_RECALC 选项后未报错处理DELETE_RECALC是流计算触发选项之一v3.3.7.0起支持见 关键字列表语义是当历史窗口内的数据被删除时触发重算。在语法层面其解析规则为trigger_option(A) :: DELETE_RECALC见 sql.y对应的枚举为STREAM_TRIGGER_OPTION_DELETE_RECALC见 parAst.h重复指定该选项时还会报错「DELETE_RECALC specified multiple times」见 parAstCreater.c。本版本修复的问题是当流计算使用count window计数窗口COUNT_WINDOW并指定DELETE_RECALC时旧版本未做错误处理。计数窗口按行数划分窗口COUNT_WINDOW(count_val[, sliding_val][, col_name ...])count_val 范围为 [2, 2147483647]详见 查询参考 与 特色查询其窗口边界由行数而非时间决定删除数据后窗口的重算语义难以精确定义因此对这类不受支持/语义不合法的组合新版本会明确报错处理避免静默产生错误结果。3. 流计算定时触发时 taosd 重启后第一个窗口结果错误这是流计算场景下典型的「重启一致性」问题。流计算若使用定时触发模式interval 窗口按固定时间触发taosd 重启后需要从持久化状态恢复各窗口的计算进度。旧版本在恢复后首个窗口的计算结果可能出错例如窗口起点/结束点计算偏差、恢复的触发游标不正确。本次修复确保了重启后首个窗口仍按正确的窗口边界计算结果。流计算的窗口类型包括INTERVAL、SESSION、STATE_WINDOW、EVENT_WINDOW、COUNT_WINDOW等见 特色查询涉及任务状态持久化与恢复链路建议配置了定时触发流任务的用户升级后对首个窗口结果做一次核对。四、数据同步与精度修复1. taosX 同步 decimal 数据时丢失精度decimal是 TDengine 的定点高精度数值类型。本次修复解决了 taosX数据同步工具在同步 decimal 数据时丢失精度的问题。decimal 的精度损失通常源于不同数据库/驱动对 decimal 的 scale小数位数处理不一致、中间表示如字符串与二进制转换截断、或客户端与服务端定义精度不匹配。修复后taosX 同步 decimal 数据将按定义保留完整的有效位数。使用 taosX 做跨库同步、且涉及 decimal 类型列的业务建议升级后针对 decimal 列做逐值比对验证。2. 订阅带 tag 筛选条件的 topic 时标签过滤未生效数据订阅tmq允许消费者订阅带 tag 筛选条件的 topic。本版本修复了「订阅带 tag 筛选条件的 topic 时标签过滤未生效」的问题——旧版本中消费者通过CREATE TOPIC ... WHERE tag_condition之类的方式筛选标签消费时可能拉到不符合 tag 条件的行修复后标签过滤条件在数据分发阶段正确生效。数据订阅相关能力参见 数据订阅 文档目录。五、可观测性与显示修复1. perf_connections 中 end_point 信息不正确PERF_CONNECTIONS是内置数据库PERFORMANCE_SCHEMA中提供当前数据库连接信息的性能视图对应字段如下完整表结构见 性能数据视图#列名数据类型说明1conn_idUINT连接 ID2userBINARY(24)用户名关键字列查询需反引号转义3appBINARY(24)客户端名称4pidUINT客户端进程号5end_pointBINARY(134)客户端地址6login_timeTIMESTAMP登录时间7last_accessTIMESTAMP最后更新时间............13tokenBINARY(32)令牌名称若使用令牌登录本次修复让end_point客户端地址字段能够正确显示。PERF_CONNECTIONS也可通过SHOW CONNECTIONS查询运维人员在排查连接来源、定位异常客户端时依赖该字段修复后地址信息将准确可靠。2. Windows 平台上 show local variables like timezone 显示错误SHOW LOCAL VARIABLES LIKE timezone用于查看当前会话/本地的时区设置。本次修复解决了 Windows 平台上该查询结果显示错误的问题——时区信息的获取在 Windows 与 Linux 上依赖不同的系统接口Windows 上通常通过GetTimeZoneInformation等 API旧版本在 Windows 上获取或格式化时区字符串存在偏差。修复后跨平台查询timezone的结果将保持一致。3. Explorer 拼写错误本次修复还包含 ExplorerTDengine 的可视化管理/监控组件界面或代码中的一处拼写错误。该类修复不涉及核心逻辑但对界面文案的规范性与可读性有直接改善。六、稳定性与可用性修复1. move_to 跨挂载点移动的报错move_to相关功能用于将 vnode 数据迁移到指定挂载点mount point是多级存储/存储空间管理的重要操作。本次修复解决了「move_to 跨挂载点移动」时报错的问题——数据文件的迁移在跨挂载点场景下涉及文件句柄、目录结构与底层文件系统的重新绑定旧版本在此路径上存在错误处理不完善的情况。修复后跨挂载点的数据迁移可正常完成。相关挂载点管理逻辑见 vmInt.c其中维护了mountTfsHash挂载点与 tfs 的映射关系。2. 使用 STMT 时 WebSocket 重连过程中发生的崩溃STMTprepared statement预编译语句通过 WebSocket 连接使用时若连接在语句执行过程中断开并触发重连旧版本存在崩溃风险。该问题通常发生在网络抖动频繁的生产环境连接断开 → 客户端重连 → 语句句柄状态与新的连接状态不一致导致服务端或客户端访问非法内存。本次修复后STMT 在 WebSocket 重连场景下可安全恢复。建议大量使用 WebSocket STMT 写入/查询的业务升级验证。3. 大量写入查询时落盘线程可能死锁这是本次版本中影响面较广的稳定性修复之一。在高并发「大量写入 查询」混合负载下落盘flush线程与查询线程可能在锁资源上形成互相等待死锁导致落盘任务停滞、写入/查询延迟上升甚至 hang 住。从执行器源码看查询算子对元数据读锁如META_READER_LOCK的使用有严格的「不得重入、不得跨 RPC 持锁」约束见 sysscanoperator.c 中多处关于避免自死锁与跨 vnode 死锁的注释本次修复即针对混合负载下的锁竞争路径进行了调整。生产环境存在高吞吐写入 频繁查询叠加场景的集群升级后建议观察落盘延迟与查询时延指标。七、升级建议与验证清单结合上述内容给出针对 3.3.8.1 的升级建议规划升级窗口本版本为维护性版本修复项集中在正确性与稳定性无破坏性变更可在常规维护窗口内升级。重点验证项若使用 RSMA验证ALTER RSMA语法、权限需ALTER RSMA权限与重启后行为并配合SHOW RSMAS/SHOW CREATE RSMA检查聚合函数列表是否符合预期若使用流计算核对定时触发任务在 taosd 重启后的首个窗口结果以及 count window DELETE_RECALC的报错行为是否符合预期若使用数据订阅验证带 tag 筛选条件的 topic 的消费结果若使用 taosX对 decimal 类型列做精度比对高负载集群观察写入查询混合负载下的落盘线程稳定性。可观测性确认升级后通过SHOW CONNECTIONS/PERF_CONNECTIONS确认end_point字段显示正确通过SHOW LOCAL VARIABLES LIKE timezone确认时区显示正确。八、总结TDengine 3.3.8.1 是围绕「正确性、稳定性、可观测性」的一次扎实迭代功能层面ALTER RSMA让降采样存储的聚合定义具备在线演进能力补齐了 RSMA 命令族的最后一块拼图修复层面11 项修复覆盖了从查询函数组合、流计算重启一致性、数据同步精度到落盘死锁、WebSocket 重连崩溃、跨挂载点迁移等生产高频痛点。对于已在 3.3.8.0 启用 RSMA、或重度依赖流计算与数据订阅的业务本版本具有明确的升级价值。【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考