如何配置Oracle的监听日志自动清理_ADRCI命令行工具使用

1次阅读

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 reloadlsnrctl 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:adrcishow homes → 找到类似 diag/tnslsnr/myhost/listener 的路径
  • 进入该 home:set homepath diag/tnslsnr/myhost/listener
  • 查日志大小和时间:show alert -tail 10show tracefile 确认文件生成时间
  • 按天数清理(推荐):purge -age 7 -type ALERT(清 7 天前的 alert 日志)或 purge -age 7 -type TRACE(清 trace 文件)
  • -type 只支持 ALERTTRACEINCIDENT,不支持 listener.log 这种旧式命名

adrci purge 常见失效原因

命令返回成功,但磁盘空间没释放?大概率是没清对目标,或者日志还在被进程占用。

性能与兼容性影响:Oracle 11gR2+ 支持 adrci purge,但 11gR1 不支持 -type 参数;RAC 环境中每个节点要单独执行。

  • 误清了数据库 home:show homes 输出多行时,set homepath 忘了切换,结果清的是 diag/rdbms/...
  • 未指定 -typepurge -age 7 默认只清 INCIDENT,监听日志属于 TRACEALERT,必须显式声明
  • 日志文件被 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/ 目录,两者互斥。改之前务必确认当前生效的是哪一套,否则清理动作全打在空处。

text=ZqhQzanResources