adrci不清理监听日志是因为监听器默认未启用ADR;需在listener.ora中配置ADR_BASE并重启监听器,使日志迁入ADR路径后,adrci才能通过purge -age n -type TRACE/ALERT清理。
监听日志不自动清理,
为什么没反应?
因为
默认不管理监听器(
)的日志归档路径——它只管 oracle 数据库实例的 adr(automatic diagnostic repository),而监听器日志默认不在 adr 下,除非你手动把监听器注册进 adr。
常见错误现象:
执行
列不出
路径;用
命令清不到监听日志;
显示日志路径是
,但这个位置根本不受
控制。
确认监听器是否启用 ADR:检查
,必须有
配置项
监听器需重启才生效:改完
后,执行
或
ADR 启用后,监听日志会迁移到
,原
不再写入
清理监听日志的正确流程
只有监听器进了 ADR,
才能操作它的 trace 和 alert 日志。关键不是“怎么清”,而是“清谁”和“按什么条件清”。
使用场景:磁盘告警、日志占满
、巡检发现
目录下几百 MB 的
文件。
先定位监听器 ADR home:
→
→ 找到类似
的路径
进入该 home:
查日志大小和时间:
或
确认文件生成时间
按天数清理(推荐):
(清 7 天前的 alert 日志)或
(清 trace 文件)
只支持
、
、
,不支持
这种旧式命名
常见失效原因
命令返回成功,但磁盘空间没释放?大概率是没清对目标,或者日志还在被进程占用。
性能与兼容性影响:Oracle 11gR2+ 支持
,但 11gR1 不支持
参数;RAC 环境中每个节点要单独执行。
误清了数据库 home:
输出多行时,
忘了切换,结果清的是
未指定
:
默认只清
,监听日志属于
或
,必须显式声明
日志文件被
持有句柄:即使清了,空间也不会立刻释放,需
或重启监听器
权限问题:
必须由运行监听器的操作系统用户执行(通常是
),否则看不到文件或无权删除
比
更直接的监听日志控制方式
如果只是想防止日志爆炸,
是事后补救;更稳的做法是在监听器层面限流 + 轮转。
使用场景:无法停监听、不允许 ADR 改动、或环境是老版本 Oracle(如 10g)。
在
中加:
(确保路径可写)
启用日志轮转:
+
配合 OS 级 logrotate:写一个配置,按大小(如 10M)或天数切割,保留最多 5 个归档,比
更可控
注意:
不能直接
正在写的
,要用
或发
(部分监听器版本支持)
真正容易被忽略的是:监听器日志路径有两个源头——
配置的
和 ADR 自动接管后的
目录,两者互斥。改之前务必确认当前生效的是哪一套,否则清理动作全打在空处。
adrciadrcilsnrctladrcishow homesdiag/tnslsnrpurgelsnrctl status$ORACLE_HOME/network/log/listener.logadrci$ORACLE_HOME/network/admin/listener.oraADR_BASE = /path/to/your/adr/baselistener.oralsnrctl reloadlsnrctl stop && lsnrctl start$ADR_BASE/diag/tnslsnr///trace/ listener.logadrciadrci/u01tracelistener.logadrcishow homesdiag/tnslsnr/myhost/listenerset homepath diag/tnslsnr/myhost/listenershow alert -tail 10show tracefilepurge -age 7 -type ALERTpurge -age 7 -type TRACE-typeALERTTRACEINCIDENTlistener.logadrci purgeadrci purge-typeshow homesset homepathdiag/rdbms/...-typepurge -age 7INCIDENTTRACEALERTlsnrctllsnrctl reloadadrcioracleadrciadrcilistener.oraLOG_DIRECTORY_LISTENER = /u01/app/oracle/product/12.1.0/dbhome_1/network/logLOG_FILE_LISTENER = listener.logLOGGING_LISTENER = ONadrcilogrotatermlistener.logcopytruncateSIGUSR1listener.oraLOG_FILE_LISTENERtrace/