GI诊断目录真实路径需以adrci输出为准,如diag/crs/rac1/crs、diag/tnslsnr/rac1/listener等;清理应使用adrci purge -age 1440 -type TRACE/INCIDENT,监听器日志须先set log_status off再清空,且各节点须独立操作。
确认GI诊断目录位置和实际占用
gi(grid infrastructure)的诊断日志默认存放在 $oracle_base/diag/tnslsnr/<hostname>/<listener_name> 和 $oracle_base/diag/crs/<hostname>/crs 下,但真实路径需以 v$diag_info 或 adrci 输出为准。别信环境变量或文档默认值——rac中每个节点的 adr base 可能不同,尤其当 gi 和 rdbms 使用不同 $oracle_base 时。
执行以下命令定位:
adrci adrci> show home
你会看到类似 diag/crs/rac1/crs、diag/tnslsnr/rac1/listener、diag/asm/+asm/+asm 的条目。重点检查这些目录的磁盘占用:
du -sh /u01/app/grid/diag/crs/rac1/crs/tracedu -sh /u01/app/grid/diag/tnslsnr/rac1/listener/tracedu -sh /u01/app/grid/diag/asm/+asm/+asm/trace
常见现象:单个 trace 目录可达 20GB+,而 incident 或 cdump 目录也可能因 CRS 异常反复重启产生大量堆栈文件。
用 adrci 清理 GI 的 trace 和 incident 文件
adrci 是清理 GI 诊断文件最安全的方式,它会自动维护 ADR 内部索引,避免手动删文件导致下次 adrci 命令报错或 CRS 日志写入失败。
操作前先切换到 GI 的 ADR home(不是数据库的):
adrci adrci> set homepath diag/crs/rac1/crs adrci> show alert -tail 10 # 确认当前 home 正确 adrci> purge -age 1440 -type TRACE # 删除 24 小时前的 trace 文件 adrci> purge -age 1440 -type INCIDENT
关键点:
-
-type TRACE清的是.trc和.trm,不是listener.log(那是文本日志,归lsnrctl管) -
-type INCIDENT对应incident子目录下按事件号组织的诊断包,通常体积大、可批量删 - 时间单位是分钟,
-age 1440= 24 小时;若要保留 7 天,用-age 10080 - 不要对
crshome 执行purge -type ALERT——alert目录里的log.xml是 CRS 运行状态核心依据,删了可能导致crsctl check crs显示异常
监听器日志(listener.log)不能直接 rm,必须停写再清空
GI 的监听器(如 LISTENER、LISTENER_SCAN1)日志是追加写入的,直接 rm listener.log 或 > listener.log 会导致文件句柄仍被进程占用,磁盘空间不释放,且新日志会继续写到已删除文件的 inode 上(表现为 lsof | grep deleted 可见)。
正确做法分三步(以 LISTENER_SCAN1 为例,节点本地执行):
lsnrctl LSNRCTL> set current_listener LISTENER_SCAN1 LSNRCTL> set log_status off LSNRCTL> exit cat /dev/null > $ORACLE_HOME/network/log/listener_scan1.log lsnrctl LSNRCTL> set current_listener LISTENER_SCAN1 LSNRCTL> set log_status on
注意:
- 必须在监听器所在节点执行,
LISTENER_SCAN1通常只在一个节点 active,用crsctl stat res -t | grep LISTENER_SCAN确认 -
$ORACLE_HOME指 GI 安装路径(如/u01/app/19.0.0/grid),不是数据库的$ORACLE_HOME - 别漏掉
set log_status off,否则清空后新日志会立刻续写旧偏移,可能覆盖头部关键信息
RAC 中各节点 GI 日志必须独立清理
GI 的 ADR 目录不是共享的——即使使用 ASM 存储,每个节点的 diag/crs/<hostname>/crs 是本地文件系统路径。你在 rac1 上运行 adrci 清理,对 rac2 完全无效。
典型错误:
- 只登录一个节点执行清理,另一节点几天后磁盘又告警
- 脚本里写死
rac1主机名,没做主机名变量替换,部署到rac2时路径错误 - 误以为
crsctl stop crs后所有日志停止写入——其实ohasd进程仍在记录,trace目录仍增长
建议用以下方式确保全覆盖:
- 写 shell 脚本,循环遍历
olsnodes输出的所有节点名 - 每节点内先
export ORACLE_HOME=/u01/app/19.0.0/grid,再调adrci - 监听器日志清理前加判断:
crsctl stat res ora.LISTENER_SCAN1.lsnr | grep rac1,只在 active 节点执行
最易忽略的一点:adrci purge 不清理 hm(Health Monitor)和 ir(Incident Packaging Service)目录,它们可能占数 GB,需单独 find ... -name "*.xml" -mtime +7 -delete,但务必先停掉 ora.oc4j.type 资源避免冲突。


















