1 简介

Oracle 为了方便分析问题,针对每个进程,每个错误信息都设置了相对应的追踪事件(events). 这些events, 可以将相关的内存堆栈信息以及执行过程进行追踪并输出到文件,以便在出现问题时进行分析。

事件的设置有两种层次: 实例层次(system) 和 会话层次(session).

实例层次的设置是通过参数文件来实现的(alter system set 最终也是写到参数文件)。 设置方法如下:

-- 参数文件
EVENT="[eventnumber|immediate] trace name eventname [forever,] [level levelnumber] : .......'
-- 命令行
alter system set events='[eventnumber|immediate] trace name eventname [forever,] [level levelnumber] : .....'

会话层次的设置是通过修改内存来实现的(alter session set 其实是动态修改内存)。 设置格式如下:

alter session set events'[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] :.......'

命令行里的格式基本一致。同时指定多个事件时,使用冒号进行分隔。

2 查看dump文件

大概是从11G 为分界线,11G 及之前的版本,用户主动生成的trace 文件是保存在 user_dump_dest 参数指向的路径中的。 而从12C 开始,该文件则是与alert 日志保存在同一路径中。

2.1 CDB或者12C之后

SELECT '$ORACLE_BASE/diag/rdbms/'||d.value||'/'||i.instance_name||'/trace/'||
       p.spid || '.trc' trace_file_name
  FROM (SELECT p.spid
          FROM v$mystat m, v$session s, v$process p
         WHERE m.statistic# = 1
           AND s.sid = m.sid
           AND p.addr = s.paddr) p,
       (SELECT instance_name FROM v$instance) i,
       (SELECT VALUE FROM v$parameter WHERE NAME = 'db_name') d;

2.2 非CDB 或者11G

