ADRCI 无自动清理功能,需通过 cron 定期调用 PURGE 命令实现;必须显式指定 ADR Home 和 -type(如 TRACE),监听器需配置 ADR_BASE 并 reload 才生效。

adrci 本身不提供“自动配置”机制,Oracle 19c 的 ADR 没有内置的、开箱即用的定时自动清理策略。所谓“自动清理”,必须靠外部调度(如 cron)定期调用 adrci 的 PURGE 命令实现——它只是个执行工具,不是守护进程。
为什么直接运行 purge -age 常常没效果?
常见失效不是命令写错,而是没对准目标:
- 没用
set homepath切换到正确的 ADR Home:一个数据库实例、监听器、ASM 实例各自独立的 ADR Home,show homes输出多行时极易选错 - 没指定
-type:默认只清理INCIDENT,而TRACE和ALERT必须显式声明,例如purge -age 10080 -type TRACE - 监听日志根本不在 ADR 下:若
listener.ora缺少ADR_BASE配置,adrci就完全看不到listener.log,更别说清理 - 文件正被进程占用:即使
purge返回成功,空间也不释放——lsnrctl reload或重启监听器才能释放句柄
如何用 adrci 安全清理 trace 文件(含监听器)?
分两步:先确认路径归属,再精准 purge。
- 查所有 ADR Home:
adrci > show homes,重点关注含rdbms(数据库实例)和tnslsnr(监听器)的路径 - 确认监听器已启用 ADR:检查
$ORACLE_HOME/network/admin/listener.ora是否有ADR_BASE = /u01/app/oracle,改完必须lsnrctl reload - 清理数据库 trace:
set homepath diag/rdbms/orcl/orcl→purge -age 10080 -type TRACE(7 天) - 清理监听器 trace:
set homepath diag/tnslsnr/myhost/listener→purge -age 10080 -type TRACE -
-age单位是分钟,别误写成天;10080 = 7×24×60
怎样真正实现“无人值守”的定时清理?
靠 cron 调用封装好的 shell 脚本,而非依赖 Oracle 自身。
- 脚本中必须显式设置环境变量:
ORACLE_BASE、ORACLE_HOME、PATH,否则adrci找不到 ADR - 每个 ADR Home 单独处理,避免漏掉监听器或 RAC 某节点:
for home in $(adrci -silent -exec "show homes" | grep -E 'rdbms|tnslsnr'); do ... - 加日志记录和错误检查:
adrci -silent -exec "set homepath $home; purge -age 10080 -type TRACE" >> /var/log/adrci_purge.log 2>&1 - 建议每天凌晨执行一次:
0 2 * * * /home/oracle/bin/adrci_purge.sh - 不要设过短保留周期(如
真正的“自动”藏在操作系统层,而不是 Oracle 配置项里。最容易被忽略的是:监听器日志默认游离于 ADR 之外,不改 listener.ora 就永远清不到——这点比命令语法本身更重要。


















