PAYATHON 2026

TDengine 3.4 反复删库后 VNODE 占用远超 disk_info,如何回收空间?

数据小陈

结论

仅凭 disk_info 为 104GB、VNODE 目录为 800GB,不能认定多出的空间都是可以删除的孤儿文件。应先核对统计范围,再检查当前数据库的 WAL、其他数据库的数据、仍然存在的旧目录,以及已删除但仍被进程打开的文件。

TDengine 3.4.0.0 的数据库文档说明,DROP DATABASE 会删除数据库中的表并销毁对应的 vgroups,但这不能证明本次删除操作在文件系统层面已经正常完成。不要直接删除 /var/lib/taos/vnode/ 下看起来过时的目录,尤其是当前环境只有一个节点、一个副本。TDengine 3.4.0.0 数据库文档

1. 先核对 disk_info 的统计口径

SHOW DATABASES; 和 SHOW db_name.disk_info; 是不同的查询。请保存实际执行的 SQL、返回的列名、数值和单位,并分别检查所有仍存在的业务数据库。

SHOW DATABASES;
SHOW db_name.disk_info;
SHOW db_name.vgroups;
SHOW CREATE DATABASE db_name;

将 db_name 替换为实际数据库名。

该版本文档将 SHOW db_name.disk_info; 的空间统计描述为 data1 + data2 + data3 的汇总。因此,不能直接用它表示整个 VNODE 根目录的占用,WAL 等其他文件还需单独核对。单个数据库的数据量也不能直接与所有 vnode 的目录总量比较。该版本的 disk_info 说明

2. 找出 800GB 实际分布在哪些目录

先确认 Docker 的数据挂载情况。将以下命令中的 tdengine_container 替换为实际容器名:

docker inspect --format '{{json .Mounts}}' tdengine_container

在容器内或宿主机对应的数据挂载路径下检查。以下示例使用容器内路径,其中 du 参数适用于 GNU 工具:

df -h /var/lib/taos/vnode/
du -x -h --max-depth=1 /var/lib/taos/vnode/ | sort -h
du -x -h --max-depth=2 /var/lib/taos/vnode/ | sort -h

查看空间主要集中在当前 vnode 的数据文件、wal 子目录,还是疑似已删除数据库对应的目录。将目录编号与 SHOW db_name.vgroups; 的结果对照,可以得到排查线索;目录未出现在某次查询结果中,并不足以证明它可以安全删除。

还要区分 du 和 df:du 统计所遍历目录中可见文件的占用,df 查看整个文件系统的使用情况。如果 800GB 确实来自 du,那么“文件已经删除但仍被打开”不能单独解释这 800GB 的可见目录占用。

3. 根据占用类型处理

当前数据库的 WAL 占用较大

先检查 WAL_RETENTION_PERIOD、WAL_RETENTION_SIZE 等配置及订阅需求,再决定是否调整保留策略。不能为了腾空间直接删除 wal 文件。

如果占用主要来自当前数据库的 WAL,应按 WAL 的保留与回收机制处理。反复删库不能代替对文件分布和配置的检查。

文件已删除,但空间仍被进程占用

如果 df 显示的占用明显高于目录统计,可在有足够权限且能够看到相关进程的宿主机环境中检查:

sudo lsof +L1

筛选属于 taosd、位于相应数据挂载文件系统且大小显著的记录。容器中可能没有 lsof,进程和挂载命名空间也会影响可见结果。

只有确认空间被此类文件占用时,正常关闭持有文件的进程才会释放相应文件引用。可安排停止写入,正常停止后再启动容器;单节点环境会中断服务。重启后重新检查 df 和 du,不要把重启当作必定有效的通用清理方法。

旧 vnode 目录仍然可见

保存当前所有数据库的 vgroup 信息、目录清单和删除数据库前后的 taosd 日志,检查是否有删除失败、权限不足、I/O 错误、空间不足等线索。

现有材料不足以确认这些目录确实是孤儿,也不足以给出 TDengine 3.4.0.0 的通用强制清理命令。应结合元数据和日志确认归属,再由 TDengine 维护方给出适用于该版本的处理方法。

4. TRIM 能否清理这些文件?

该版本提供以下命令,用于清理仍存在数据库中的过期数据:

TRIM DATABASE db_name;

该命令依据数据保留策略处理过期数据,不能用来扫描 VNODE 根目录或清理已删除数据库的遗留文件。FLUSH DATABASE 用于将内存数据落盘,也不能作为孤儿文件清理命令。TRIM 与 FLUSH 的用途

5. 磁盘已满时如何恢复

先暂停反复导入,必要时临时扩容,为数据库正常运行和排查留出空间。

如果预生产环境中的全部数据都可以丢弃并重新生成,可以先保存配置和排查材料,停止旧实例,再使用全新的空数据卷初始化实例并重新导入。确认新实例和数据可用后,再移除旧数据卷。如果需要保留数据,应先完成可恢复的备份或迁移。

重新创建容器时,如果仍挂载原来的数据卷,原有文件占用通常会继续存在。需要手工处理疑似残留文件时,应先确认文件归属并停机,不能只凭修改时间、目录名称或 104GB 与 800GB 的差值决定删除范围。

备注:内容仅供参考。