龚玥电话情思原唱:Oracle 11g 新特性ADR

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 22:52:12
ADR 主目录
既然所有的焦点都集中于数据库的诊断能力,那么 Oracle 数据库是不是应该存储以结构化方式组织的所有跟踪文件、日志文件等等?在 Oracle 数据库 11g 中确实如此。自动诊断信息库 (ADR) 文件位于一个指定为诊断目标(或 ADR 基目录)的常用目录下的目录中。该目录由初始化参数 (diagnostic_dest) 设置。默认情况下,它设置为 $ORACLE_BASE,但是您可以将其显式设置为某些独占目录。(但是不建议这样做。)该目录下有一个 diag 子目录,您将在这个子目录中发现存储诊断文件的子目录。
ADR 存储所有组件(ASM、CRS、监听器等)的日志和跟踪文件,包括数据库本身的日志和跟踪文件。这使您可以方便地在一个位置查找特定的日志。
在 ADR 基目录中,可以有多个 ADR 主目录,每个组件和实例一个。例如,如果服务器有两个 Oracle 实例,则有两个 ADR 主目录。下面是数据库实例的 ADR 主目录的目录结构。
目录名称
说明
<在 DIAGNOSTIC_DEST 参数中提到的目录>
→diag
→rdbms
→<数据库名称>
→<实例名称>
→alert
XML 格式的警报日志存储在这里。
→cdump
核心转储存储在这里,相当于早期版本中的 core_dump_dest。
→hm
运行情况监视对多个组件运行检查,它在这里存储某些文件。
→incident
所有事件转储都存储在这里。
→<所有事件目录存在这里>
每个事件存储在一个不同的目录中,这些目录都存储在这里。
→incpkg
当您打包事件时(在本文中可以了解打包),某些支持文件存储在这里。
→metadata
有关问题、事件、程序包等的元数据存储在这里。
→trace
用户跟踪文件和背景跟踪文件存储在这里,并附带警报日志的文本版本。
例如,如果您的数据库名称为 ODEL11 并且实例名称也为 ODEL11(大写),则 ADR 主目录的路径为 /home/oracle/diag/rdbms/odel11/ODEL11。现在,您会在该 ADR 主目录下看到不同的子目录: $ lsalert cdump hm incident incpkg ir lck metadata stage sweep trace要支持这个新结构,忽略以前版本中的 *_dest 参数(background_dump_dest 和 user_dump_dest)。(core_dump_dest 未被忽略;实际上,Oracle 建议您将其设置为很大的核心转储。)如果您要 10g 升级到 11g,则根本不应设置它们,应该将它们从初始化参数文件中删除以免以后发生冲突。
其他组件的 ADR 目录结构与此相似。例如,对于 ASM 实例,“diag”下的目录名为 asm 而不是 rdbms。目录结构的其他部分保持不变。asm 的目标名称为 +asm。例如,我的 ASM 的 ADR 主目录如下所示:
$ pwd/home/oracle/diag/asm/+asm/+ASM$ lsalert cdump hm incident incpkg ir lck metadata stage sweep trace对于监听器,diag 下的目录为 tnslsnr,在该目录下是另一个以主机名命名的目录,然后在该主机名目录下是另一个以监听器名称命名的目录。在该监听器名称目录下,您会看到其他目录。
<在 DIAGNOSTIC_DEST 参数中提到的目录>
→ diag
→ tnslsnr
→ <服务器的主机名>
→ <监听器名称>
→ alert
→ trace ...
例如,如果主机名为 oradba3 并且监听器名称为“listener”(默认名称),则该目录为 /home/oracle/diag/tnslsnr/oradba3/listener。在该目录下创建所有其他目录(alert、trace、metadata 等)。与警报日志一样,监听器日志文件也作为 XML 条目存储在 alert 子目录下。普通的文本监听器日志文件仍然在 trace 目录下创建。
新视图 V$DIAG_INFO 显示有关 ADR 主目录的所有详细信息。在我的 RDBMS 主目录中,它显示如下:
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/odel11/ODEL11 1 Diag Trace /home/oracle/diag/rdbms/odel11/ODEL11/trace 1 Diag Alert /home/oracle/diag/rdbms/odel11/ODEL11/alert 1 Diag Incident /home/oracle/diag/rdbms/odel11/ODEL11/incident 1 Diag Cdump /home/oracle/diag/rdbms/odel11/ODEL11/cdump 1 Health Monitor /home/oracle/diag/rdbms/odel11/ODEL11/hm 1 Default Trace File /home/oracle/diag/rdbms/odel11/ODEL11/trace/ODEL11_ora_3908.trc 1 Active Problem Count 3 1 Active Incident Count 37 11 rows selected.这只显示了有关该实例的 ADR 信息。要查看其他实例的该信息,只需连接到该实例并从 v$diag_info 中选择。视图中的各列都具有自我说明性。Default Trace File 指明当前会话的跟踪文件。Active Problem Count 和 Incident Count 针对以前描述的问题和事件。
您可以通过两种方式在 ADR 中访问文件和执行其他操作。最简单的方法是通过您在前面看到的企业管理器。另一种方法是使用命令行工具 asrci.下面我们来看看如何使用该工具。在 UNIX(或 Windows)命令提示符下,键入“adrci”:
$ adrci ADRCI: Release 11.1.0.6.0 - Beta on Sun Sep 23 23:22:24 2007 Copyright (c) 1982, 2007, Oracle. All rights reserved. ADR base = ”/home/oracle”如您在前面所了解的那样,存在多个 ADR 主目录,Oracle 组件的每个实例一个。因此,第一个任务是显示存在多少个主目录。该命令为 show homes。 adrci> show homesADR Homes: diag/rdbms/odel11/ODEL11diag/rdbms/dbeng1/DBENG1diag/clients/user_unknown/host_411310321_11diag/tnslsnr/oradba3/listener如您所见,存在多个主目录。要在特定主目录上进行操作,您应该使用 set homepath 命令: adrci> set homepath diag/rdbms/odel11/ODEL11设置后,您可以在提示符下发出许多命令。您可以尝试的第一个命令是 help,它将显示所有可用的命令。下面是输出的简要摘录: adrci> help HELP [topic] Available Topics: CREATE REPORT ECHO EXIT HELP HOST IPS ...如果您希望了解有关特定命令的更多信息,执行 help <命令>。例如,如果您希望获得有关 show incident 命令的使用帮助,执行: adrci> help show incident Usage: SHOW INCIDENT [-p ] [-mode BASIC|BRIEF|DETAIL] [-last | -all] [-orderby (field1, field2, ...) [ASC|DSC]] Purpose: Show the incident information. By default, this command will only show the last 50 incidents which are not flood controlled. Options: [-p ]: The predicate string must be double-quoted. [-mode BASIC|BRIEF|DETAIL]: The different modes of showing incidents.[... and so on ...]这种将统计信息的收集和发布相分开的方法也可用于分区的表。假定您正在逐个分区地加载一个表。您不希望只提供部分信息给优化程序,您更希望所有分区的统计信息能够同时被优化程序看到。但是您还想在加载分区后立刻利用这一时间。那么,您可以在加载分区后立即收集它的统计信息,但不发布这些信息。分析完所有分区后,您可以一次性发布这些统计信息。
通过输出,您可以了解命令的用法。现在要了解已经记录了多少事件,您可以执行:
adrci> show incident -mode basic ADR Home = /home/oracle/diag/rdbms/odel11/ODEL11:******************************************************************INCIDENT_ID PROBLEM_KEY CREATE_TIME -------------------- ---------------------------------------------------- ---------------------------------------- 14556 ORA 600 [KSSRMP1] 2007-10-17 04:01:57.725620 -04:00 14555 ORA 600 [KSSRMP1] 2007-10-16 18:45:03.970884 -04:00 14435 ORA 603 2007-10-16 06:06:46.705430 -04:00 14427 ORA 603 2007-10-16 06:06:42.007937 -04:00 14419 ORA 603 2007-10-16 06:06:30.069050 -04:00 6001 ORA 4031 2007-08-28 14:50:01.355783 -04:00 5169 ORA 4031 2007-09-04 19:09:36.310123 -04:00 5121 ORA 4031 2007-09-03 14:40:14.575457 -04:00 5017 ORA 4031 2007-09-04 19:09:30.969226 -04:00 4993 ORA 4031 2007-09-04 19:09:33.179857 -04:00 4945 ORA 4031 2007-09-04 19:09:30.955524 -04:00 4913 ORA 4031 2007-09-04 19:09:31.641990 -04:00
将显示所有事件的列表。现在,您可以获得特定事件的详细信息,如下所示:
adrci> show incident -mode detail -p "incident_id=14556" ADR Home = /home/oracle/diag/rdbms/odel11/ODEL11:************************************************************************* **********************************************************INCIDENT INFO RECORD 1********************************************************** INCIDENT_ID 14556 STATUS ready CREATE_TIME 2007-10-17 04:01:57.725620 -04:00.[... and so on ...]. INCIDENT_FILE /home/oracle/diag/rdbms/odel11/ODEL11/trace/ODEL11_mmon_14831.trc OWNER_ID 1 INCIDENT_FILE /home/oracle/diag/rdbms/odel11/ODEL11/incident/incdir_14556/ODEL11_mmon_14831_i14556.trc1 rows fetchedadcri 命令行中显示的信息与您将在企业管理器屏幕中看到的内容相似。但是后者可能更加简单,用户友好得多。当您由于某种原因无法访问 EM Support Workbench 时,adcri 很有用。您还可以使用 adcri 缩减警报日志文件或搜索某些日志(监听器、css、crs、警报等)中的特定模式等。如果您希望以编程方式使用 ADR,adcri 也很有用。 新的警报日志
在 Oracle 数据库 11g 中,警报日志是用 XML 格式编写的。为了与以前的工具兼容,传统的警报日志也在 trace 目录下的 ADR 主目录中提供。例如,在上述示例中,您可以在 /home/oracle/diag/rdbms/odel11/ODEL11/trace 目录中找到 alert_ODEL11.log。但是其他警报日志为 XML 格式,位于 ADR 主目录下的 alert 子目录中。我们来看文件: $ pwd/home/oracle/diag/rdbms/odel11/ODEL11/alert$ ls -ltrtotal 60136-rw-r----- 1 oracle oinstall 10485977 Sep 13 17:44 log_1.xml-rw-r----- 1 oracle oinstall 10486008 Oct 16 06:35 log_2.xml-rw-r----- 1 oracle oinstall 10485901 Oct 16 07:27 log_3.xml-rw-r----- 1 oracle oinstall 10485866 Oct 16 08:12 log_4.xml-rw-r----- 1 oracle oinstall 10486010 Oct 17 23:56 log_5.xml-rw-r----- 1 oracle oinstall 9028631 Oct 21 20:07 log.xml注意,有多个文件:log_1.xml、log_2.xml 等。当 log.xml 达到一定大小时,该文件重命名为 log_?.xml,系统启动一个新文件。这可以防止警报日志变得过大而无法管理。
新的警报日志通过 adrci 实用程序 — ADR 命令行工具进行访问,您已经在前面的部分对它有所了解。通过 adrci 工具发出:
adrci> show alert Choose the alert log from the following homes to view: 1: diag/rdbms/odel11/ODEL11 2:diag/clients/user_oracle/host_1967384410_11 3:diag/clients/user_unknown/host_411310321_11 4:diag/tnslsnr/oradba3/listener Q:to quit Please select option: 您可以从菜单中选择一个主目录或者自己提供一个特定的主目录: adrci> set homepath diag/rdbms/odel11/ODEL11adrci> show alert ADR Home = /home/oracle/diag/rdbms/odel11/ODEL11:[... and the whole alert log show up here ...]您可能不想选择整个警报日志,只是希望指定结尾的几行,例如 10 行(类似于 UNIX 中的 tail -10 命令): adrci> show alert -tail 102007-09-23 19:57:44.502000 -04:00Errors in file /home/oracle/diag/rdbms/odel11/ODEL11/trace/ODEL11_arc1_20810.trc:[... the rest of the 10 lines ...]或许它最常用的是不断地显示警报日志的后几行,有点类似于 UNIX 中的 tail -f 命令。 adrci> show alert -tail -f您可以在 adrci 命令行提示符下执行脚本。下面是一个 Windows 脚本示例,它设置主目录并显示警报日志的最后 10 行: C:\>type show_alert_10lines.cmdset homepath diag\rdbms\lapdb11\lapdb11show alert -tail 10您可以按以下方式调用该脚本: adrci script=show_alert_10lines.cmd类似的功能是 exec 参数,它允许您直接从命令行运行命令: adrci exec=”show homes; show catalog”在 adrci 提示符下,您还可以使用“run”命令或“@”符号运行命令: adrci>> @show_alert_10lines.cmd警报日志为 XML 文件的一个最大好处是信息以结构化方式编写。警报日志不再是非结构化数据的信息库。XML 格式使文件可以作为表通过 adrci 进行查看。要查看该“表”的字段,使用 describe 命令: adrci>>describe alert_extName Type NULL?----------------------------- --------------- -----------ORIGINATING_TIMESTAMP timestampNORMALIZED_TIMESTAMP timestampORGANIZATION_ID text(65)COMPONENT_ID text(65)HOST_ID text(65)HOST_ADDRESS text(17)MESSAGE_TYPE numberMESSAGE_LEVEL numberMESSAGE_ID text(65)MESSAGE_GROUP text(65)CLIENT_ID text(65)MODULE_ID text(65)PROCESS_ID text(33)THREAD_ID text(65)USER_ID text(65)INSTANCE_ID text(65)DETAILED_LOCATION text(161)UPSTREAM_COMP_ID text(101)DOWNSTREAM_COMP_ID text(101)EXECUTION_CONTEXT_ID text(101)EXECUTION_CONTEXT_SEQUENCE numberERROR_INSTANCE_ID numberERROR_INSTANCE_SEQUENCE numberMESSAGE_TEXT text(2049)MESSAGE_ARGUMENTS text(129)SUPPLEMENTAL_ATTRIBUTES text(129)SUPPLEMENTAL_DETAILS text(129)PARTITION numberRECORD_ID numberFILENAME text(513)PROBLEM_KEY text(65)由于信息是非结构化的,您可以进行精度搜索。假设您希望搜索警报日志中与某个字段中的特定值匹配的行。示例如下: adrci>> show alert -p "module_id='DBMS_SCHEDULER'"这显示模块 id 为 dbms_scheduler 的进程编写的所有行。您还可以使用不等式运算符(不包含 DBMS_SCHEDULER): adrci>>show alert -p "module_id != 'DBMS_SCHEDULER'"否则,可以使用模式匹配运算符: adrci>>show alert -p "module_id like '%SCHEDULER'"spool 命令的作用与它在 SQL*Plus 中的同名命令一样。您可以删除输出中的多余行并生成一个文件: adrci>> spool aadrci>> show alert -tail 50adrci>> spool off它创建一个包含警报日志的后 50 行的文件 (a.ado)。该选项的一大用途是从警报日志中提取特定类型的消息。如果您希望从警报日志中提取与流相关的语句,使用以下命令: adrci> show alert -p "message_text like '%STREAM%'"您也可以通过 adrci 命令提示符查看在 ADR 基目录中生成的所有跟踪文件。 adrci>> show tracefile 上述命令显示在 ADR 目录中生成的所有跟踪文件的列表。要按相反的顺序显示特定类型的跟踪文件(例如,“reco”),使用以下命令: adrci>>show tracefile %reco% -rt 18-JUL-07 22:59:50 diag\rdbms\lapdb11\lapdb11\trace\lapdb11_reco_4604.trc 12-JUL-07 09:48:23 diag\rdbms\lapdb11\lapdb11\trace\lapdb11_reco_4236.trc 11-JUL-07 10:30:22 diag\rdbms\lapdb11\lapdb11\trace\lapdb11_reco_3256.trc
adrci提供了许多其他选项,可通过最高效的方式查看警报日志和相关文件。有关adrci命令的完整描述,请参见文档。