Oracle跟踪文件分为三种类型:
1:警告日志文件。记录了数据库启动、运行、关闭时的活动情况。当数据库出现问题时,首先要查看该文件,文件名为alert_sid.log
2:后台跟踪文件。记录了oracle后台进程的运行状况,名称为sid_processname_processid.trc,存储目录为BACKGROUND_dump_dest
3:用户跟踪文件。记录了连接到数据库的用户进程的运行信息,名称为SID_ORA_PROCESSID.TRC,存储目录为USER_DUMP_DEST.
在oracle11g中,这三种文件位于同一目录下:
跟踪事件
设置跟踪事件,会导致oracle将与该事件有关的信息转储到跟踪文件中。依据设置事件的方式,可以将跟踪事件分为2类:PROCESS-EVENT(通过初始化参数文件设置的事件)、SESSION-EVENT(通过alter session set events或者alter system set events设置的时间)。要使PROCESS-EVENT事件生效,必须重新启动数据库实例,PROCESS-EVENT事件会影响连接到数据库的每一个用户进程。在参数文件中设置多个事件可以采用“:”分隔符,如event="event1:event2:event3"。也可以依次设置多个event,如:
event="event1"
event="event2" (注意,在event1和event2之间不要存在其他参数,否则只有最后的event即event2生效)。
对不同的跟踪事件,oracle会产生不同的行为,根据行为的不同,我们大致可以将跟踪事件分为4类:
1.转储oracle中的某部分内容,如数据块、控制文件内容等。转储活动会在收到跟踪事件命令的同时执行。这类事件不可以通过参数文件进行设置。
2.跟踪错误信息。设置这类事件,oracle会将特定错误的堆栈信息转储到跟踪文件中。
3.更改oracle的执行路径。这类事件会影响oracle代码段的执行路径,例如10269事件,会促使smon进程停止对free-space的合并操作。
4.跟踪进程的相关信息。例如10046事件和10053事件。该类事件会将进程上下文中的特定信息转储到跟踪文件中。
语法格式
altersystem|sessionsetevents‘[eventnumber|immediate]tracenameeventname[forever][,levellevelnumber]:…….’
通过:符号,可以连续设置多个事件,也可以通过连续使用alter session set events来设置多个事件。
格式说明:eventnumber指触发dump的事件号,事件号可以是Oracle错误号或oralce内部事件号,内部事件号在10000到10999之间,不能与immediate关键字同用;immediate关键字表示命令发出后,立即将指定的结构dump到跟踪文件中,这个关键字只用在alter session语句中,并且不能与eventnumber、forever关键字同用。trace name是关键字。eventname指事件名称(见后面),即要进行dump的实际结构名。若eventname为context,则指根据内部事件号进行跟踪。forever关键字表示事件在实例或会话的周期内保持有效状态,不能与immediate同用。level为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。levelnumber表示事件级别号,一般从1到10,1表示只dump结构头部信息,10表示dump结构的所有信息。
对于alter session设置的事件,仅仅只对当前session有效。对于alter system 设置的事件,除对当前session有效外,对新登录的session同样有效,但是对于alter system命令执行之前打开的session是无效的。
IMMEDIATE相关的事件
一.MemoryDumps
1).GlobalArea
AlterSESSIONSETEVENTS'immediatetracenameglobal_arealeveln';
1包含PGA
2包含SGA
4包含UGA
8包含indrectmemory
2).LibraryCache
AlterSESSIONSETEVENTS'immediatetracenamelibrary_cacheleveln';
1librarycache统计信息
2包含hashtablehistogram
3包含objecthandle
4包含object结构(Heap0)
3).RowCache
AlterSESSIONSETEVENTS'immediatetracenamerow_cacheleveln';
1rowcache统计信息
2包含hashtablehistogram
8包含object结构
4).Buffers
AlterSESSIONSETEVENTS'immediatetracenamebuffersleveln';
1bufferheader
2level1+blockheader
3level2+blockcontents
4level1+hashchain
5level2+hashchain
6level3+hashchain
8level4+users/waiters
9level5+users/waiters
10level6+users/waiters
5).Buffer
AlterSESSIONSETEVENTS'immediatetracenamebufferleveln';
n为某个指定block的rdba,该命令可以转储某个block在buffer中的所有版本。
6).Heap
AlterSESSIONSETEVENTS'immediatetracenameheapdumplevellevel';
1PGA摘要
2SGA摘要
4UGA摘要
8Currentcall(CGA)摘要
16Usercall(CGA)摘要
32Largecall(LGA)摘要
1025PGA内容
2050SGA内容
4100UGA内容
8200Currentcall内容
16400Usercall内容
32800Largecall内容
7).SubHeap
oracle9.0.1版本之前
AlterSESSIONSETEVENTS'immediatetracenameheapdump_addrleveln';
若n为subheap的地址,转储的是subheap的摘要信息
若n为subheap的地址+1,转储的则是subheap的内容
oracle9.2.0版本之后
AlterSESSIONSETEVENTS'immediatetracenameheapdump_addrleveln,addrm';
其中m为subheap的地址
n为1转储subheap的摘要,n为2转储subheap的内容
8).ProcessState
AlterSESSIONSETEVENTS'immediatetracenameprocessstateleveln';
9).SystemState
AlterSESSIONSETEVENTS'immediatetracenamesystemstateleveln';
10).ErrorState
AlterSESSIONSETEVENTS'immediatetracenameerrorstackleveln';
0Errorstack
1level0+functioncallstack
2level1+processstate
3level2+contextarea
11).HangAnalysis
AlterSESSIONSETEVENTS'immediatetracenamehanganalyzeleveln';
12).WorkArea
AlterSESSIONSETEVENTS'immediatetracenameworkareatab_dumpleveln';
1SGA信息
2WorkareaTable摘要信息
3WorkareaTable详细信息
13).Latches
AlterSESSIONSETEVENTS'immediatetracenamelatchesleveln';
1latch信息
2统计信息
14).Events
AlterSESSIONSETEVENTS'immediatetracenameeventsleveln';
1session
2process
3system
15).Locks
AlterSESSIONSETEVENTS'immediatetracenamelocksleveln';
16).SharedServerProcess
AlterSESSIONSETEVENTS'immediatetracenameshared_server_stateleveln';
n取值为1~14
17).BackgroundMessages
AlterSESSIONSETEVENTS'immediatetracenamebg_messagesleveln';
n为pid+1
二.FileDumps
1).Block
oracle7之前
AlterSESSIONSETEVENTS'immediatetracenameblockdumpleveln';
n为block的rdba
oracle8以后
AlterSYSTEMDUMPDATAFILEfile#BLOCKblock#;
AlterSYSTEMDUMPDATAFILEfile#
BLOCKMINminimum_block#
BLOCKMAXmaximum_block#
2).TreeDump查看索引的结构
AlterSESSIONSETEVENTS'immediatetracenametreedumpleveln';
n为object_id
object_id可以从selectobject_idfromuser_objectswhereobject_name='索引的名字'得到。
3).UndoSegmentHeader查看回滚段头部信息
AlterSYSTEMDUMPUNDO_HEADER'segment_name';
4).UndoforaTransaction
AlterSYSTEMDUMPUNDOBLOCK'segment_name'XIDxidusnxidslotxidsqn;
5).FileHeader
AlterSESSIONSETEVENTS'immediatetracenamefile_hdrsleveln';
1 控制文件中的文件头信息
2level1+ 通用文件头信息
3level2+数据完整文件头信息
10level3
6).Controlfile
AlterSESSIONSETEVENTS'immediatetracenamecontrolfleveln';
1控制文件中的文件头信息
2level1+数据库信息+检查点信息
3level2+可重用节信息
10level3
7).RedologHeader
AlterSESSIONSETEVENTS'immediatetracenameredohdrleveln';
1控制文件中的redolog信息
2level1+ 通用文件头信息
3level2+ 完整日志文件头信息
10level3
8).Redolog
AlterSYSTEMDUMPLOGFILE'FileName';
AlterSYSTEMDUMPLOGFILE'FileName'
SCNMINMinimumSCN
SCNMAXMaximumSCN
TIMEMINMinimumTime
TIMEMAXMaximumTime
LAYERLayer
OPCODEOpcode
DBAMINFileNumber.BlockNumber
DBAMAXFileNumber.BlockNumber
RBAMINLogFileSequenceNumber.BlockNumber
RBAMAXLogFileSequenceNumber.BlockNumber;
其中time=(((((yyyy-1988))*12+mm-1)*31+dd-1)*24+hh)*60+mi)*60+ss;
详细内容请看:http://blog.youkuaiyun.com/yidian815/article/details/12568027
9).Loghist
AlterSESSIONSETEVENTS'immediatetracenameloghistleveln';
n=1dump控制文件中最早和最迟的日志历史项
n>1 dump 2^n个日志历史项
获取诊断事件号
大部分的诊断事件的数值都是在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||' not found%' THEN
dbms_output.put_line (err_msg);
END IF;
END LOOP;
END;
DBMS_MONITOR包
Subprogram | Description |
---|---|
Disables statistic gathering previously enabled for a given Client Identifier | |
Enables statistic gathering for a given Client Identifier | |
Disables the trace previously enabled for a given Client Identifier globally for the database | |
Enables the trace for a given Client Identifier globally for the database | |
Disables SQL trace for the whole database or a specific instance | |
Enables SQL trace for the whole database or a specific instance | |
Disables statistic gathering enabled for a given combination of Service Name, | |
Enables statistic gathering for a given combination of Service Name, | |
Disables the trace for ALL enabled instances for a or a given combination of Service Name, | |
Enables SQL tracing for a given combination of Service Name, | |
Disables the previously enabled trace for a given database session identifier (SID) on the local instance | |
Enables the trace for a given database session identifier (SID) on the local instance |
与该包相关的还包括几个视图:v$client_stats\V$SERV_MOD_ACT_STATS。
client_id 可以通过DBMS_SESSION.SET_IDENTIFIER来设置。
DBMS_SYSTEM包
关于该包的详细信息,请参照:http://blog.youkuaiyun.com/yidian815/article/details/12580659
另外,我们还可以使用ORADEBUG工具。如
对一个进程设置诊断事件:
ORADEBUGEVENTeventTRACENAMECONTEXTFOREVER,LEVELlevel
禁用设置的诊断事件:
ORADEBUGEVENTeventTRACENAMECONTEXTOFF
对一个会话设置诊断事件:
ORADEBUGSESSION_EVENTeventTRACENAMECONTEXTFOREVER,LEVELlevel
禁用设置的诊断事件:
ORADEBUGSESSION_EVENTeventTRACENAMECONTEXTOFF
查看当前SESSION设置的事件
SET SERVEROUTPUT ON
DECLARE
l_level NUMBER;
BEGIN
FOR l_event IN 10000..10999
LOOP
dbms_system.read_ev (l_event,l_level);
IF l_level > 0 THEN
dbms_output.put_line ('Event '||TO_CHAR (l_event)||
' is set at level '||TO_CHAR (l_level));
END IF;
END LOOP;
END;
其他注意事项
确定使用的诊断事件对于当前的Oracle数据库版本是合法的:因为对于不同版本的Oracle数据库来说,诊断事件的含义和用法都有所不同。
确定使用的诊断事件允许设定的级别,在很多时候设定的级别不同是会影响到诊断事件所代表的行为的。
在INITSID.ORA文件中设置的任何诊断事件,如果Oracle数据库需要升级,一定要提前注释或者取消。