如何处理Oracle RAC集群日志目录爆满_TFA(Trace File Analyzer)自动清理


TFA未自动清理旧日志因默认仅清理trace/alert/core(保留30天),incident/hm/ir目录不清理,且依赖的tfa_storage元数据库损坏或tfa进程未运行会导致清理静默失效。

为什么 tfa 没有自动清理旧日志?

默认情况下 tfa 确实会轮转和压缩日志,但「自动清理」只针对 tracealertcore 这几类文件,且仅保留最近 30 天(可配置);而 diag 下的 incidenthmir 目录里的内容默认不被清理——这些目录常因频繁 ora-600/ora-7445 被撑爆。
更关键的是:tfa 的清理策略依赖于它自己维护的元数据库(tfa_storage),一旦该库损坏或未正常启动,整个清理逻辑就静默失效。

  • tfa 进程必须运行(检查 ps -ef | grep tfa
  • 确认清理策略已启用:$TFA_HOME/bin/tfactl print config | grep cleanup,输出应含 cleanup.enabled=true
  • 若输出为 false 或无此行,需手动开启:$TFA_HOME/bin/tfactl configure -cleanup true
  • 注意:该命令需在所有 RAC 节点分别执行,且会触发 tfa 重启

如何安全释放 tfactl 占用的磁盘空间?

别直接 rm -rf tfactl 目录下的子目录——tfa 正在监控并索引这些路径,硬删会导致元数据错乱,后续 tfactl view 报错或漏日志。
正确做法是让 tfa 主动归档 + 清理:

  • 强制触发一次完整清理:$TFA_HOME/bin/tfactl cleanup -all -force(耗时较长,建议在低峰期跑)
  • 如空间已紧急告警(/u01 使用率 >95%),先临时禁用采集以止血:$TFA_HOME/bin/tfactl disable collection
  • 清理完再恢复:$TFA_HOME/bin/tfactl enable collection
  • 检查清理结果:$TFA_HOME/bin/tfactl view cleanuphistory,确认 StatusSUCCESS

tfa 清理范围与 Oracle 版本差异

不同版本 tfadiag 子目录的处理逻辑不同。12.2.1.1+ 默认跳过 incident,但 19c 的 tfa 19.12+ 已支持配置 incident.retention.days ——这点极易被忽略,导致误以为「清理没生效」。

  • 查当前支持的清理项:$TFA_HOME/bin/tfactl print cleanupconfig
  • 若想清理 incident,需显式设置:$TFA_HOME/bin/tfactl configure -cleanup_incident true -incident_retention_days 15
  • 注意:该配置仅对新生成的 incident 生效,已有大量旧 incident 需先用 tfactl cleanup -all 扫描识别后才纳入清理范围
  • RAC 环境下,所有节点的 tfa 版本必须一致,否则清理策略同步失败(常见报错:Node xxx has different TFA version

清理后仍反复爆满?重点盯这三个地方

多数人清完一次就以为搞定,但一周后又报警——往往不是 tfa 问题,而是底层 Oracle 实例持续产生异常诊断数据。

  • 查高频 incident:adrci> show incident -mode detail -p "CREATE_TIME > '2024-01-01'" | grep -E "(INCIDENT_ID|PROBLEM_KEY)",看是否集中某类 ORA- 错误
  • 检查 AWRDB TimeSQL*Net break/reset 是否突增——网络抖动或应用未正确关闭连接,会引发大量 ORA-1089 并触发 incident
  • 确认 diagnostic_dest 是否指向了小容量文件系统:show parameter diagnostic_dest;若 /u01 不够大,别只调 tfa,得改 Oracle 的 DIAGNOSTIC_DEST 或挂载更大存储

真正麻烦的从来不是怎么删日志,而是删完第二天又有 500 个新 incident 冒出来——这时候该翻 adrci 而不是再敲一遍 tfactl cleanup