DIAGNOSTIC_DEST 是静态参数,必须在 init.ora 或 spfile 中设置并重启实例才生效,运行时修改会报 ORA-02095;其值为 ADR 根目录,trace 文件实际位于 $DIAGNOSTIC_DEST/rdbms///trace/ 下。
DIAGNOSTIC_DEST 参数设在哪?不是 SQL*Plus 里 ALTER SYSTEM 就完事
oracle 的 diagnostic_dest 是实例启动时读取的静态参数,运行时不能改——哪怕你用 alter system set diagnostic_dest='...' scope=both,也会报 ora-02095: specified initialization parameter cannot be modified。它必须写在初始化参数文件(init.ora)或服务器参数文件(spfile)里,且实例重启后才生效。
实操建议:
- 查当前值用
SHOW PARAMETER DIAGNOSTIC_DEST,但注意:这显示的是实际生效路径,不一定是参数文件里写的原始值(比如设了环境变量ORACLE_BASE,Oracle 会自动拼出默认值) - 修改前先确认
ORACLE_BASE是否已设——因为如果没显式设DIAGNOSTIC_DEST,Oracle 会把它设成$ORACLE_BASE;而如果ORACLE_BASE为空,又用了 OMF 或容器数据库,路径可能落到$ORACLE_HOME/dbs,极难追踪 - 推荐显式指定:
DIAGNOSTIC_DEST=/u01/app/oracle(注意结尾不加斜杠),然后用CREATE SPFILE FROM PFILE或直接ALTER SYSTEM SET ... SCOPE=SPFILE写入 spfile,再重启
Trace 文件真在 DIAGNOSTIC_DEST 下面?别被目录结构绕晕
DIAGNOSTIC_DEST 只是根目录,真正的 trace 文件藏在多层子路径里:$DIAGNOSTIC_DEST/rdbms/<db_unique_name>/<instance_name>/trace/</instance_name></db_unique_name>。如果你只扫 DIAGNOSTIC_DEST/trace,大概率空手而归。
常见错误现象:
- 用
ALTER SESSION SET TRACEFILE_IDENTIFIER='test'生成 trace 后,满DIAGNOSTIC_DEST目录 grep*test*找不到——其实它在trace/<instance_name>_ora_<pid>_test.trc</pid></instance_name> - 启用了
SQL_TRACE或DBMS_MONITOR,但应用连不上数据库,trace 根本不会生成——因为 trace 是服务进程(server process)写的,连接失败时连服务进程都没起来 - 多租户环境下,CDB 级 trace 和 PDB 级 trace 路径不同:CDB 的在
rdbms/<cdb_name>/<cdb_instance></cdb_instance></cdb_name>,PDB 的在diag/<db_unique_name>/<instance_name>/trace/</instance_name></db_unique_name>下按 PDB 名隔离,得进对的目录才能看到
ADRCI 切换到目标 ADR Home 前,先搞清自己在哪
ADRCI 不会自动跳到你想要的实例目录。它默认打开的是当前环境变量 ORACLE_HOME 和 ORACLE_SID 对应的那个 ADR Home。如果你有多个数据库、或者刚切了 ORACLE_SID,但没执行 ADRCI> SHOW HOMES,很可能删错 trace、查错 alert 日志。
实操建议:
- 进 ADRCI 后第一件事:运行
SHOW HOMES,确认输出里有没有你目标实例的路径,例如diag/rdbms/orcl/ORCL - 如果有多个,用
SET HOME PATH diag/rdbms/orcl/ORCL显式切换(路径必须完整,大小写敏感) - 删 trace 别直接
PURGE全库——先IPS CREATE PACKAGE打个快照,再PURGE -AGE 1440(单位分钟)删 24 小时前的,否则可能把正在被tkprof读的文件也干掉 -
ADRCI> SHOW INCIDENT查到 incident 后,PROBLEM字段常为空——这不是 bug,是 Oracle 把问题分类逻辑放在了 XML 元数据里,得配合VIEW ALERT或IPS SHOW PROBLEM看上下文
Trace 路径和 ADR 没关?那是你还没触发自动诊断
单纯改 DIAGNOSTIC_DEST 并不会让所有日志立刻进 ADR。Oracle 默认只把 alert.log、incident、trace、core 这几类自动纳入 ADR 管理。普通 PL/SQL 中用 UTL_FILE 写的日志、自定义脚本生成的 log,哪怕放在 DIAGNOSTIC_DEST 下,ADRCI 也看不见、管不了。
容易被忽略的地方:
-
DIAGNOSTIC_DEST改完,旧 trace 文件不会自动迁移——新 trace 往新路径写,老 trace 还留在原处,得手动搬或清理 - 某些版本(如 12.1)中,如果
DIAGNOSTIC_DEST所在文件系统 inode 耗尽,ALTER SYSTEM SWITCH LOGFILE都可能卡住,因为 control file 更新要写 ADR metadata - 用
oradebug setmypid; oradebug tracefile_name查当前 trace 路径最准——它返回的是服务进程实际打开的文件路径,比猜目录靠谱得多










