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