根本原因是RMAN会话隐式或显式启用了SQL跟踪(如10046事件),而非备份本身;需检查并关闭全局10046跟踪、清除RMAN命令中的debug参数、禁用DBMS_MONITOR对相关服务的跟踪,并确认BACKGROUND_DUMP_DEST未与DIAGNOSTIC_DEST冲突。
oracle 11g rman 备份期间大量生成 .trc 文件,根本原因不是备份本身,而是隐式或显式启用了 sql 跟踪(如 10046 事件),或 rman 会话被错误地绑定到开启跟踪的服务/模块上。
检查是否全局启用了 10046 跟踪
RMAN 自身不默认开 trace,但若数据库级开启了 10046,所有后台进程(含 RMAN 的 rman_ora_* 进程)都会写大体积 trace。常见错误配置:
-
ALTER SYSTEM SET EVENTS '10046 trace name context forever, level 12' SCOPE=SPFILE;—— 即使重启后也生效,且 level 12 包含 bind + wait,单个 trace 动辄几 MB -
SHOW PARAMETER event可能看不到,因为该参数不走常规参数视图;需查V$SPPARAMETER或直接strings $ORACLE_HOME/dbs/spfile*.ora | grep 10046 - 关闭方式必须用
ALTER SYSTEM SET EVENTS '10046 trace name context off';(注意不能带scope=spfile,否则下次启动又恢复)
排查 RMAN 命令里是否含 debug 或 trace 相关开关
显式调试行为会直接触发 trace 输出,且不受全局 trace_enabled 控制:
-
run { debug on; backup database; }——debug on等价于打开 10046 level 12,必须删掉 -
set debug on;在 RMAN 命令行中执行过,未退出就运行 backup,也会延续跟踪状态 - 某些第三方备份脚本或旧版运维工具会自动注入
debug,建议 grep 所有 .sh/.sql 脚本中的debug和trace
确认 DBMS_MONITOR 是否对 RMAN 关联服务启用了跟踪
RMAN 默认使用 sys$usability 或实例名对应的服务,如果 DBA 对该服务启用了模块级跟踪,RMAN 进程就会持续写 trace:
- 查当前启用项:
SELECT * FROM DBA_ENABLED_TRACES WHERE TRACE_TYPE = 'SERVICE'; - 特别关注
PRIMARY_ID是SYS$USABILITY、ORCL(实例名)或空值(表示全局服务)的记录 - 禁用命令:
EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(service_name => 'SYS$USABILITY'); - 注意:该包调用不写 alert log,但会在
$DIAG_DEST/rdbms/<db>/<inst>/trace/</inst></db>下立刻生成 trace,务必验证是否已停
为什么改了 DIAG_DEST 还是满?先看实际落盘路径
DIAGNOSTIC_DEST 是 ADR 根目录,但部分 trace 可能绕过它写到老路径,尤其在 11.2.0.x 版本中:
- 运行
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME IN ('diagnostic_dest', 'background_dump_dest'); - 如果
background_dump_dest非空且路径 ≠diagnostic_dest,说明存在双日志路径,RMAN 的部分 trace(如rman_ora_*.trc)可能仍写入后者 - 必须执行
ALTER SYSTEM RESET background_dump_dest SCOPE=SPFILE;并重启实例,否则 purge 操作只清 ADR 下的文件,漏掉另一半 - Windows 环境下更敏感:单目录超 5000 个
.trc就会导致 lsnrctl status 卡死,哪怕磁盘空间充足
真正棘手的点不在“怎么删”,而在于 trace 暴增往往是症状,不是病因——比如 RMAN 备份反复失败触发内部重试循环,或 ORA-00060 死锁高频发生,这些底层异常不解决,关掉跟踪也只是掩盖问题。先盯紧 alert.log 里 RMAN 启动前后的报错段,比清理目录优先级高得多。


