SELECT d.value || '/' || lower(rtrim(i.instance_name, chr(0))) || '_ora_' ||
        p.spid || '.trc' trace_file_name
   FROM (SELECT p.spid
           FROM v$mystat m, v$session s, v$process p
          WHERE m.statistic# = 1
            AND s.sid = m.sid
            AND p.addr = s.paddr) p,
        (SELECT instance_name FROM v$instance) i,
        (SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') d;

3 格式说明

eventnumber
指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或oralce内部事件号,内部事件号在10000到10999之间,不能与immediate关键字同用。
immediate
关键字表示命令发出后,立即将指定的结构dump到跟踪文件中,这个关键字只用在alter session语句中,并且不能与 eventnumber、forever关键字同用。
trace name
是关键字
eventname
指事件名称,即要进行dump的实际结构名,参见eventname。若eventname为context,则指根据内部事件号进行跟踪。
forever
关键字表示事件在实例或会话的周期内保持有效状态,不能与immediate同用。
level
为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。
levelnumber
表示事件级别号,一般从1到10,1表示只dump结构头部信息,10表示dump结构的所有信息。

4 dump结构

eventname 根据Oracle数据库结构,分为几个大类,比如内存,文件。

4.1 Memory Dumps

 

4.1.1 Global Area

  • 语句

    ALTER SESSION SET EVENTS 'immediate trace name global_area level n';
    
    • 1 包含PGA
    • 2 包含SGA
    • 4 包含UGA
    • 8 包含indrect memory

4.1.2 Library Cache

  • 语句

    ALTER SESSION SET EVENTS 'immediate trace name library_cache level n';
    
  • 1 library cache统计信息 2 包含hash table histogram 3 包含object handle 4 包含object结构(Heap 0)

4.1.3 Row Cache

  • 语句

    ALTER SESSION SET EVENTS 'immediate trace name row_cache level n';
    
  • 1 row cache统计信息 2 包含hash table histogram 8 包含object结构

4.1.4 Buffers

  • 语句

    ALTER SESSION SET EVENTS 'immediate trace name buffers level n';
    
    • 1 buffer header
    • 2 level 1 + block header
    • 3 level 2 + block contents
    • 4 level 1 + hash chain
    • 5 level 2 + hash chain
    • 6 level 3 + hash chain
    • 8 level 4 + users/waiters
    • 9 level 5 + users/waiters
    • 10 level 6 + users/waiters

4.1.5 block Buffer version

  • 语句

    ALTER SESSION SET EVENTS 'immediate trace name buffer level n';
    
  • n为某个指定block的rdba,该命令可以转储某个block在buffer中的所有版本。

4.1.6 Heap

  • 语句

    ALTER SESSION SET EVENTS 'immediate trace name heapdump level n';
    
    • 1 PGA摘要
    • 2 SGA摘要
    • 4 UGA摘要
    • 8 Current call(CGA)摘要
    • 16 User call(CGA)摘要
    • 32 Large call(LGA)摘要
    • 1025 PGA内容
    • 2050 SGA内容
    • 4100 UGA内容
    • 8200 Current call内容
    • 16400 User call内容
    • 32800 Large call内容
    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name heapdump_addr level n, addr m';
      
    • level ::其中m为subheap的地址,n为1转储subheap的摘要,n为2转储subheap的内容
  • 4.1.8 Process State

    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name processstate level n';
      
    • 一般设置为10.

    4.1.9 System State

    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name systemstate level n';
      
      • 2: dump (不包括lock element)
      • 10: dump
      • 11: dump + global cache of RAC
      • 256: short stack (函数堆栈)
      • 258: 256+2 –>short stack +dump(不包括lock element)
      • 266: 256+10 –>short stack+ dump
      • 267: 256+11 –>short stack+ dump + global cache of RAC

    level 11和 267会 dump global cache, 会生成较大的trace 文件,一般情况下不推荐。一般情况下,如果进程不是太多,推荐用266,因为这样可以dump出来进程的函数堆栈,可以用来分析进程在执行什么操作。但是生成short stack比较耗时,如果进程非常多,比如2000个进程,那么可能耗时30分钟以上。这种情况下,可以生成level 10 或者 level 258, level 258 比 level 10会多收集short short stack, 但比level 10少收集一些lock element data.

    另外对于RAC系统,请关注Bug 11800959 - A SYSTEMSTATE dump with level >= 10 in RAC dumps huge BUSY GLOBAL CACHE ELEMENTS - can hang/crash instances (Doc ID 11800959.8)。这个Bug在11.2.0.3上被修复,对于<=11.2.0.2的RAC,当系统中的lock element 很多的时候,如果执行level 10、266或者 267的systemstate dump时,可能会导致数据库hang或者crash,这种情况下可以采用level 258。

    4.1.10 Error State

    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name errorstack level n';
      
      • 0 Error stack
      • 1 level 0 + function call stack
      • 2 level 1 + process state
      • 3 level 2 + context area

    4.1.11 Hang Analysis

    ALTER SESSION SET EVENTS 'immediate trace name hanganalyze level n';

    level
    • 1-2 只有hanganalyze输出,不dump任何进程
    • 3 Level2+Dump出在IN_HANG状态的进程
    • 4 Level3+Dump出在等待链里面的blockers(状态为LEAF/LEAF_NW/IGN_DMP)
    • 5 Level4+Dump出所有在等待链中的进程(状态为NLEAF)
    • 10 dump 所有进程(IGN 状态)

    4.1.12 Work Area

    • 语句

      alter  SESSION SET EVENTS 'immediate trace name workareatab_dump level n';
      
      • 1 SGA信息
      • 2 Workarea Table摘要信息
      • 3 Workarea Table详细信息

    4.1.13 Latches

    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name latches level n';
      
      • 1 latch信息
      • 2 统计信息

    4.1.14 Events

    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name events level n';
      
      • 1 session
      • 2 process
      • 3 system

    4.1.15 Locks

    ALTER SESSION SET EVENTS 'immediate trace name locks level n';
    

    4.1.16 Shared Process

    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name shared_server_state level n';
      
    • n取值为1~14

    4.1.17 Background Messages

    • 语句

      ALTER SESSION SET EVENTS 'immediate trace name bg_messages level n';
      
    • n为pid+1

    相关文章:

    • 2021-12-20
    • 2022-12-23
    • 2022-12-23
    • 2022-12-23
    • 2021-07-31
    • 2021-09-24
    • 2021-12-29
    猜你喜欢
    • 2021-10-21
    • 2021-11-28
    • 2022-01-07
    • 2021-12-11
    • 2022-12-23
    • 2021-10-12
    相关资源
    相似解决方案