`
844604778
  • 浏览: 551320 次
文章分类
社区版块
存档分类
最新评论

ORACLE 事件跟踪

 
阅读更多
跟踪文件

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为某个指定blockrdba,该命令可以转储某个blockbuffer中的所有版本。

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';

nsubheap的地址,转储的是subheap的摘要信息

nsubheap的地址+1,转储的则是subheap的内容

oracle9.2.0版本之后

AlterSESSIONSETEVENTS'immediatetracenameheapdump_addrleveln,addrm';

其中msubheap的地址

n1转储subheap的摘要,n2转储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';

npid+1

.FileDumps

1).Block

oracle7之前

AlterSESSIONSETEVENTS'immediatetracenameblockdumpleveln';

nblockrdba

oracle8以后

AlterSYSTEMDUMPDATAFILEfile#BLOCKblock#;

AlterSYSTEMDUMPDATAFILEfile#

BLOCKMINminimum_block#

BLOCKMAXmaximum_block#

2).TreeDump查看索引的结构

AlterSESSIONSETEVENTS'immediatetracenametreedumpleveln';

nobject_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.csdn.net/yidian815/article/details/12568027


9).Loghist

AlterSESSIONSETEVENTS'immediatetracenameloghistleveln';

n=1dump控制文件中最早和最迟的日志历史项

n>1 dump 2^n个日志历史项



获取诊断事件号

大部分的诊断事件的数值都是在1000010999范围内,使用如下的脚本可以查看到所有的诊断事件:

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;
 


相关的PLSQL包


DBMS_MONITOR包

Subprogram Description

CLIENT_ID_STAT_DISABLE Procedure

Disables statistic gathering previously enabled for a given Client Identifier

CLIENT_ID_STAT_ENABLE Procedure

Enables statistic gathering for a given Client Identifier

CLIENT_ID_TRACE_DISABLE Procedure

Disables the trace previously enabled for a given Client Identifier globally for the database

CLIENT_ID_TRACE_ENABLE Procedure

Enables the trace for a given Client Identifier globally for the database

DATABASE_TRACE_DISABLE Procedure

Disables SQL trace for the whole database or a specific instance

DATABASE_TRACE_ENABLE Procedure

Enables SQL trace for the whole database or a specific instance

SERV_MOD_ACT_STAT_DISABLE Procedure

Disables statistic gathering enabled for a given combination of Service Name,MODULEandACTION

SERV_MOD_ACT_STAT_ENABLE Procedure

Enables statistic gathering for a given combination of Service Name,MODULEandACTION

SERV_MOD_ACT_TRACE_DISABLE Procedure

Disables the trace for ALL enabled instances for a or a given combination of Service Name,MODULEandACTIONname globally

SERV_MOD_ACT_TRACE_ENABLE Procedure

Enables SQL tracing for a given combination of Service Name,MODULEandACTIONglobally unless aninstance_nameis specified

SESSION_TRACE_DISABLE Procedure

Disables the previously enabled trace for a given database session identifier (SID) on the local instance

SESSION_TRACE_ENABLE Procedure

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.csdn.net/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数据库需要升级,一定要提前注释或者取消。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics