XXXX1012Oracle数据库诊断事件详解如何获取所有内部事件号.docx
《XXXX1012Oracle数据库诊断事件详解如何获取所有内部事件号.docx》由会员分享,可在线阅读,更多相关《XXXX1012Oracle数据库诊断事件详解如何获取所有内部事件号.docx(29页珍藏版)》请在冰点文库上搜索。
XXXX1012Oracle数据库诊断事件详解如何获取所有内部事件号
XXXX1012-Oracle数据库诊断事件详解(如何获取所有内部事件号)
什么是Oracle数据库的诊断事件呢?
简而言之的来说Oracle的诊断事件确实是Oracle数据库中用于实现一些专门功用的类别,一样要紧用于实现以下几个方面的功用:
Ø改变Oracle数据库的行为
Ø启用收集Oracle数据库的跟踪或者调试信息
Ø启用对Oracle数据库的额外的错误检测
4[]5r/Rd\0
一、Oracle数据库诊断事件简介ITPUB个人空间
K$~g,raNVkeC'G
什么是Oracle数据库的诊断事件呢?
简而言之的来说Oracle的诊断事件确实是Oracle数据库中用于实现一些专门功用的类别,一样要紧用于实现以下几个方面的功用:
pL8z%I6?
&dj
Z$Z3F0Ø改变Oracle数据库的行为
uR.|5d;\+_V\4f*OUD0Ø启用收集Oracle数据库的跟踪或者调试信息ITPUB个人空间,\�].A%ct8mh4b
Ø启用对Oracle数据库的额外的错误检测
如何去设置Oracle数据库的各种诊断事件呢?
我们第一来给设置诊断事件下一个简单的定义,确实是让Oracle数据库产生跟踪信息日志文件。
设置诊断事件有如下的四种方法:
ITPUB个人空间t\]@"])R$l}
Ø在INIT或者SPFILE初始化文件中设置ITPUB个人空间sv}8O[N}y`1S6K
这种设置的诊断事件差不多上针关于整个实例的:
ITPUB个人空间X:
O/A4a|s&y
event='eventtracenamecontextforever,levellevel';ITPUB个人空间ZJy+x�F!
A
假如需要设置多个诊断事件,能够通过以下两种方法:
ITPUB个人空间gX|)O,Q*H
方法一:
使用冒号分隔开两个诊断事件
A'n
j}8F0event="10248tracenamecontextforever,level10:
10249tracenamecontextforever,level10"
4@+NQ@c7l0mO-p0方法二:
使用连续的行设置诊断事件ITPUB个人空间vA,[d
W@;A5E!
ZW
event="10248tracenamecontextforever,level10"ITPUB个人空间!
BQ
vmGm
event="10249tracenamecontextforever,level10"ITPUB个人空间p#|W(I/nQC0F,afYz
Ø在当前SQL会话中设置
'N8l#q*@SBT"}&F0针对整个实例的诊断事件的设置:
%?
k�EX.?
zHn0ALTERSYSTEMSETEVENTS'eventtracenamecontextforever,levellevel';ITPUB个人空间@"W2Ez*y3A5U
~
禁用设置的诊断事件:
ITPUB个人空间4dwbn\FSr
ALTERSYSTEMSETEVENTS'eventtracenamecontextoff';
fM-s6T
I6nY0针对当前会话的诊断事件的设置:
_5{1}Kt!
v"r0ALTERSESSIONSETEVENTS'eventtracenamecontextforever,levellevel';ITPUB个人空间z:
`y)s&TJ
禁用设置的诊断事件:
$QZZ"\~q0ALTERSESSIONSETEVENTS'eventtracenamecontextoff';ITPUB个人空间T4y;l;BU8[b|
Ø在另外一个SQL会话中使用DBMS_SYSTEM.SETEV储备过程设置ITPUB个人空间c9k:
h%ox.H.KF
EXECUTEsys.dbms_system.set_ev(sid,serial#,,,'')ITPUB个人空间'k&G#mIQ
其中的SID,SERIAL#差不多上从视图V$SESSION中获得的。
G4tMunk
Q)S0Ø在另外一个会话中使用debug工具设置
}cRD5T7J&JW0对一个进程设置诊断事件:
8}%Tv}&qC�Q/R+\3g4B#x"R0ORADEBUGEVENTeventTRACENAMECONTEXTFOREVER,LEVELlevelITPUB个人空间%nN-j;h!
cbL$?
禁用设置的诊断事件:
ITPUB个人空间iTI
M3hf
ORADEBUGEVENTeventTRACENAMECONTEXTOFFITPUB个人空间&hs/o\w$B9wYM\
对一个会话设置诊断事件:
ITPUB个人空间@x"z*WR
ORADEBUGSESSION_EVENTeventTRACENAMECONTEXTFOREVER,LEVELlevel
0Xs;}qyb\0禁用设置的诊断事件:
)nnf4ct}r0ORADEBUGSESSION_EVENTeventTRACENAMECONTEXTOFF
注:
在Oracle8i以上的版本中,是使用sysdba权限的用户登陆sqlplus后执行ORADEBUG命令;在Oracle7.3/8.0的版本中,是使用internal用户登陆svrmgrl后执行ORADEBUG命令;在更早的Oracle版本中使用ORADBX(ORAMBX在VMS系统上)。
因为oradebug承诺在另外的会话中设置诊断事件,如此就能够跟踪一些平常不太trace的会话,例如对export工具的诊断。
诊断事件能够分成会话级的诊断事件和进程级的诊断事件,进程级的诊断事件是能够在INIT初始化参数文件中设定,会话级的诊断事件那么能够使用"altersession..."或者"altersystem..."命令来设定。
Oracle数据库在检测诊断事件的时候差不多上先检测会话级的诊断事件,然后再检测进程级的诊断事件。
关于设置Oracle数据库的诊断事件都必须遵循一定的语法,例如在会话级别上设置诊断事件能够按照以下的语法来设置:
;[)JKk4Yt0altersessionsetevents'10181tracenamecontextforever,level1000';ITPUB个人空间7uD4q*s;y6q
而同样的诊断事件在INIT初始化参数文件中就应该按照以下语法设置:
4NS,@@`zCr9k0event="10181tracenamecontextforever,level1000"ITPUB个人空间y$rz6J"z*^"Z|'\e
在INIT初始化参数文件中设置诊断事件的时候,一样来说最好在诊断事件后加上相关的注释,注释的内容一样来说应该包括诊断事件的作用、什么缘故要使用那个诊断事件以及设置诊断事件的时刻。
ITPUB个人空间&L"s.n2eT9Rr?
N"x-X2^#k
下面那个图是关于设置诊断事件的语法表:
ITPUB个人空间#D8V8M-v,Tbbx
JOE*M!
i*pj0诊断事件规定的语法为:
ITPUB个人空间f"^D_@)FwB
{:
}*
'qo
h0VX%\0EventName:
它代表关联事件的符号名或者是一个事件号。
假如是immediate,代表是一个赶忙无条件的诊断事件,不用去等待任何人公布它;也能够是指定的Oracle错误号码,还能够是具体的事件名。
RvI_#ie4?
\4UP0Action:
分为和。
ActionKeyWord的值能够是trace、debugger、crash,而qualifiers的语法那么是依靠于具体的Action。
ITPUB个人空间qe2ft:
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,以后每次发生事件时都要debugger)|"lifetime"(一旦开始debugger,以后N次发生事件时都要debugger,然后在此诊断事件中禁用debugger)
b#[DXH'rH0Ø当为trace的时候,语法为:
L7m�WA4T&q5sH0"name"{,}*ITPUB个人空间
K6A8VkT9p
TraceName:
是关联内部trace号的符号名。
其中,context是一种专门的tracename,它可不能去调用调试dump操作,然而却会返回给发起诊断事件者是否context跟踪被激活,跟踪是什么级别的。
跟踪的级别是指dump程序内部使用来操纵dump出来详细信息的级别,通常来说,级别越高,dump出来的信息就会越详细,最低级别是1。
All是另外一种专门的tracename,它意味着通过"ksdtradv"宏在编译的时候声明所有的tracenames。
假如在诊断事件中关联余外一个以上的trace,至少有一个应该是context,相应的,诊断事件中最后一个关联的动作将返回跟踪的级别,而且在不同的调用中诊断事件号最好唯独。
ITPUB个人空间!
{
@4VpL2kW
tracequalifier的语法为:
ITPUB个人空间,tz;K-LR}*B4D
Wq
""(默认为空)|"off"(在等待事件中禁用那个trace)|"aftertimes"(发生此事件N次后开始trace)|"forever"(一旦激活trace,以后每次发生事件时都要trace)|"lifetime"(一旦开始trace,以后N次成功发生事件时都要trace,然后在此诊断事件中禁用trace)|"level"(当trace第一次被激活,设置初始化级别为N,之后激活的trace的级别那么由tracetype来决定)|"type"(如何修改以后激活的trace的级别)
l6H�Rv2e7wR\^0tracetype:
ITPUB个人空间F2E2m
Hq*i;]}
"increment"升高级别直至最高
xvCqg9_2Q0"decrement"降低级别到0同时禁用
VfQ
I
h?
+C0"constant"保持级别不变ITPUB个人空间x
\K(bLmJ$bh:
i
此外,关于trace的指定,假如设置诊断事件是immediate,那么意味着trace将可不能等待诊断事件,在tracequalifier中只需要设置trace的级别,lifetime默认为1。
关于设置诊断事件,Oracle数据库提供了四个跟踪信息的类别能够供我们来使用:
ITPUB个人空间1ij5Cle
U"hW)hm1G
Ø类别一:
DumpSomethingITPUB个人空间�t7Mud�w9l!
Z-h
那个类别的Trace文件是无条件赶忙生成的,一样差不多上dump出Oracle数据库的数据,例如查看重做日志文件的头或者是查看操纵文件中的内容等。
这类的诊断事件是不能够在INIT或者SPFILE的初始化参数文件中指定的。
ITPUB个人空间Kc&kh&PfWX
B
Ø类别二:
TraponError
3C/d
LNw~-^sqO0那个类别的诊断事件是让Oracle每次生成一个errorstack的错误信息的trace文件。
!
r1d
M8r;Ve�d0Ø类别三:
ChangeexecutionpathITPUB个人空间IF]
d�A(T[
那个类别的诊断事件要紧是用于修改某些代码段的可执行路径。
例如,设置诊断事件10269就能够让Oracle数据库的后台SMON进程不再进行自由空间的重组的操作。
:
P\2Q5cb9I[.r0Ø类别四:
TracesomethingITPUB个人空间l]9CFZ
J&vv
那个类别的诊断事件要紧是用于某种专门的目的而需要猎取相应的trace信息,例如对sql调优。
最常见的诊断事件10046确实是让Oracle数据库去跟踪每条执行的sql语句的访问路径。
ITPUB个人空间H:
g�x/T*||[
每种类别的诊断事件都有一种或者多种级别,级别有以下四种表现形式:
ITPUB个人空间P#W_{dF*uJ
ØRange,例如从1到10ITPUB个人空间%~;p!
kPu5K:
W)_:
]Q&bY
Øbitmask例如0x010x020x040x080x10
+ok�d_Tk{0Øflag例如0代表off,1代表onITPUB个人空间7r
Xpn�_#\$u&F
k
Øidentifier例如objectid,memoryaddress等等
在设置使用各种诊断事件的时候,有一些事项是需要注意的:
Z;L/}8Tmz!
GC`|0Ø确定使用的诊断事件关于当前的Oracle数据库版本是合法的:
因为关于不同版本的Oracle数据库来说,诊断事件的含义和用法都有所不同。
ITPUB个人空间}8e*_R0J
Ø确定使用的诊断事件承诺设定的级别,在专门多时候设定的级别不同是会阻碍到诊断事件所代表的行为的。
.MwSJq$ue&z8u
?
0Ø在INITSID.ORA文件中设置的任何诊断事件,假如Oracle数据库需要升级,一定要提早注释或者取消。
ITPUB个人空间
C+W}&j'pr9W
ITPUB个人空间[#@HC7p1C`
大部分的诊断事件的数值差不多上在10000至10999范畴内,使用如下的脚本能够查看到所有的诊断事件:
ITPUB个人空间Q
};m
qguM
s
w1D
SETSERVEROUTPUTON
9N^&l
k0ZIo0DECLAREITPUB个人空间U,P&R
O:
M\
err_msgVARCHAR2(120);
T-s!
I&_�h0S0iq#V"H0BEGINITPUB个人空间)I*s!
Ef4j3i
n"_u-|
dbms_output.enable(1000000);ITPUB个人空间1O%BL*u2Ck~1^
FORerr_numIN10000..10999ITPUB个人空间*m`WYHvLmS
LOOP
#hn8t.QZO-O0err_msg:
=SQLERRM(-err_num);
p~CJf.N&y0IFerr_msgNOTLIKE'%Message'||err_num||'notfound%'THEN
.Gd?
*V2_,`K)R)l/}0dbms_output.put_line(err_msg);ITPUB个人空间'b|L1F6u.i
ENDIF;
Fm8q#w7\UX3X+_0ENDLOOP;
HC%f*N)oAX0END;
OO8w7~y}MOq%h0/ITPUB个人空间
Y6?
4|^%C6SX+`#U
在UNIX系统中,能够在$ORACLE_HOME/rdbms/mesg/oraus.msg那个文件中找到所有的诊断事件的名称和定义。
使用如下脚本能够输出所有的详细的诊断事件的信息:
ITPUB个人空间%_5Acu/r[`P
event=10000
*WA%q%a'y
P�[$m!
U0while[$event-ne10999]
]}
pc;ZrEkbr0doITPUB个人空间gov4Z4C"~
event=`expr$event+1`
2v/\*K5Km0O8N0oerrora$eventITPUB个人空间,[#Va4Z0Av%^^$V
done
使用如下脚本能够检查当前会话中设置了哪些诊断事件:
W%Y/BMG:
i@0SETSERVEROUTPUTON
i-?
HF_r@~P0DECLAREITPUB个人空间~&gmC)L)g#k
l_levelNUMBER;ITPUB个人空间FZ7[2A&z
Lw
BEGINITPUB个人空间$Sko
E"BI
FORl_eventIN10000..10999ITPUB个人空间9a6sVsT,r7u
F
LOOP
!
h0Bn^l)B({0dbms_system.read_ev(l_event,l_level);
9g1T,pA*d3C0IFl_level>0THEN
ca,O+]%xE0dbms_output.put_line('Event'||TO_CHAR(l_event)||
*d%Gp0r0],DP0'issetatlevel'||TO_CHAR(l_level));
r-WQ$aqk6YC0ENDIF;ITPUB个人空间y)b!
{MU,Q
ENDLOOP;ITPUB个人空间]1EkU@-d,XYh2R9m
END;ITPUB个人空间k#v0f�Z#s2J;RB
/
大部分的诊断事件的数值差不多上在10000至10999范畴内,使用如下的脚本能够查看到所有的诊断事件:
SETSERVEROUTPUTON
DECLARE
err_msgVARCHAR2(120);
BEGIN
dbms_output.enable(1000000);
FORerr_numIN10000..10999
LOOP
err_msg:
=SQLERRM(-err_num);
IFerr_msgNOTLIKE'%Message'||err_num||'notfound%'THEN
dbms_output.put_line(err_msg);
ENDIF;
ENDLOOP;
END;
/
ORA-10000:
controlfiledebugevent,name'control_file'
ORA-10001:
controlfilecrashevent1
ORA-10002:
controlfilecrashevent2
ORA-10003:
controlfilecrashevent3
ORA-10004:
blockrecoverytesting-internalerror
ORA-10005:
tracelatchoperationsfordebugging
ORA-10006:
blockrecoverytesting-externalerror
ORA-10007:
logswitchdebugcrashafternewlogselect,thread
ORA-10008:
logswitchdebugcrashafternewlogheaderwrite,thread
ORA-10009:
logswitchdebugcrashafteroldlogheaderwrite,thread
ORA-10010:
BeginTransaction
ORA-10011:
EndTransaction
ORA-10012:
AbortTransaction
ORA-10013:
InstanceRecovery
ORA-10014:
RollBacktoSavePoint
ORA-10015:
UndoSegmentRecovery
ORA-10016:
UndoSegmentextend
ORA-10017:
UndoSegmentWrap
ORA-10018:
DataSegmentCreate
ORA-10020:
partiallinkrestoredtolinkedlist(KSG)
ORA-10021:
KSTeventtotracecontrolfileheaderwritesandreads
ORA-10022:
tracektsgsp
ORA-10023:
CreateSaveUndoSegment
ORA-10024:
WritetoSaveUndo
ORA-10026:
ApplySaveUndo
ORA-10027:
SpecifyDeadlockTraceInformationtobeDumped
ORA-10028:
Dumptraceinformationduringlock/resourcelatchcleanup
ORA-10029:
sessionlogon(KSU)
ORA-10030:
sessionlogoff(KSU)
ORA-10031:
sortdebugevent(S*)
ORA-10032:
sortstatistics(SOR*)
ORA-10033:
sortruninformation(SRD*/SRS*)
ORA-10035:
Writeparsefailurestoalertlogfile
ORA-10036:
createremoterowsource(QKANET)
ORA-10037:
allocateremoterowsource(QKARWS)
ORA-10038:
dumprowsourcetree(QBADRV)
ORA-10039:
typechecking(OPITCA)
ORA-10041:
dumpundorecordsskipped
ORA-10043:
checkconsistencyofowner/waiter/converterlistsinKSQ
ORA-10044:
freelistundooperations
ORA-10045:
freelistupdateoperations-ktsrsp,ktsunl
ORA-10046:
enableSQLstatementtiming
ORA-10047:
traceswitchingofsessions
ORA-10048:
Undosegmentshrink
ORA-10049:
protectlibrarycachememoryheaps
ORA-10050:
snipertrace
ORA-10051:
traceOPIcalls
ORA-10052:
don'tcleanupobj$
ORA-10053:
CBOEnableoptimizertrace
ORA-10056:
dumpanalyzestats(kdg)
ORA-10057:
suppressfilenamesinerrormessages
ORA-10058:
usetablescancostintab$.spare1
ORA-10059:
simulateer