在11g中引入了自动诊断资料档案库(AutomaticDiagnostic Repository--ADR)特性,默认情况下各种trace,dump存放的目录位置区别于9i/10g显得更加难以查找了。
ADR 基目录中可以包含多个 ADR 主目录,其中每个 ADR 主目录都是一个根目录,用于存放特定 Oracle 产品或组件的特定实例的全部诊断数据。前一张幻灯片的图形中显示了数据库的 ADR 主目录位置。
另外,还生成了两个预警文件。一个是文本形式的预警文件(与早期版本 Oracle DB 使用的预警文件非常相似),位于各个 ADR 主目录的 TRACE 目录下。还有一个符合 XML 标准的预警消息文件,存储在 ADR 主目录内的 ALERT 子目录下。可使用 Enterprise Manager 和 ADRCI 实用程序查看文本格式的预警日志(已删除了 XML 标记)。
此幻灯片中的图形显示了 ADR 主目录的目录结构。INCIDENT 目录包含多个子目录, 每个子目录均以特定意外事件命名,并且仅包含与该意外事件相关的转储。
HM 目录包含由健康状况监视器生成的检查器运行报告。
还有一个 METADATA 目录,其中包含资料档案库自身的重要文件。可以将此目录比作数据库字典。可使用 ADRCI 查询此字典。
ADR 命令解释器 (ADRCI) 是一个实用程序,可用于执行支持工作台允许的所有任务(但是仅限于在命令行环境中)。使用 ADRCI 实用程序,您还可以查看 ADR 中跟踪文件的名称以及删除了 XML 标记、具有和不具有内容筛选功能的预警日志。
此外,还可以使用 V$DIAG_INFO 列出一些重要的 ADR 位置。
一个需要注意的细节是启用了ADR自动诊断资料档案库后,LISTENER监听器日志的默认位置也被移动到diagnostic_dest下了,而不在如9i/10g那样存放在$ORACLE_HOME/network/log目录下,有不少人因为忘记了这个细节而花费了大量时间去寻找listener.log,这个人也包括我。实际上我们还是可以将listener.log日志的位置还原回10g的形式,这一点可以通过修改$ORACLE_HOME/network/admin/listener.ora来达成:
[oracle@ora11 admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/11.2/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora11)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
将以上listener.ora文件的ADR_BASE_LISTENER条目删除,并加上
DIAG_ADR_ENABLED_LISTENER = OFF
重启监听服务
[oracle@ora11 admin]$ lsnrctl reload
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 06-MAY-2015 12:30:37
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora11)(PORT=1521)))
The command completed successfully
所幸的是在11g中提供了比传统的gettrcname.sql脚本更为给力的诊断文件位置信息汇总的视图V$DIAG_INFO:
V$DIAG_INFO 视图列出了所有重要的 ADR 位置:
ADR Base: ADR 基目录的路径
ADR Home: 当前数据库实例的 ADR 主目录的路径
Diag Trace: 文本预警日志和后台/前台进程跟踪文件的位置
Diag Alert: XML 版本的预警日志的位置
Default Trace File:会话的跟踪文件的路径。SQL 跟踪文件将写入到这里。
Health Monitor: 健康检查报告所在目录
Active Problem Count:当前激活的问题总数
Active Incident Count 当前激活的事故总数
SQL> select name,value from v$diag_info;
NAME VALUE
--------------------------------------- ------------------------------------------------------------
Diag Enabled TRUE
ADR Base /u01/app/oracle
ADR Home /u01/app/oracle/diag/rdbms/xulq/xulq
Diag Trace /u01/app/oracle/diag/rdbms/xulq/xulq/trace
Diag Alert /u01/app/oracle/diag/rdbms/xulq/xulq/alert
Diag Incident /u01/app/oracle/diag/rdbms/xulq/xulq/incident
Diag Cdump /u01/app/oracle/diag/rdbms/xulq/xulq/cdump
Health Monitor /u01/app/oracle/diag/rdbms/xulq/xulq/hm
Default Trace File /u01/app/oracle/diag/rdbms/xulq/xulq/trace/xulq_ora_5099.trc
Active Problem Count 0
Active Incident Count 0
11 rows selected.
adrci> show hm_run
**********************************************************
HM RUN RECORD 119
**********************************************************
RUN_ID 2481
RUN_NAME HM_RUN_2481
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 2
START_TIME 2011-05-21 20:11:38.612669 +08:00
RESUME_TIME
END_TIME 2011-05-21 20:11:38.619530 +08:00
MODIFIED_TIME 2011-05-21 20:11:38.619530 +08:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE
adrci> create report hm_run HM_RUN_2481
adrci> show hm_run -p "RUN_ID=2481"
ADR Home = /s01/orabase/diag/rdbms/prod/PROD1:
*************************************************************************
**********************************************************
HM RUN RECORD 1
**********************************************************
RUN_ID 2481
RUN_NAME HM_RUN_2481
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 2
START_TIME 2011-05-21 20:11:38.612669 +08:00
RESUME_TIME
END_TIME 2011-05-21 20:11:38.619530 +08:00
MODIFIED_TIME 2011-05-30 21:09:43.071150 +08:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE /s01/orabase/diag/rdbms/prod/PROD1/hm/HMREPORT_HM_RUN_2481.hm
[oracle@rh2 ~]$ cd /s01/orabase/diag/rdbms/prod/PROD1/hm
[oracle@rh2 hm]$ cat HMREPORT_HM_RUN_2481.hm
<?xml version="1.0" encoding="US-ASCII"?>
<HM-REPORT REPORT_ID="HM_RUN_2481">
<TITLE>HM Report: HM_RUN_2481</TITLE>
<RUN_INFO>
<CHECK_NAME>DB Structure Integrity Check</CHECK_NAME>
<RUN_ID>2481</RUN_ID>
<RUN_NAME>HM_RUN_2481</RUN_NAME>
<RUN_MODE>REACTIVE</RUN_MODE>
<RUN_STATUS>COMPLETED</RUN_STATUS>
<RUN_ERROR_NUM>0</RUN_ERROR_NUM>
<SOURCE_INCIDENT_ID>0</SOURCE_INCIDENT_ID>
<NUM_INCIDENTS_CREATED>0</NUM_INCIDENTS_CREATED>
<RUN_START_TIME>2011-05-21 20:11:38.612669 +08:00</RUN_START_TIME>
<RUN_END_TIME>2011-05-21 20:11:38.619530 +08:00</RUN_END_TIME>
</RUN_INFO>
<RUN_PARAMETERS/>
<RUN-FINDINGS/>
</HM-REPORT>
通过查询V$diag_info可以很容易找到自身服务进程的trace文件位置,对于其他进程的trace文件则可以查询v$process新加入的tracefile列:
SQL> select spid,tracefile from v$process;
SPID TRACEFILE
------------------------ --------------------------------------------------------------------------------
/s01/orabase/diag/rdbms/prod/PROD1/trace/PROD1_ora_0.trc
22789 /s01/orabase/diag/rdbms/prod/PROD1/trace/PROD1_pmon_22789.trc
22791 /s01/orabase/diag/rdbms/prod/PROD1/trace/PROD1_psp0_22791.trc