如何用 TDengine 企业版数据重整 compact 改善存储放大并提升查询效率
2026/9/15 17:54:06 网站建设 项目流程

如何用 TDengine 企业版数据重整 compact 改善存储放大并提升查询效率

【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine

在多种写入场景下,TDengine 的存储会产生数据放大或数据文件空洞,这既占用额外磁盘空间,也会拖慢查询。TDengine TSDB Enterprise 为此提供了数据重整功能(data compact):它把已存储的数据文件重新整理,删除文件空洞和被删数据、合并多个 STT 文件,从而提高存储和查询效率。该功能在 3.0.3.0 版本首次发布,此后经过多次迭代优化,建议使用最新版本。

本文覆盖两条执行路径:手动发起compact任务并跟踪进度,以及通过数据库参数配置自动 compact。

执行前的准备

  • 环境为 TDengine TSDB Enterprise(compact 为企业版功能,自动 compact 参数同样仅企业版支持)。
  • 版本 3.0.3.0 及以上,建议使用最新版本。
  • 明确要重整的数据库名(或 vgroup 列表),以及是否需要限定时间范围。

手动发起 compact 任务

在 SQL 客户端中执行:

compact DATABASE db_name [start with 'XXXX'] [end with 'YYYY'] [META_ONLY] [FORCE]; compact [db_name.]vgroups IN (vgroup_id1, vgroup_id2, ...) [start with 'XXXX'] [end with 'YYYY'] [META_ONLY] [FORCE];

第二条语句只针对指定 vgroup 列表;db_name省略时默认为当前数据库。各可选关键字的用途:

  • start with 'XXXX':compact 数据的起始时间。
  • end with 'YYYY':compact 数据的终止时间。
  • META_ONLY:只 compact 元数据。注意元数据默认情况下不会被 compact;元数据压缩会阻塞写入和查询,且被压缩的数据库应该在此期间停止写入和查询。
  • FORCE:强制执行 compact,即使自上次 compact 以来没有新数据写入。

compact命令会返回 compact 任务的 ID,任务随后在后台异步执行。

跟踪任务进度并判断完成

show compacts查看 compact 任务列表,用show compact compact_id查看指定任务在各vgroup/dnode上的明细进度:

show compacts; show compact compact_id;

show compact的明细字段包括:compact_idvgroup_iddnode_idnumber_filesetfinishedstart_timeprogress(%)remain_time(s)(各 vgroup/dnode 上的进度、完成情况与剩余时间)。当任务完成后,对应条目不再出现在进行中的任务列表里;更完整的字段定义见 元数据视图 中的INS_COMPACTSINS_COMPACT_DETAILS

任务完成后,compact 的实际效果是:

  • 删除被删除的数据以及被删除的表的数据;
  • 合并多个 STT 文件;
  • 整理后指定 DB(或指定 vgroup)中 vnode 的所有数据文件。

磁盘层面的变化可以用SHOW DISK_INFO查看数据库的磁盘占用信息(WAL、多级存储、缓存与元数据等),命令语法见 SHOW 命令。

需要终止任务时

kill compact compact_id;

force的变体是高风险操作,不要作为常规手段:

kill compact compact_id force;

kill compact compact_id force会绕过 mnode 对 compact 任务的正常清理流程,强制从 SDB 中删除 compact 记录,允许在某个 dnode 离线时立即终止任务。但 compact 执行过程中正在修改的数据文件可能处于中间状态,强制删除记录不会触发离线节点侧的清理,可能导致数据文件损坏。文档建议仅在节点彻底损坏、无法恢复的极端情况下使用;若节点尚能正常启动,应优先将其拉起,再使用不带forcekill compact终止任务。

配置自动 compact(可选分支)

手动执行之外,可以借助数据库级参数让 compact 周期性自动触发(仅企业版支持,参数说明见数据库文档):

参数取值范围默认值说明
COMPACT_INTERVAL0[10m, keep2],单位为 m/h/d0自动 compact 触发周期(从 1970-01-01T00:00:00Z 开始切分的时间周期)。0表示不触发自动 compact
COMPACT_TIME_RANGE[-keep2, -duration],单位为 m/h/d[0, 0]每次自动 compact 整理的时间范围,值必须为负数(表示待 compact 的数据位于过去)
COMPACT_TIME_OFFSET[0, 23],单位 h0自动 compact 触发时间相对本地时间的偏移

几个需要注意的行为:

  • COMPACT_TIME_RANGE取默认值[0, 0]时,只要COMPACT_INTERVAL大于 0,会按[-keep2, -duration]下发自动 compact。
  • 例如-300,-200表示每次自动 compact 时整理距今 300 天到 200 天之间的数据。如果数据库的DURATION仍为默认值10d-300,-5会报错,因为第二个值(距今 5 天)比-DURATION(距今 10 天)更靠近当前时间。
  • 如果数据库中有未完成的 compact 任务,不会重复下发新的 compact 任务。
  • COMPACT_INTERVAL = 1d为例:COMPACT_TIME_OFFSET = 0时在每天 0 点下发自动 compact,偏移为 2 时在每天 2 点下发。
  • 要关闭自动 compact 功能,需要将COMPACT_INTERVAL设置为0

限制与注意事项

  • compact 是异步的,执行命令后立即返回,不会等待任务结束;如果上一个 compact 未完成就再发起一个,则会等上一个任务完成后再返回。
  • compact 可能阻塞写入,尤其是在stt_trigger = 1的数据库中,但不阻塞查询。stt_trigger用于控制 TSDB 数据落盘策略以及触发后台合并文件的文件个数,企业版默认值为2,开源版只能配置为1
  • 使用META_ONLY做元数据压缩时,被压缩的数据库应该停止写入和查询。
  • 若使用共享存储,数据库还有SS_COMPACT参数(默认值1):0表示数据文件组首次迁移到共享存储前不进行 compact,1表示首次迁移前进行 compact。

延伸操作

  • 若数据文件疑似损坏,可以用scan DATABASE db_name系列命令扫描数据文件,问题会输出在相应服务端日志中,命令与限制见集群维护。
  • 自动 compact 各参数的完整取值约束与示例,见数据库参数文档。

【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询