《XXXX1012-Oracle数据库诊断事件详解(如何获取所有内部事件号)11233.docx》由会员分享,可在线阅读,更多相关《XXXX1012-Oracle数据库诊断事件详解(如何获取所有内部事件号)11233.docx(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Oracle数据库诊断事件详解什么是Oracle数据库的诊断事件呢?简而言之的来说Oracle的诊断事件就是Oracle数据库中用于实现一些特殊功用的类别,一般主要用于实现以下几个方面的功用: 改变Oracle数据库的行为 启用收集Oracle数据库的跟踪或者调试信息 启用对Oracle数据库的额外的错误检测4 5r/Rd0一、 Oracle数据库诊断事件简介ITPUB个人空间K$g,r aNVkeCG什么是Oracle数据库的诊断事件呢?简而言之的来说Oracle的诊断事件就是Oracle数据库中用于实现一些特殊功用的类别,一般主要用于实现以下几个方面的功用:p L8z%I6?&djZ$Z3
2、F0 改变Oracle数据库的行为u R.|5d;+_V4f*OUD0 启用收集Oracle数据库的跟踪或者调试信息ITPUB个人空间,.A%ct8mh4b 启用对Oracle数据库的额外的错误检测如何去设置Oracle数据库的各种诊断事件呢?我们首先来给设置诊断事件下一个简单的定义,就是让Oracle数据库产生跟踪信息日志文件。设置诊断事件有如下的四种方法:ITPUB个人空间t)R$l 在INIT或者SPFILE初始化文件中设置ITPUB个人空间sv8ONy1S6K这种设置的诊断事件都是针对于整个实例的:ITPUB个人空间X:O/A4a| s&yevent=event trace name
3、context forever, level level;ITPUB个人空间ZJy+xF!A如果需要设置多个诊断事件,可以通过以下两种方法:ITPUB个人空间g X|)O,Q*H方法一:使用冒号分隔开两个诊断事件Anj8F0event = 10248 trace name context forever, level 10:10249 trace name context forever, level 104+NQc7l0mO-p0方法二:使用连续的行设置诊断事件ITPUB个人空间vA,dW ;A5E!ZWevent = 10248 trace name context forever, le
4、vel 10ITPUB个人空间!BQvmGmevent = 10249 trace name context forever, level 10ITPUB个人空间 p#|W(I/nQC0F,afY z 在当前SQL会话中设置N8l#q*SBT&F0针对整个实例的诊断事件的设置:%?kEX.?zHn0ALTER SYSTEM SET EVENTS event trace name context forever, level level;ITPUB个人空间W2Ez*y3A5U禁用设置的诊断事件:ITPUB个人空间4dwbnFSrALTER SYSTEM SET EVENTS event trac
5、e name context off;f M-s6TI6nY0针对当前会话的诊断事件的设置:_51K t!vr0ALTER SESSION SET EVENTS event trace name context forever, level level;ITPUB个人空间z:y)s&TJ禁用设置的诊断事件:$QZ Zq0ALTER SESSION SET EVENTS event trace name context off;ITPUB个人空间T4y;l;BU8b| 在另外一个SQL会话中使用DBMS_SYSTEM.SETEV存储过程设置ITPUB个人空间c9k:h%ox.H.KFEXECUT
6、E sys.dbms_system.set_ev(sid, serial#, , , )ITPUB个人空间k&G#mIQ其中的SID,SERIAL#都是从视图V$SESSION中获得的。G4tMunkQ)S0 在另外一个会话中使用debug工具设置cR D5T7J&JW0对一个进程设置诊断事件:8%Tv &qCQ/R+3g4B#xR0ORADEBUG EVENT event TRACE NAME CONTEXT FOREVER, LEVEL levelITPUB个人空间%nN-j;h!cbL$?禁用设置的诊断事件:ITPUB个人空间iTIM3hfORADEBUG EVENT event TRA
7、CE NAME CONTEXT OFFITPUB个人空间&h s/ow$B9wYM对一个会话设置诊断事件:ITPUB个人空间xz*WRORADEBUG SESSION_EVENT event TRACE NAME CONTEXT FOREVER, LEVEL level0Xs;qyb0禁用设置的诊断事件:)nnf4ct r0ORADEBUG SESSION_EVENT event TRACE NAME CONTEXT OFF注: 在Oracle8i以上的版本中,是使用sysdba权限的用户登陆sqlplus后执行ORADEBUG命令;在Oracle7.3/8.0的版本中, 是使用interna
8、l用户登陆svrmgrl后执行ORADEBUG命令;在更早的Oracle版本中使用ORADBX (ORAMBX在VMS系统上)。因为oradebug允许在另外的会话中设置诊断事件,这样就可以跟踪一些平时不太trace的会话,例如对 export工具的诊断。诊断事件可以分成会话级的诊断事件和进程级的诊断事件,进程级的诊断事件是可以在INIT初始化参数文件中设定,会话级的诊断事 件则可以使用alter session.或者alter system .命令来设定。Oracle数据库在检测诊断事件的时候都是先检测会话级的诊断事件,然后再检测进程级的诊断事件。对于设置Oracle数据库的诊断事件都必须遵
9、循一定的语法,例如在会话级别上设置诊断事件可以按照以下的语法来设置:;)JKk4Yt0alter session set events 10181 trace name context forever, level 1000;ITPUB个人空间7uD4q*s;y6q而同样的诊断事件在INIT初始化参数文件中就应该按照以下语法设置:4NS, zCr9k0event=10181 trace name context forever, level 1000ITPUB个人空间y$rz6Jz*Z|e在INIT初始化参数文件中设置诊断事件的时候,一般来说最好在诊断事件后加上相关的注释,注释的内容一般来说应
10、该包括诊断事件的作用、为什么要使用这个诊断事件以及设置诊断事件的时间。ITPUB个人空间&Ls.n2eT9Rr?Nx-X2#k下面这个图是关于设置诊断事件的语法表:ITPUB个人空间#D8V8M-v,TbbxJO E*M!i*pj0诊断事件规定的语法为:ITPUB个人空间fD_)FwB:*qoh0VX%0Event Name:它代表关联事件的符号名或者是一个事件号。如果是immediate,代表是一个立即无条件的诊断事件,不用去等待任何人发布它;也可以是指定的Oracle错误号码,还可以是具体的事件名。RvI_#ie4?4U P0Action:分为和。Action Key Word的值可以是t
11、race、debugger、crash,而qualifiers的语法则是依赖于具体的Action。ITPUB个人空间qe2f t:T,P 当为crash的时候,语法为:ITPUB个人空间y2|nY)_?S;f_ (默认为空)|off (在等待事件中禁用crash)| aftertimes (发生此事件N次后crash)N/uhi;As0 当为debugger的时候,语法为:rO6O)Nx!G0 (默认为空)| off (在等待事件中禁用debugger)| aftertimes (发生此事件N次后debugger)| forever (一旦开始debugger,以后每次发生事件时都要debug
12、ger)| lifetime (一旦开始debugger,以后N次发生事件时都要debugger,然后在此诊断事件中禁用debugger)b#DXHrH0 当为trace的时候,语法为:L7mWA4T&q5sH0name ,*ITPUB个人空间K6A8Vk T9pTrace Name:是关联内部trace号的符号名。其中,context是一种特殊的trace name,它不会去调用调试dump操作,但是却会返回给发起诊断事件者是否context跟踪被激活,跟踪是什么级别的。跟踪的级别是指dump程序内 部使用来控制dump出来详细信息的级别,通常来说,级别越高,dump出来的信息就会越详细,最
13、低级别是1。All是另外一种特殊的trace name,它意味着通过ksdtradv宏在编译的时候声明所有的trace names。如果在诊断事件中关联多余一个以上的trace,至少有一个应该是context,相应的,诊断事件中最后一个关联的动作将返回跟踪的级别, 而且在不同的调用中诊断事件号最好唯一。ITPUB个人空间!4Vp L2kWtrace qualifier的语法为:ITPUB个人空间,tz;K-L R*B4DWq(默认为空)|off(在等待事件中禁用这个trace)| after times (发生此事件N次后开始trace)|forever (一旦激活trace,以后每次发生事件
14、时都要trace)| lifetime (一旦开始trace,以后N次成功发生事件时都要trace,然后在此诊断事件中禁用trace)| level (当trace第一次被激活,设置初始化级别为N,之后激活的trace的级别则由trace type来决定)|type (如何修改以后激活的trace的级别)l6HRv2e7wR0trace type:ITPUB个人空间F2E2mHq*i;increment 升高级别直至最高xvCqg9_2Q0decrement 降低级别到0并且禁用VfQIh?+C0constant 保持级别不变ITPUB个人空间xK(bLmJ$bh:i此外,对于trace的指定
15、,如果设置诊断事件是immediate,那么意味着trace将不会等待诊断事件,在trace qualifier中只需要设置trace的级别,lifetime默认为1。对于设置诊断事件,Oracle数据库提供了四个跟踪信息的类别可以供我们来使用:ITPUB个人空间1ij5Cl eUhW)hm1G 类别一:Dump SomethingITPUB个人空间t7Mudw9l!Z-h这个类别的Trace文件是无条件立即生成的,一般都是dump出Oracle数据库的数据,例如查看重做日志文件的头或者是查看控制文件中的内容等。这类的诊断事件是不可以在INIT或者SPFILE的初始化参数文件中指定的。ITPU
16、B个人空间 Kc&kh&PfWXB 类别二:Trap on Error3C/dLN w-sqO0这个类别的诊断事件是让Oracle每次生成一个errorstack的错误信息的trace文件。!r1dM8r;V ed0 类别三:Change execution pathITPUB个人空间IFdA(T这个类别的诊断事件主要是用于修改某些代码段的可执行路径。例如,设置诊断事件10269就可以让Oracle数据库的后台SMON进程不再进行自由空间的重组的操作。:P2Q5cb9I .r0 类别四:Trace somethingITPUB个人空间l9CFZJ&vv这个类别的诊断事件主要是用于某种特殊的目的
17、而需要获取相应的trace信息,例如对sql调优。最常见的诊断事件10046就是让Oracle数据库去跟踪每条执行的sql语句的访问路径。ITPUB个人空间H:gx/T*|每种类别的诊断事件都有一种或者多种级别,级别有以下四种表现形式:ITPUB个人空间P#W_dF*uJ Range,例如从1到10ITPUB个人空间%;p!kPu5K:W)_:Q&bY bitmask 例如0x01 0x02 0x04 0x08 0x10+okd_Tk0 flag 例如0代表off,1代表onITPUB个人空间7rXpn_#$u&Fk identifier 例如object id, memory address
18、等等在设置使用各种诊断事件的时候,有一些事项是需要注意的:Z;L/8T mz!GC|0 确定使用的诊断事件对于当前的Oracle数据库版本是合法的:因为对于不同版本的Oracle数据库来说,诊断事件的含义和用法都有所不同。ITPUB个人空间8e*_R0J 确定使用的诊断事件允许设定的级别,在很多时候设定的级别不同是会影响到诊断事件所代表的行为的。.M wSJ q$u e&z8u?0 在INITSID.ORA文件中设置的任何诊断事件,如果Oracle数据库需要升级,一定要提前注释或者取消。ITPUB个人空间C+W&jpr9WITPUB个人空间 #HC7p1C大部分的诊断事件的数值都是在10000
19、至10999范围内,使用如下的脚本可以查看到所有的诊断事件:ITPUB个人空间Q;mqguMsw1DSET SERVEROUTPUT ON9N&lk0ZIo0DECLARE ITPUB个人空间U,P&RO:Merr_msg VARCHAR2(120);T-s!I&_h0S0iq#VH0BEGINITPUB个人空间)I*s!Ef4j3in_u-|dbms_output.enable (1000000);ITPUB个人空间1O%BL*u2Ck1FOR err_num IN 10000.10999ITPUB个人空间*mW Y HvLmSLOOP#hn8t.QZO-O0err_msg := SQLER
20、RM (-err_num);pCJf.N&y0IF err_msg NOT LIKE %Message |err_num| not found% THEN.Gd ?*V2_,K)R)l/0dbms_output.put_line (err_msg);ITPUB个人空间b|L1F6u.iEND IF;Fm8q#w7UX3X+_0END LOOP;HC%f*N)oAX0END;OO8w7yMOq%h0/ITPUB个人空间Y6?4|%C6SX+#U在UNIX系统中,可以在$ORACLE_HOME/rdbms/mesg/oraus.msg这个文件中找到所有的诊断事件的名称和定义。使用如下脚本可以输出所
21、有的详细的诊断事件的信息:ITPUB个人空间%_5Acu/r Pevent=10000*W A%q%ayP$m!U0while $event -ne 10999 pc;Z rEkbr0doITPUB个人空间gov4Z4Cevent=expr $event + 12v/*K5Km0O8N0oerr ora $eventITPUB个人空间,#V a4Z0Av%$Vdone使用如下脚本可以检查当前会话中设置了哪些诊断事件:W%Y/BM G:i0SET SERVEROUTPUT ONi-?HF_rP0DECLAREITPUB个人空间 &gmC)L)g#kl_level NUMBER;ITPUB个人空间
22、FZ72A&zL wBEGINITPUB个人空间$SkoEBIFOR l_event IN 10000.10999ITPUB个人空间9a6sVsT,r7uFLOOP!h0Bnl)B(0dbms_system.read_ev (l_event,l_level);9g1T,pA*d3C0IF l_level 0 THENca,O+%x E0dbms_output.put_line (Event |TO_CHAR (l_event)|*d%Gp0r0,DP0 is set at level |TO_CHAR (l_level);r-WQ$aqk6YC0END IF;ITPUB个人空间y)b!MU,Q
23、END LOOP;ITPUB个人空间 1EkU-d,X Yh2R9mEND;ITPUB个人空间k#v0fZ#s2J;RB/大部分的诊断事件的数值都是在10000至10999范围内,使用如下的脚本可以查看到所有的诊断事件:SET SERVEROUTPUT ON DECLARE err_msg VARCHAR2(120); BEGIN dbms_output.enable (1000000); FOR err_num IN 10000.10999 LOOP err_msg := SQLERRM (-err_num); IF err_msg NOT LIKE %Message |err_num| n
24、ot found% THEN dbms_output.put_line (err_msg); END IF; END LOOP; END; /ORA-10000: control file debug event, name control_file ORA-10001: control file crash event1 ORA-10002: control file crash event2 ORA-10003: control file crash event3 ORA-10004: block recovery testing - internal error ORA-10005: t
25、race latch operations for debugging ORA-10006: block recovery testing - external error ORA-10007: log switch debug crash after new log select, thread ORA-10008: log switch debug crash after new log header write, thread ORA-10009: log switch debug crash after old log header write, thread ORA-10010: B
26、egin Transaction ORA-10011: End Transaction ORA-10012: Abort Transaction ORA-10013: Instance Recovery ORA-10014: Roll Back to Save Point ORA-10015: Undo Segment Recovery ORA-10016: Undo Segment extend ORA-10017: Undo Segment Wrap ORA-10018: Data Segment Create ORA-10020: partial link restored to lin
27、ked list (KSG) ORA-10021: KST event to trace control file header writes and reads ORA-10022: trace ktsgsp ORA-10023: Create Save Undo Segment ORA-10024: Write to Save Undo ORA-10026: Apply Save Undo ORA-10027: Specify Deadlock Trace Information to be Dumped ORA-10028: Dump trace information during l
28、ock / resource latch cleanup ORA-10029: session logon (KSU) ORA-10030: session logoff (KSU) ORA-10031: sort debug event (S*) ORA-10032: sort statistics (SOR*) ORA-10033: sort run information (SRD*/SRS*) ORA-10035: Write parse failures to alert log file ORA-10036: create remote row source (QKANET) OR
29、A-10037: allocate remote row source (QKARWS) ORA-10038: dump row source tree (QBADRV) ORA-10039: type checking (OPITCA) ORA-10041: dump undo records skipped ORA-10043: check consistency of owner/waiter/converter lists in KSQ ORA-10044: free list undo operations ORA-10045: free list update operations
30、 - ktsrsp, ktsunl ORA-10046: enable SQL statement timing ORA-10047: trace switching of sessions ORA-10048: Undo segment shrink ORA-10049: protect library cache memory heaps ORA-10050: sniper trace ORA-10051: trace OPI calls ORA-10052: dont clean up obj$ ORA-10053: CBO Enable optimizer trace ORA-1005
31、6: dump analyze stats (kdg) ORA-10057: suppress file names in error messages ORA-10058: use table scan cost in tab$.spare1 ORA-10059: simulate error in logfile create/clear ORA-10060: CBO Enable predicate dump ORA-10061: disable SMON from cleaning temp segment ORA-10062: disable usage of OS Roles in
32、 osds ORA-10063: disable usage of DBA and OPER privileges in osds ORA-10064: thread enable debug crash level , thread ORA-10065: limit library cache dump information for state object dump ORA-10066: simulate failure to verify file ORA-10067: force redo log checksum errors - block number ORA-10068: f
33、orce redo log checksum errors - file number ORA-10070: force datafile checksum errors - block number ORA-10071: force datafile checksum errors - file number ORA-10072: protect latch recovery memory ORA-10073: latch cleanup tracing ORA-10074: default trace function mask for kst ORA-10075: CBO Disable
34、 outer-join to regular join conversion ORA-10076: CBO Enable cartesian product join costing ORA-10077: CBO Disable view-merging optimization for outer-joins ORA-10078: CBO Disable constant predicate elimination optimization ORA-10079: trace data sent/received via SQL*Net ORA-10080: dump a block on a
35、 segment list which cannot be exchanged ORA-10081: segment High Water Mark has been advanced ORA-10082: free list head block is the same as the last block ORA-10084: free list becomes empty ORA-10085: free lists have been merged ORA-10086: CBO Enable error if kko and qka disagree on oby sort ORA-100
36、87: disable repair of media corrupt data blocks ORA-10088: CBO Disable new NOT IN optimization ORA-10089: CBO Disable index sorting ORA-10090: invoke other events before crash recovery ORA-10091: CBO Disable constant predicate merging ORA-10092: CBO Disable hash join ORA-10093: CBO Enable force hash joins ORA-10094: before resizing a data file ORA-10095: dump debugger commands to trace file ORA-10096: after the cross instance call when resizing a data file ORA-10097: after generating redo when resizing a data file ORA-10098: after the OS has increased the size of a