直到今天,我才开始接触oracle 11g,先了解其新特性,以下这些是我的新特性读书笔记:
第一部分:(Automatic Diagnostic Repository)ADR
在oracle 11g中,你不能在目录$ORACLE_BASE/diag/rdbms/$INSTANCE_NAME/$ORACLE_SID/alert中直接读取alert日志。而是读取其中的log.xml文件。该文件不是文本文件。除了所有标准的数据库操作信息外,alert日志里也包含关于事件的信息。你也可以从目录 $ORACLE_BASE/diag/rdbms/$INSTANCE_NAME/$ORACLE_SID/trace中读取以前版本的alert日志。
problems和incidents (问题和事件)
围绕着oracle 11g错误诊断结构有两种新的概念:problems和incidents。
problems:
任何严重错误称之为problems,比如ORA-600错误,ORA-04031错误。所有涉及数据库problems的源数据都存储在ADR中。每一个问题分配一个关键字,以便于标识和描述问题。问题关键字包括oracle错误号和错误变量值。
incidents:
是一次问题的产生。一个问题可能会产生多次。每一次就是一个事件。每个事件有它自己的事件ID.
比如:
INCIDENT_ID PROBLEM_KEY CREATE_TIME
------------ ------------------ ---------------------------
8801 ORA 600 [4899] 27-MAR-07 06.14.41.04-05:00
当某一个事件产生时。在数据库里做三件事情:
为该事件创建一个告警日志行并分配合适安全告警。
在alert日志里创建相关条目。
收集和存储诊断数据放置在ADR结构中合适子目录中。
不能够禁止自动创建严重错误事件。
事件在ADR中有保留策略:
事件元数据保留在ADR中默认一年。
事件文件和dump保留在ADR中默认是一个月。
可以使用事件package configuration更改这些保留策略。后台进程MMON自动清洗过期的ADR数据。
incident packaging service:
在oracle 11g中,你可以使用IPS来搜寻关于某一个事件或错误的相关trace file,dump file和告警日志并将其打包成压缩文件。
这个特性称之为(incident packaging service)IPS。
ADR的结构和位置:
初始化参数diagnostic_dest指定了ADR的根目录。即使你忽略了该初始化参数。oracle也会创建ADR。
如果你设置了ORACLE_BASE环境变量,那么diagnostic_dest缺省值是该目录。如果你没有设置ORACLE_BASE变量,该参数值为$ORACLE_HOME/log目录。
ADR存储所有oracle产品的诊断数据。ADR为每一个oracle产品及其实例分配一个单独的home目录。因此一个ADR目录包含多个home目录。
每一个ADR的home目录是一个为每一个数据库实例或其它oracle产品或组件存储其诊断文件。其目录结构如下:
ADR_base/diag/product_type/product_id/instance_id/
比如一个 diagnostic_dest初始化参数为 /u05/app/oracle。那么一个oracle数据库的sid为prod1的home目录就如下所示:
/u05/app/oracle/diag/rdbms/prod1/prod1/
在一个ADR的home目录下有很多子目录:
alert:一个实例的告警日志文件(xml格式)。
cdump:core文件。
hm:健康检查报告。
incident:每一个事件一个子目录,其中包含所有trace dump文件。
incpkg:你创建的事件包,用于发给oracle支持所用。
ir:包含实例事件报告。
trace:存储回话trace文件。
可以通过视图v$diag_info来查询目录及其位置:
SQL> select name, value from v$diag_info;
NAME VALUE
------------------- ---------------------------
Diag Enabled TRUE
ADR Base /u01/app/oracle
ADR Home /01/app/oracle/diag/rdbms/prod/prod1
Diag Trace /u01/app/oracle/diag/rdbms/prod/prod1/trace
Diag Alert /u01/app/oracle/diag/rdbms/ prod/prod1/alert
Diag Incident /u01/app/oracle/diag/rdbms/prod/prod1/incident
Diag Cdump /u01/app/oracle/diag/rdbms/ prod/prod1/cdump
Health Monitor /u01/app/oracle/diag/rdbms/ prod/prod1/hm
Default Trace File /u01/app/oracle/diag/rdbms/ prod/prod1/
trace/eleven_ora_9417.trc
Active Problem Count 3
Active Incident Count 8
正如你所见,视图v$diag_info中包括问题和事件数量。
adrci接口:
oracle为我们提供了一个挖掘ADR里的诊断数据的接口,叫adrci。这个命令行工具提供很多丰富的功能,比如将问题和事件打包为一个zip文件发给oracle技术支持。这些被压缩的诊断数据包括trace及dump文件,alert log条目以及oracle 11g的健康监视报告。可以使用adrci的交互模式或使用操作系统的脚本批处理执行这些命令。
在oracle用户执行adrci
[oracle@node1 ~]$ adrci
ADRCI: Release 11.1.0.6.0 - Beta on Thu Apr 5 09:23:37 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
ADR base = "/home/oracle"
adrci>
输入帮助:
adrci> help
HELP [topic]
Available Topics:
CREATE REPORT
ECHO
EXIT
HELP
HOST
IPS
PURGE
RUN
SET BASE
SET BROWSER
SET CONTROL
SET ECHO
SET EDITOR
SET HOMES | HOME | HOMEPATH
SET TERMOUT
SHOW ALERT
SHOW BASE
SHOW CONTROL
SHOW HM_RUN
SHOW HOMES | HOME | HOMEPATH
SHOW INCDIR
SHOW INCIDENT
SHOW PROBLEM
SHOW REPORT
SHOW TRACEFILE
SPOOL
There are other commands intended to be used directly by Oracle, type
"HELP EXTENDED" to see the list
adrci>
查看home目录:
adrci> show home
ADR Homes:
diag/tnslsnr/node1/listener
diag/clients/user_oracle/host_514214572_11
diag/rdbms/rac/rac
adrci>
为了在shell脚本中使用adrci,你可以使用命令行参数exec来调用adrci。比如:
adrci exec="command[; command]..."
例如你想在脚本里使用show homes和show incident,使用如下语法:
adrci exec="show homes; show incident"
[oracle@node1 ~]$
[oracle@node1 ~]$ adrci exec="show homes; show incident"
ADR Homes:
diag/tnslsnr/node1/listener
diag/clients/user_oracle/host_514214572_11
diag/rdbms/rac/rac
ADR Home = /home/oracle/diag/tnslsnr/node1/listener:
*************************************************************************
0 rows fetched
ADR Home = /home/oracle/diag/clients/user_oracle/host_514214572_11:
*************************************************************************
0 rows fetched
ADR Home = /home/oracle/diag/rdbms/rac/rac:
*************************************************************************
0 rows fetched
[oracle@node1 ~]$
每一个命令必须使用分号隔开。
下面这个例子是使用ADR命令行去执行vi alert命令。
adrci exec="set homepath diag/rdbms/rac/rac;set editor vi;show alert"
另外,你还可以使用管道方式来封装一个shell脚本,比如下面这个例子是查看alert日志条目中包含ORA-的相关错误及其错误发生的时间。
adrci << EOF
set homepath diag/rdbms/rac/rac
set editor vi
show alert -p "message_text like '%ORA-%'"
EOF
比如使用如下命令查看所有ORA-错误:
adrci> set homepath diag/rdbms/rac/rac
adrci> set editor vi
adrci> show alert -p "message_text like '%ORA-%'"
ADR Home = /home/oracle/diag/rdbms/rac/rac:
*************************************************************************
Output the results to file: /tmp/alert_10191_1638_rac_1.ado
2012-03-29 20:56:12.266000 +08:00
ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...
2012-03-29 20:56:27.810000 +08:00
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_ora_10453.trc:
ORA-00313: ??????? 1 (???? 1) ???
ORA-00312: ???? 1 ?? 1: '/home/oracle/oradata/rac/redo01.log'
ORA-27037: ????????
Linux Error: 2: No such file or directory
Additional information: 3
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_ora_10453.trc:
ORA-00313: ??????? 2 (???? 1) ???
ORA-00312: ???? 2 ?? 1: '/home/oracle/oradata/rac/redo02.log'
ORA-27037: ????????
Linux Error: 2: No such file or directory
Additional information: 3
2012-03-29 20:56:29.286000 +08:00
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_ora_10453.trc:
ORA-00313: ??????? 3 (???? 1) ???
ORA-00312: ???? 3 ?? 1: '/home/oracle/oradata/rac/redo03.log'
ORA-27037: ????????
Linux Error: 2: No such file or directory
Additional information: 3
2012-03-29 21:04:31.458000 +08:00
ORA-1089 : opidrv aborting process J000 ospid (10641_3081467584)
2012-04-03 21:14:42.300000 +08:00
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_j008_6295.trc:
ORA-12012: error on auto execute of job 11689
ORA-01403: no data found
像vi编辑器一样退出后,可以在文件/tmp/alert_10191_1638_rac_1.ado中找到屏幕输出结果。便于分析,可见这个特性和unix中的grep |ORA- 命令是大不相同,因为后者只能输出错误行,但是错误行发生的时间却不能显示,而 show alert则同时显示错误和发生时间。
但是这里要注意:
如果执行如下命令,会让你选择home目录,比如:
adrci> show alert
Choose the alert log from the following homes to view:
1: diag/tnslsnr/node1/listener
2: diag/clients/user_oracle/host_514214572_11
3: diag/rdbms/rac/rac
Q: to quit
Please select option:
这里执行show alert时并没有指定home目录,而是直接在root目录环境下执行show alert命令,因此你需要指定home目录环境或者选择在哪个home目录环境下执行该命令:
而采用下面这种方式,就不需要选择home目录,因为已经明确指定home目录(注意这里set homepath不能指定绝对路径):
adrci> set homepath diag/rdbms/rac/rac
adrci> show alert -p "message_text like '%ORA-%'"
ADR Home = /home/oracle/diag/rdbms/rac/rac:
*************************************************************************
Output the results to file: /tmp/alert_10511_1638_rac_2.ado
2012-03-29 20:56:12.266000 +08:00
ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...
2012-03-29 20:56:27.810000 +08:00
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_ora_10453.trc:
ORA-00313: ??????? 1 (???? 1) ???
ORA-00312: ???? 1 ?? 1: '/home/oracle/oradata/rac/redo01.log'
ORA-27037: ????????
Linux Error: 2: No such file or directory
Additional information: 3
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_ora_10453.trc:
ORA-00313: ??????? 2 (???? 1) ???
ORA-00312: ???? 2 ?? 1: '/home/oracle/oradata/rac/redo02.log'
ORA-27037: ????????
Linux Error: 2: No such file or directory
Additional information: 3
2012-03-29 20:56:29.286000 +08:00
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_ora_10453.trc:
ORA-00313: ??????? 3 (???? 1) ???
ORA-00312: ???? 3 ?? 1: '/home/oracle/oradata/rac/redo03.log'
ORA-27037: ????????
Linux Error: 2: No such file or directory
Additional information: 3
2012-03-29 21:04:31.458000 +08:00
ORA-1089 : opidrv aborting process J000 ospid (10641_3081467584)
2012-04-03 21:14:42.300000 +08:00
Errors in file /home/oracle/diag/rdbms/rac/rac/trace/rac_j008_6295.trc:
ORA-12012: error on auto execute of job 11689
ORA-01403: no data found
~
当然某些命令可以支持当前home目录为多个,比如show tracefile等:
当不指定homepath或指定多个homepath时,那么默认是显示所有当前homepath下的tracefile。如果你单独指定某一个homepath,那么该命令只显示当前homepath的tracefile。
有些命令不支持当前homepath为多个,如前面的show alert,又如下面的命令:
adrci> ips create package;
DIA-48448: This command does not support multiple ADR homes
adrci>
这个时候,你必须设置单个homepath以支持该命令:
drci> set homepath diag/rdbms/rac/rac
adrci> ips create package;
Created package 1 without any contents, correlation level typical
你也可以像sqlplus一样将命令显示结果传送到一个文件中,如下所示:
adrci> spool /u01/app/oracle/strip_alert.log
adrci> show alert
adrci> spool off
显示事件:
adrci> show incident
ADR Home = C:\ORCL11\APP\ORACLE\DIAG\diag\rdbms\auxdb\auxdb:
**********************************************************************
0 incident info records fetched
ADR Home = C:\ORCL11\APP\ORACLE\DIAG\diag\rdbms\eleven\eleven:
**********************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
------------ -------------- ---------------------------
8801 ORA 600 [4899] 17-MAR-07 06.14.41.04-05:00
16417 ORA 7445 [ACCESS_VIOLATION] 17-MAR-07 06.15.46.7905:00
2 incident info records fetched
ADR Home = C:\ORCL11\APP\ORACLE\DIAG\diag\rdbms\orcl11\orcl11:
**********************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
-------------------- -------------------- ---------------------------
113769 ORA 1578 [2] [66598] 27-MAR-07 10.00.10.91-05:00
113770 ORA 1578 27-MAR-07 10.00.11.86-05:00
113771 ORA 1578 27-MAR-07 10.00.12.10-05:00
3 incident info records fetched
adrci>
上面的结果显示分析如下:
数据库auxdb没有打开的事件,数据库eleven有两个打开的事件,数据库orcl11有三个打开的事件。
如果你想下钻到具体某一个事件的详细情况,可是使用如下命令:
adrci> show incident -mode detail -p "incident_id=113769"
...
----------------------------------------------------------
INCIDENT FILES:
INCIDENT_ID 113769
OWNER_ID 1
BFILE C:\ORCL11\APP\ORACLE\DIAG\diag\rdbms\orcl11\orcl1
\incident\incdir_113769/orcl11_j003_4244_i113769.trc
Incident file number: 1
----------------------------------------------------------
1 incident info records fetched
adrci>
show incident命令有两个选项,-p 和-mode。你可是使用-p来界定字段,该字段必须使用双引号界定。下面的命令显示了可以使用的字段名:
adrci> set homepath diag/rdbms/rac/rac
adrci> describe incident
Name Type NULL?
----------------------------- --------------- -----------
INCIDENT_ID number
PROBLEM_ID number
CREATE_TIME timestamp
CLOSE_TIME timestamp
STATUS number
FLAGS number
FLOOD_CONTROLLED number
ERROR_FACILITY text(10)
ERROR_NUMBER number
ERROR_ARG1 text(64)
ERROR_ARG2 text(64)
ERROR_ARG3 text(64)
ERROR_ARG4 text(64)
ERROR_ARG5 text(64)
ERROR_ARG6 text(64)
ERROR_ARG7 text(64)
ERROR_ARG8 text(64)
SIGNALLING_COMPONENT text(64)
SIGNALLING_SUBCOMPONENT text(64)
SUSPECT_COMPONENT text(64)
SUSPECT_SUBCOMPONENT text(64)
ECID text(64)
IMPACT number
adrci>
除了-p选项外,-mode选项有三个字段可用,分别是detail,basic,brief。后两者显示基本内容,不显示详细内容。
packaging incidents(打包事件)
oracle 11g的一个很强有力的工具是打包事件。利用这个打包事件压缩的文件夹提交给oracle的支持来帮助解决分析问题。
一旦你创建一个事件包,将添加一个或多个相关的问题到打包文件中。其中包括trace文件,dump文件等。
缺省情况下,每一个问题的事件包仅仅包括第一个和最后三个事件。事件包包含所有可以用于诊断的事件。也可以指定事件发生的时间或数
量范围来打包。
一旦你创建了事件包,那么你能添加或移除文件。
具体步骤如下:
1:创建一个逻辑包:使用命令是ips create package。该命令可以创建一个空包,也可以能会创建自动包含诊断数据的包。这个命令有很多
变量,你可以选择创建某一特定问题号,事件号,问题关键字,或基于期间的包。
2:添加诊断数据到逻辑包:这是一个可选步骤,如果你在第一步创建的是一个空包,那么你可以使用这一步骤添加诊断文件或数据。
3:产生zip文件:可以增量添加文件到zip文件里。
示例如下:
创建包:
adrci>ips create package
Created package 1 without any contents, correlation level typical
adrci>
添加诊断信息到空包中:
adrci>ips add incident 113769 package 1;
kaged: ADD INCIDENT
Cmd: --- incid 113769
Cmd: --- pkgid 1
adrci>
这一步仍然没有实际的诊断数据,你还需要执行第三部添加诊断元数据到包中。
adrci>ips generate package 4 in /u01/app/oracle/adrci/support
Cmd: GENERATE PACKAGE
Cmd: package id is 4
Cmd: file C:\ORCL11\APP\ORACLE
Cmd: --- mode full
adrci>
这个命令创建一个zip文件在/u01/app/oracle/adrci/目录中。这样创建的压缩文件称之为完全压缩文件。你也可以产生一个增量zip文件。
adrci> ips generate package 5 in /u01/app/oracle/adrci/support incremental
比如会产生以下两个文件:
ORA222_20070304124515_COM_1.zip
ORA222_20070304124515_INC_2.zip
第一个文件是完整zip文件,第二个是增量zip文件。
以下是ips命令的各种变种:
• ips create package creates an empty package.
• ips create package problem creates a package based on a problem ID.
• ips create package problem key creates a problem key–based package.
• ips create package incident creates a package based on an incident ID.
• ips create package time creates a package for a specified time range.