Oracle 11g之前,当数据库出现问题时,往往第一时间需要看alert日志,看看里面记录了哪些错误,可以给我们提示。alert文件名则
是alert_<ORACLE_SID>.log,文件存储路径由参数background_dump_dest决定,例如:
SQL> show parameter background_dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /opt/app/ora10g/admin/petest/bdump
可以知道alert日志就保存在/opt/app/ora10g/admin/petest/bdump路径下。
例如如下这个log后缀的alert日志,内容是文本格式的,可以直接打开查看:
-rw-r-----. 1 oracle root 1.8G Jun 21 19:30 alert_bisal.log
从Oracle 11g开始,alert除了文本格式,还提供了xml格式的,且日志路径有所变化。如果设置了参数diagnostic_dest,则原来的
background_dump_dest等路径将失效。Oracle 11g提供的新特性“自动诊断库(Automatic Diagnostic Repository, ADR)”的目
录就是通过这个参数设置的,这个目录下存放的是数据库诊断日志、跟踪文件等之前分布于bdump、cdump等路径中的文件,这个
目录通常称为ADR base。例如:
SQL> show parameter diag
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest string /home/oracle
diagnostic_dest的缺省值还和环境变量ORACLE_BASE有关,例如:
>如果设置了ORACLE_BASE,则diagnostic_dest = $ORACLE_BASE
>如果未设置ORACLE_BASE,则diagnostic_dest = $ORACLE_HOME/log
根据eygle的介绍,11g将环境变量ORACLE_BASE引入到了数据库内部,使用隐含参数记录:
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.KSPPDESC PDESC
FROM SYS.x$ksppi x, SYS.x$ksppcv y
WHERE x.indx = y.indx AND x.ksppinm LIKE '%&par%';
NAME VALUE PDESC
--------------- ----------------- ------------------
_oracle_base /home/oracle ORACLE_BASE
注意这里SQL的输入的是小写oracle_base。
可以使用v$diag_info查看ADR信息:
SQL> select * from v$diag_info;
INST_ID NAME VALUE
---------- ------------------------- -------------------------
1 Diag Enabled TRUE
1 ADR Base /home/oracle
1 ADR Home /home/oracle/diag/rdbms/galt/galt
1 Diag Trace /home/oracle/diag/rdbms/galt/galt/trace
1 Diag Alert /home/oracle/diag/rdbms/galt/galt/alert
1 Diag Incident /home/oracle/diag/rdbms/galt/galt/incident
1 Diag Cdump /home/oracle/diag/rdbms/galt/galt/cdump
1 Health Monitor /home/oracle/diag/rdbms/galt/galt/hm
1 Default Trace File /home/oracle/diag/rdbms/galt/galt/trace/galt_ora_8970.trc
1 Active Problem Count 1
1 Active Incident Count 50
11 rows selected.
其中Diag Alert保存的是xml格式的alert日志,Diag Trace保存的是文本格式的alert日志。
还提供了一个新工具ADRCI(ADR Command Interpreter),说是用于管理诊断数据,友好阅读xml格式的日志,但这里我还没搞清楚为什么需要xml格式的日志,请高手指教。
命令行中输入adrci就可以登录了,例如:
[oracle@riserver2 diag]$ adrci
ADRCI: Release 11.2.0.1.0 - Production on Sat Jun 21 18:51:31 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
ADR base = "/home/oracle"
adrci>
使用show alert可以选择需要查看的日志文件:
adrci> show alert
Choose the alert log from the following homes to view:
1: diag/tnslsnr/riserver2/listener
2: diag/rdbms/galt/galt
Q: to quit
Please select option:
接下来就是为什么要有ADR?
ADR是将各类跟踪文件、日志文件的存储进行统一,不会像之前需要不同文件时要到不同目录中查找,有时还得看看参数设置到哪
些路径下了。Oracle 11g提出了FDI,故障诊断基础框架,Fault Diagnosability Infrastructure,宗旨就是简化用户的数据库出现
故障时向Oracle请求协助需要反复交互的过程。以前用户需要根据Oracle的要求,不断反复交互,收集数据,再反馈Oracle,才能
解决SR,通过FDI,可能会提高故障分析解决的效率。(因为我还没提过,所以不知道是否真的节省了成本?)
FDI的核心组件是ADR,相关的日志文件进行了归类汇总都存储于ADR之下。同时使用IPS,事件打包服务,Incident Packaging
Service,可以将相关的数据、日志文件打包压缩,然后用户将这个文件传给Oracle诊断。
例如:
adrci> show incident
ADR Home = /home/oracle/diag/tnslsnr/riserver2/listener:
*************************************************************************
0 rows fetched
ADR Home = /home/oracle/diag/rdbms/galt/galt:
*************************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
-------------------- ------------------------ ----------------------------------------
129708 ORA 4030 2014-06-21 05:35:06.727000 08:00
129709 ORA 4030 2014-06-21 05:35:15.598000 08:00
129710 ORA 4030 2014-06-21 05:35:23.600000 08:00
129711 ORA 4030 2014-06-21 05:35:31.526000 08:00
129712 ORA 4030 2014-06-21 05:35:39.611000 08:00
5 rows fetched
可以看到这里有5次INCIDENT,可以用如下命令查看具体的信息:
adrci> show incident -mode DETAIL -p "incident_id=129708"; ADR Home = /home/oracle/diag/tnslsnr/riserver2/listener: ************************************************************************* 0 rows fetched <INCIDENT_INFO mode="detail"> <ADR_HOME name="/home/oracle/diag/tnslsnr/riserver2/listener"> ADR Home = /home/oracle/diag/rdbms/galt/galt: ************************************************************************* ********************************************************** INCIDENT INFO RECORD 1 ********************************************************** INCIDENT_ID 129708 STATUS ready CREATE_TIME 2014-06-21 05:35:06.727000 08:00 PROBLEM_ID 1 CLOSE_TIME <NULL> FLOOD_CONTROLLED none ERROR_FACILITY ORA ERROR_NUMBER 4030 ERROR_ARG1 832 ERROR_ARG2 callheap ERROR_ARG3 temporary memory ERROR_ARG4 <NULL> ERROR_ARG5 <NULL> ERROR_ARG6 <NULL> ERROR_ARG7 <NULL> ERROR_ARG8 <NULL> ERROR_ARG9 <NULL> ERROR_ARG10 <NULL> ERROR_ARG11 <NULL> ERROR_ARG12 <NULL> SIGNALLING_COMPONENT <NULL> SIGNALLING_SUBCOMPONENT <NULL> SUSPECT_COMPONENT <NULL> SUSPECT_SUBCOMPONENT <NULL> ECID <NULL> IMPACTS 0 PROBLEM_KEY ORA 4030 FIRST_INCIDENT 129708 FIRSTINC_TIME 2014-06-21 05:35:06.727000 08:00 LAST_INCIDENT 129757 LASTINC_TIME 2014-06-21 05:35:52.409000 08:00 IMPACT1 34668547 IMPACT2 34668546 IMPACT3 0 IMPACT4 0 KEY_NAME ProcId KEY_VALUE 2.1 KEY_NAME Client ProcId KEY_VALUE oracle@riserver2.3005_140012269696768 KEY_NAME SID KEY_VALUE 383.1 OWNER_ID 1 INCIDENT_FILE /home/oracle/diag/rdbms/galt/galt/trace/galt_pmon_3005.trc OWNER_ID 1 INCIDENT_FILE /home/oracle/diag/rdbms/galt/galt/incident/incdir_129708/galt_pmon_3005_i129708.trc 1 rows fetched
可以看到目录下有异常事件的跟踪信息:
[oracle@riserver2 diag]$ cd /home/oracle/diag/rdbms/galt/galt/incident/incdir_129708/
[oracle@riserver2 incdir_129708]$ ls -l
total 7408
-rw-r-----. 1 oracle root 7561282 Jun 21 05:35 galt_pmon_3005_i129708.trc
-rw-r-----. 1 oracle root 19034 Jun 21 05:35 galt_pmon_3005_i129708.trm
下面就使用IPS进行打包:
adrci> set homepath diag/rdbms/galt/galt
adrci> ips create package incident 129708
Created package 1 based on incident id 129708, correlation level typical
adrci> ips generate package 1 in /home/oracle/diag
Generated package 1 in file /home/oracle/diag/ORA4030_20140621184527_COM_1.zip, mode complete
Additional incremental files:
/home/oracle/diag/ORA4030_20140621184527_INC_2.zip
解压缩这两个文件可以看到像alert日志等都打进来了,这里两文件压缩后是17MB左右,但alert日志就有1.7GB,所以压缩效率还很高。