一、故障背景
生产环境使用 TDengine TSDB 社区版,服务器出现磁盘空间不足问题,/home 分区使用率达到 100%,影响数据库正常运行。
本次故障主要从三个方面处理:
-
清理 TDengine 历史运行日志,释放磁盘空间。
-
修改日志保留时间,避免历史日志持续累积。
-
设置数据库数据保留 200 天,并主动执行过期数据清理。
1.1 环境信息
| 项目 | 配置信息 |
|---|---|
| 操作系统 | CentOS Linux |
| 数据库 | TDengine TSDB 社区版 |
| 数据库配置文件 | /etc/taos/taos.cfg |
| 数据目录 | /home/tdengine/data |
| 日志目录 | /home/tdengine/log |
| 临时目录 | /home/tdengine/tmp |
| 原日志保留时间 | 10 天 |
| 目标日志保留时间 | 7 天 |
| 目标数据保留时间 | 200 天 |
注意: 本次日志目录约占用 20GB,但 /home 分区总容量约 1.7TB。日志清理可以释放部分空间,仍需检查数据目录,不能直接认定全部磁盘占用均由日志造成。
二、故障排查
2.1 查看磁盘使用情况
df -h
本次故障中 /home 分区使用率达到 100%。
2.2 查看 TDengine 各目录占用
du -sh /home/tdengine/log
du -sh /home/tdengine/data
du -sh /home/tdengine/tmp
其中:
-
log:TDengine 运行日志。 -
data:TDengine 数据存储目录。 -
tmp:TDengine 临时文件目录。
2.3 查看日志文件
ls -lhtr /home/tdengine/log/
查看最大的 20 个日志文件:
ls -lhS /home/tdengine/log/ | head -20
重点检查 taosdlog 相关日志文件。
三、清理 TDengine 历史日志
3.1 查看历史日志
cd /home/tdengine/log
ls -lhtr
TDengine 的运行日志通常包含以下文件:
taosdlog.0
taosdlog.1
taosdlog.时间戳
taosdlog.时间戳.gz
其中:
-
taosdlog.0、taosdlog.1:可能正在被数据库使用的轮换日志,不手工删除。 -
带时间戳的日志:历史归档日志,确认不再使用后可以清理。
3.2 查询超过 7 天的历史归档日志
find /home/tdengine/log -maxdepth 1 -type f \
-regextype posix-extended \
-regex '.*/taosdlog\.[0-9]{9,}(\.gz)?' \
-mmin +10080 -print
该命令只查询符合指定归档命名规则、最后修改时间超过 7 天的日志,不会删除文件。
3.3 清理超过 7 天的历史日志
确认查询结果均为无需保留的历史归档后执行:
find /home/tdengine/log -maxdepth 1 -type f \
-regextype posix-extended \
-regex '.*/taosdlog\.[0-9]{9,}(\.gz)?' \
-mmin +10080 -delete
注意:该命令只覆盖匹配上述命名规则的历史日志。其他日志文件需要单独判断,不要直接删除整个日志目录。
3.4 检查空间释放情况
du -sh /home/tdengine/log
df -h /home
若删除后空间未释放,检查是否有进程仍占用已删除文件:
lsof +L1 | grep /home/tdengine/log
如果仍存在占用,需要结合进程状态安排后续处理,不要直接重启生产数据库。
四、修改日志保留时间
4.1 查看数据库版本
taosd -V
不同版本的配置参数生效机制不同,修改前应先确认版本。
4.2 修改配置文件
TDengine 配置文件:
/etc/taos/taos.cfg
先备份配置文件:
cp -a /etc/taos/taos.cfg \
/etc/taos/taos.cfg.bak.$(date +%Y%m%d%H%M%S)
编辑配置:
vi /etc/taos/taos.cfg
找到原有配置:
logDir /home/tdengine/log
logKeepDays 10
将日志保留时间调整为 7 天,并设置单个日志文件的最大行数:
logDir /home/tdengine/log
logKeepDays 7
numOfLogLines 1000000
参数说明:
| 参数 | 作用 |
|---|---|
logDir |
日志目录 |
logKeepDays |
日志保留时间,单位为天 |
numOfLogLines |
单个日志文件轮转阈值,单位为行 |
日志自动清理机制:
当日志达到 100 万行时,触发轮转和归档;超过保留时间的历史归档,在后续日志清理检查中删除。
注意:轮转并不代表立即删除旧日志,日志保留 7 天也不代表总日志大小被限制在固定容量内。
4.3 配置生效方式
TDengine 3.1~3.3.x 社区版通常采用配置文件修改,并在维护窗口重启 taosd 使配置生效:
systemctl restart taosd
生产环境不能直接执行上述重启命令,必须提前安排维护窗口。
另外,TDengine 3.4.0.0 及以上版本已调整配置加载机制,正常情况下不再在后续启动时重新读取配置文件中的参数;社区版又不支持通过 SQL 动态修改 logKeepDays 和 numOfLogLines。遇到这种版本组合时,应先核对版本对应的官方配置管理方法,不能简单认为修改配置文件并重启就能生效。
五、设置数据库数据保留 200 天
注意:此操作涉及历史业务数据过期删除,执行前必须确认业务允许删除超过 200 天的数据,并检查备份情况。
5.1 登录 TDengine 数据库
taos
5.2 查看数据库列表
SHOW DATABASES;
根据查询结果确定需要调整的业务数据库名称。
以下 SQL 中使用 db_name 作为示例,实际执行时需替换为真实数据库名。
5.3 查看数据库当前保留策略
SHOW CREATE DATABASE db_name\G;
也可以查询数据库详细参数:
SELECT *
FROM INFORMATION_SCHEMA.INS_DATABASES
WHERE NAME = 'db_name'\G;
重点查看:
KEEP
DURATION
参数含义:
-
KEEP:数据库数据文件的保留时间。 -
DURATION:数据文件存储数据的时间跨度。
注意: KEEP****必须不小于 DURATION****的 3 倍。 设置 200 天前要确认当前 DURATION 满足要求。
5.4 修改数据保留时间为 200 天
执行:
ALTER DATABASE db_name KEEP 200d;
该命令将指定业务数据库的数据保留时间调整为 200 天。
5.5 验证数据保留策略
SHOW CREATE DATABASE db_name\G;
或者:
SELECT *
FROM INFORMATION_SCHEMA.INS_DATABASES
WHERE NAME = 'db_name'\G;
确认 KEEP 对应的保留时间已经修改为 200 天。
5.6 主动执行过期数据清理
设置 KEEP 后,TDengine 会自动根据该策略管理过期数据,不需要额外启用开关。
如果需要主动触发过期数据清理,可在确认业务允许、版本支持且数据库状态正常后执行:
TRIM DATABASE db_name;
TRIM 是英文单词,意思是 修剪、裁剪、去除多余部分。
命令作用:
按照数据库当前保留策略执行过期数据清理。
注意:
-
不是清空整个数据库。
-
只针对符合过期条件的数据执行处理。
-
清理完成和磁盘实际释放之间可能存在时间差。
-
如果数据库中的数据都没有超过 200 天,执行后不一定能释放空间。
-
磁盘已严重不足时,应优先恢复足够的可用空间,再执行较大规模的数据清理。
六、不知道日志目录和数据目录时如何查询
如果是其他服务器,目录与本次环境不一致,不能直接套用路径。
6.1 通过 SQL 查询
登录数据库:
taos
查看节点:
SHOW DNODES;
假设节点 ID 为 1,查询日志目录:
SHOW DNODE 1 VARIABLES LIKE 'logDir';
查询数据目录:
SHOW DNODE 1 VARIABLES LIKE 'dataDir';
查询当前日志保留配置:
SHOW DNODE 1 VARIABLES LIKE 'logKeepDays';
查询日志轮转行数:
SHOW DNODE 1 VARIABLES LIKE 'numOfLogLines';
将 1 替换为实际节点 ID。若当前版本不支持对应查询语法,可以查看节点实际启动参数及配置文件。
6.2 通过 Linux 查看
grep -Ei '^(logDir|dataDir|tempDir|logKeepDays|numOfLogLines)[[:space:]]+' /etc/taos/taos.cfg
注意:配置文件中的值不一定等于当前正在运行的有效值,优先结合数据库变量查询结果判断。
七、故障处理完成后的验证
7.1 检查磁盘空间
df -h /home
7.2 检查日志目录
du -sh /home/tdengine/log
7.3 检查数据目录
du -sh /home/tdengine/data
7.4 检查数据库节点状态
SHOW DNODES;
7.5 检查数据库可用性
SHOW db_name.ALIVE;
返回 1 表示数据库完全可用。
7.6 验证数据库保留时间
SHOW CREATE DATABASE db_name\G;
确认 KEEP 为 200 天,同时确认业务写入恢复正常。
八、日常巡检建议
建议定期检查以下内容:
| 检查项目 | 检查方式 |
|---|---|
| 磁盘空间 | df -h /home |
| 日志目录占用 | du -sh /home/tdengine/log |
| 数据目录占用 | du -sh /home/tdengine/data |
| 数据库节点状态 | SHOW DNODES; |
| 数据保留策略 | SHOW CREATE DATABASE db_name\G; |
建议磁盘使用率达到 80% 时开始关注增长趋势,超过 90% 时及时制定清理或扩容方案,避免再次达到 100%。
九、故障处理 SOP 速查表
| 步骤 | 操作 | 命令 |
|---|---|---|
| 1 | 查看磁盘空间 | df -h /home |
| 2 | 查看日志占用 | du -sh /home/tdengine/log |
| 3 | 查看数据占用 | du -sh /home/tdengine/data |
| 4 | 查看历史日志 | ls -lhtr /home/tdengine/log |
| 5 | 清理历史日志 | 按第三章先预览、再清理 |
| 6 | 修改日志保留时间 | /etc/taos/taos.cfg |
| 7 | 查看数据库列表 | SHOW DATABASES; |
| 8 | 查看原保留策略 | SHOW CREATE DATABASE db_name\G; |
| 9 | 设置保留 200 天 | ALTER DATABASE db_name KEEP 200d; |
| 10 | 主动清理过期数据 | TRIM DATABASE db_name; |
| 11 | 验证空间释放 | df -h /home |
| 12 | 验证数据库状态 | SHOW DNODES; |
十、总结
本次 TDengine 社区版磁盘空间不足故障的处理思路:
第一步:释放空间。
确认实际日志路径后,清理不再使用的历史归档日志,缓解磁盘空间不足问题。
第二步:调整日志保留策略。
将日志保留时间由 10 天调整为 7 天,将单个日志文件轮转阈值设置为 100 万行,避免日志长期无序增长。
第三步:调整数据保留策略。
通过:
ALTER DATABASE db_name KEEP 200d;
将业务数据保留时间设置为 200 天。
需要主动清理历史过期数据时,执行:
TRIM DATABASE db_name;
第四步:验证和巡检。
检查磁盘空间、日志目录、数据库数据目录及业务写入状态,确保数据库恢复稳定运行。
最终形成一套可复用的生产环境处理流程:
磁盘告警 → 定位占用目录 → 清理历史日志 → 调整日志保留时间 → 设置数据保留 200 天 → 清理过期数据 → 验证数据库状态。
生产环境注意事项
-
严禁直接删除
/home/tdengine/data下的数据文件。 -
严禁使用
rm -rf /home/tdengine/log/*清空日志目录。 -
不要在业务高峰期随意重启 TDengine。
-
数据保留周期修改涉及历史数据删除,必须获得业务确认。
-
日志清理与数据过期清理是两种不同机制。
-
保留策略无法替代磁盘容量规划,数据增长过快时仍需考虑扩容。
官方参考文档:
关键词: TDengine、TSDB、磁盘空间不足、历史日志清理、logKeepDays、KEEP、TRIM DATABASE、数据库运维 SOP