
在WindowsServer上运行Oracle 11.2.0.1时,大量.trc跟踪文件堆积(超过1万甚至更多),会直接引发:数据库启动极慢、lsnrctl status卡住、监听重启慢、数据库连接慢、服务器I/O高等典型问题。最近有遇到过一次,本文就从原因、危害、一键清理、永久根治全流程给出可直接落地的运维方案,适用于所有Windows+Oracle 11g环境。

一、问题现象
如果你也用过windows server下部署的Oracle 11g(11.2.0.1版本)数据库时,你一定遇到过如下情况:
这些问题不是偶然,而是Windows+Oracle 11.2.0.1的机制性通病。
二、原因及危害
在windowsserver平台下,出现此情况还是非常常见的,主要有如下原因:
1. 文件系统目录遍历性能瓶颈(Windows NTFS特性)
这是最直接的原因。
1) 数据库启动:Oracle实例启动时,后台进程(如PMON,SMON,DBWn等)可能会尝试读取或清理诊断目录中的某些状态文件,或者在初始化ADR(自动诊断存储库)时扫描目录结构
2) 监听器(lsnrctl status):监听器在启动或执行status命令时,需要访问其日志和跟踪目录(通常在$ORACLE_BASE/diag/tnslsnr/.../trace)。如果该目录下有上万个.trc和.log文件,操作系统在进行文件句柄分配、目录枚举或元数据读取时会消耗大量CPU和I/O时间,导致命令响应极慢甚至超时
3) 重启过程:重启包含关闭和启动两个阶段,关闭时需要写入最终的跟踪信息,启动时又面临上述的扫描问题,双重加剧了延迟。
2. Oracle 11g ADR(Automatic Diagnostic Repository)机制
Oracle11g引入了ADR来统一管理诊断文件,默认路径由DIAGNOSTIC_DEST参数决定。
3. 潜在的根源性问题(为什么会有这么多文件?)
文件多通常是“果”而非“因”。需要排查是什么导致了Trace文件的疯狂增长:
只要异常不解决,trc文件会几分钟生成上百个。
4. 危害
如果不处理会越来越严重,主要有如下危害:
三、紧急处理方案
以下命令全部在Windows CMD(管理员权限下)运行,可以按照步骤参考处理:
第一步:停止监听与数据库(避免文件占用)
lsnrctl stop
sqlplus / as sysdba
shutdown immediate
exit若无法关闭,直接在服务里停掉:

第二步:定位trace路径
执行下面SQL查看路径(启动到mount状态也可):
select value from v$diag_info where name='Diag Trace';典型路径:

监听日志路径:
$ORACLE_HOME\network\log第三步:清理.trc,.trm旧文件
在CMD中cd进入trace目录,执行:
del /s /q *.trc
del /s /q *.trm或者手动清理也可
第四步:清理并重建监听日志(解决4GB BUG)
进入network/log目录:
del listener.log
echo.>listener.log也可以手动清理,但是建议先重命名,便于后续排查。
第五步:启动数据库与监听
sqlplus / as sysdba
startup
exit
lsnrctl start执行后你会立刻发现数据库启动秒启、lsnrctl status瞬间返回、服务器不再卡顿。
四、根治方法:让trc不再堆积
1. 设置ADR自动清理(Oracle级根治)
用sysdba执行:
-- 保留3天的trace文件
alter system set diagnostic_diag_purge_min_age = 4320 scope=spfile;
-- 清理7天前所有trace
exec DBMS_SHRINK_CATALOG.PURGE_ALL_DIAGNOSTIC_DATA(SYSDATE-7);2. 监听自动轮转(彻底解决4GB BUG)
编辑listener.ora,增加:
LOGGING_LISTENER = ON
LOG_FILE_LISTENER = listener
LOG_DIRECTORY_LISTENER = $ORACLE_HOME\network\log
LOG_ROTATION_LISTENER = ON
LOG_ROTATION_SIZE_LISTENER = 100M
LOG_ROTATION_AGE_LISTENER = 1D3. 关闭多余跟踪(防止疯狂生成trc)
alter system set sql_trace = false scope=spfile;
alter system set events '10046 trace name context off';4. Windows计划任务(定期清理兜底)
新建bat每日执行:
del /s /q "C:\app\Administrator\diag\rdbms\orcl\orcl\trace\*.trc"
del /s /q "C:\app\Administrator\diag\rdbms\orcl\orcl\trace\*.trm"5. 根因排查
清理只是治标,必须查异常,排查为什么你的trc会暴增?
select to_char(first_time,'yyyy-mm-dd hh24:mi'), message
from v$alert_log
order by first_time desc;select * from v$diag_trace_file order by last_update_time desc;ORA-600、ORA-7445:数据库bug,打PSU补丁
监听TNS-12500系列错误:网络/权限/配置
进程频繁重启:内存、PGA、SGA配置不当
死锁、行锁、事务异常:应用SQL问题五、总结
Windows上Oracle11.2.0.1版本的trc文件过多导致启动慢、监听卡,本质是Windows NTFS不适合海量小文件、Oracle11.2.0.1无自动清理监听日志4GB的BUG三个问题的叠加;可以通过先清理、再配置自动清理、最后查错误的步骤,从根源杜绝文件暴增。