Oracle Dump

インデックスツリーダンプ

インデックスのツリー構造を取得します。

ALTER SESSION SET EVENTS ‘immediate trace name treedump level ';
----- begin tree dump
branch: 0x8405dde 138436062 (0: nrow: 3, level: 3)
  branch: 0xdc11022 230756386 (-1: nrow: 219, level: 2)
    branch: 0x8405f15 138436373 (-1: nrow: 138, level: 1)
       leaf: 0x8405ddf 138436063 (-1: nrow: 21 rrow: 21)
       leaf: 0x8405de0 138436064 (0: nrow: 18 rrow: 13)
       leaf: 0x8405de2 138436066 (1: nrow: 15 rrow: 15)

上記のDump内容の項目の意味は次の通りです。

  • ・Node Type:branch/ leafノードかどうか
  • ・DBA:ブロックアドレス。0x8405de2 138436066(16進数、10進数)
  • ・Relative Position:親ノードからの相対的な位置(-1,0,1,2、…)
  • ・Entry数:row=全Entry(Deleted Entryを含む)、row= Real Entry(Deleted Entryを除く)

DBAをRelative File NumberとBlock Numberに変換する方法は以下の通りです。

 

SQL> SELECT dbms_utility.data_block_address_file(138436066) as file_no,  -- 十進数
                     dbms_utility.data_block_address_block(138436066) as block_no   -- 十進数
         FROM dual;

インデックス ツリー ダンプを実行するプロシジャーを次のように作成して使用すると便利です。

create or replace procedure tree_dump(v_name in varchar2)
is
   v_obj_id number;
begin
    
   for r_id in (select object_id from all_objects
        	where object_name = upper(v_name) order by object_id) loop
  
           execute immediate
          'alter session set events ''immediate trace name treedump level '||r_id.object_id||'''';
   end loop;
  
end;
/

Partitioned Indexの場合には、次のように特定のPartitionを指定することもできます。

create or replace procedure tree_dump2(v_name in varchar2, v_part_name in varchar2)
is
   v_obj_id number;
begin
   
   for r_id in (select object_id from user_objects
       		where object_name = upper(v_name) 
       					and subobject_name = upper(v_part_name)
       					order by object_id) loop
 
           execute immediate
           'alter session set events ''immediate trace name treedump level '||r_id.object_id||'''';
   end loop;
 
end;
/

ヒープダンプ

ヒープ構造を取得します。ヒープに関する障害(バグ)をトラブルシューティングするとき多く使用されます。

alter session set events 'immediate trace name heapdump level ';
oradebug dump heapdump ;

Level値の意味は以下の通りです。

  • ・Level = 1: Top PGA
  • ・Level = 2: Top SGA
  • ・Level = 3: Top UGA
  • ・Level = 8: Current Call
  • ・Level = 16: User Call
  • ・Level = 32: Large Pool

上のレベルの値には、次のようなLevel Bitを追加すると、最大5つのサブヒープまでDumpを実行します。

  • ・0×10000000:最大5つのサブヒープを共にダンプ
  • ・0x20000000:最大5つのサブヒープについて子サブヒープまでダンプ(Recursive)

つまり、次のようにヒープ ダンプを実行すると、

oradebug dump heapdump 0x20000002

Top SGAと最大5つのサブヒープについて再帰的にヒープダンプを出力してくれます。ただし、サブダンプまでダンプを実行すると、ダンプ ファイルのサイズが非常に大きくなることがあることに注意してください。しかし、ほとんどのメモリリークの問題は、サブヒープレベルで発生するためサブヒープまでダンプを実行することを推奨します。

ヒープ ダンプは、次のような形式になります。

******************************************************
HEAP DUMP heap name="pga heap"  desc=09701D30
 extent sz=0x206c alt=92 het=32767 rec=0 flg=2 opc=2
 parent=00000000 owner=00000000 nex=00000000 xsz=0xfff8
EXTENT 0 addr=08520008
  Chunk  8520010 sz=    18880    perm      "perm           "  alo=8020
  Chunk  85249d0 sz=     2824    free      "               "
  Chunk  85254d8 sz=     8036    freeable  "Alloc environm "  ds=08427B34
  Chunk  852743c sz=    20572    freeable  "Fixed Uga      "
  Chunk  852c498 sz=      180    freeable  "ldm context    "
  Chunk  852c54c sz=      180    freeable  "ldm context    "
  Chunk  852c600 sz=      180    freeable  "ldm context    "
  Chunk  852c6b4 sz=      180    freeable  "ldm context    "
  Chunk  852c768 sz=      180    freeable  "ldm context    "
  Chunk  852c81c sz=      180    freeable  "ldm context    "

ヒープ ダンプの結果のうち、以下のようにds(Heap Descriptor)の値を持つ場合は、そのチャンク(chunk)がサブヒープを指すことを意味します。

EXTENT 3551 addr=0A080004
  Chunk  a08000c sz=       48    free      "               "
  Chunk  a08003c sz=    65476    recreate  "session heap   "  latch=00000000
     ds  a067600 sz=498960112 ct=     3552

サブヒープをダンプするためには次のような命令を使用します。

oradebug dump heapdump_addr

SYS@ukja10> oradebug dump heapdump_addr 1 0xa067600

Levelは、次のような意味を持ちます。

  • ・Level=1:Data構造のみ出力
  • ・Level=2:Data内容まで出力

Level2は非常に多くのデータを出力するので、パフォーマンスに大きな悪影響を与える可能性があるため、必要な場合にのみ使用します。ほとんどの場合、Level1だけで必要な結果を得ることができます。

ライブラリ・キャッシュ・ダンプ

ライブラリ キャッシュ構造を取得します。SQL カーソルParent/ Child)の構造を把握しようとするとき多く使用されます。

ALTER SESSION SET EVENTS 'immediate trace name library_cache level 10';
-- バージョンに応じて、16、32などの値を使用することで完璧な範囲のライブラリ キャッシュダンプが実行されます。
...
-- Parent Cursor
BUCKET 89106:
 LIBRARY OBJECT HANDLE: handle=84ad91c0 mtx=0x84ad92f0(2) cdp=2
 name=SELECT * FROM SHARE_TEST WHERE NAME = :x
 hash=8f5a0aa420c69c69f3dc950037b95c12 timestamp=11-09-2007 14:17:12
 namespace=CRSR flags=RON/KGHP/TIM/PN0/SML/KST/DBN/MTX/[120100d0]
 kkkk-dddd-llll=0000-0001-0001 lock=0 pin=0 latch#=3 hpc=0000 hlc=0000
 lwt=0x84ad9268[0x84ad9268,0x84ad9268] ltm=0x84ad9278[0x84ad9278,0x84ad9278]
 pwt=0x84ad9230[0x84ad9230,0x84ad9230] ptm=0x84ad9240[0x84ad9240,0x84ad9240]
 ref=0x84ad9298[0x84ad9298,0x84ad9298] lnd=0x84ad92b0[0x84ad92b0,0x84ad92b0]
   LIBRARY OBJECT: object=833e5518
   type=CRSR flags=EXS[0001] pflags=[0000] status=VALD load=0
   CHILDREN: size=16  
   child#    table reference   handle
   ------ -------- --------- --------
        0 833010c0  83300d30 858bd9b0
        1 833010c0  83300fc0 8212fdf8

-- Child Cursor
LIBRARY OBJECT HANDLE: handle=858bd9b0 mtx=0x858bdae0(0) cdp=0
   namespace=CRSR flags=RON/KGHP/PN0/[10010000]
   kkkk-dddd-llll=0000-0041-0041 lock=0 pin=0 latch#=3 hpc=0000 hlc=0000
   lwt=0x858bda58[0x858bda58,0x858bda58] ltm=0x858bda68[0x858bda68,0x858bda68]
   pwt=0x858bda20[0x858bda20,0x858bda20] ptm=0x858bda30[0x858bda30,0x858bda30]
   ref=0x858bda88[0x83300d30,0x83300d30] lnd=0x858bdaa0[0x858bdaa0,0x858bdaa0]
 CHILD REFERENCES:
 reference latch flags
 --------- ----- -------------------
  83300d30     0 CHL[02]
 LIBRARY OBJECT: object=833008f0
 type=CRSR flags=EXS[0001] pflags=[0000] status=VALD load=0
 DEPENDENCIES: count=1 size=16
 dependency#    table reference   handle position flags
 ----------- -------- --------- -------- -------- -------------------
           0 7f751c70  7f751b08 84a04420       14 DEP[01]
 AUTHORIZATIONS: count=1 size=16 minimum entrysize=16
 00000000 37000000 00020000 00000000
 ACCESSES: count=1 size=16
 dependency# types
 ----------- -----
           0 0009
 TRANSLATIONS: count=1 size=16
 original    final
 -------- --------
 84a04420 84a04420
 DATA BLOCKS:
 data#     heap  pointer    status pins change whr
 ----- -------- -------- --------- ---- ------ ---
     0 85beb878 83300a48 I/-/A/-/-    0 NONE   00   
     6 7f7518e0 845c7780 I/-/A/-/-    0 NONE   00    

ハング分析

Oracle ハングが発生した場合, ハング分析に必要な情報を取得します。使用方法は、以下のようになります。

SQL> connect /as sysdba
SQL> oradebug setmypid
SQL> oradebug hanganalyze  -- 例: oradebug hanganalyze 3

Levelによる出力については、以下の通りです。

  • ・10 – すべてのプロセスをダンプします。(IGN状態)
  • ・5 – レベル4 +待機チェーンに含まれるすべてのプロセスをダンプします。(NLEAF状態)
  • ・4 – レベル3 +待機チェーン(LEAF、LEAF_NW、IGN_DMP状態)のリーフノード(ブロッカー)をダンプします。
  • ・3 – レベル2 +ハング状態にあると考えられるプロセスのみをダンプします。(IN_HANG状態)
  • ・1-2 – ハング分析出力のみ、プロセスダンプは全くありません。

RACで他の インスタンスとの連関された内容まで分析するためには次のような命令文を使わなければなりません.

SQL> oradebug setinst all
SQL> oradebug -g def hanganalyze 1

ハング分析で生成されたダンプファイルの例は以下のようになります。

*** 2006-04-06 14:17:29.050
Open chains found:
Chain 1 :  :
    <0/118/36478/1093/PL/SQL lock timer>
 -- <1/132/29546/1113/enq: TX - row lock contention>
 -- <1/127/16507/1041/enq: TX - row lock contention>
Chain 2 :  :
    <1/156/1/14747/rdbms ipc message> -- <0/110/58858/enq: TC - contention>
Chain 3 :  :
    <0/113/43663/single-task message> -- <0/145/49269/library cache pin>
Chain 4 :  :
    <0/158/1/control file parallel write>
 -- <1/131/33219/1095/enq: TC - contention>

システム/プロセス状態ダンプ

システムやプロセスの現在の状況を取得します。 使用法は以下の通りです。

alter session set events 'immediate trace name processstate level 10'; 
alter session set events 'immediate trace name systemstate level 10';
alter session set events 'immediate trace name systemstate level 266';

または

oradebug dump processstate 10;
oradebug dump systemstate 10;
-- oradebug dump systemstate 266; -- 10gから(short stack を含む)

エラースタックダンプ

プロセスのエラースタックダンプを実行します。 スタックの情報加えて、PL / SQL、SQLなどの情報出力されます。

alter session set events 'immediate trace name errorstack level 3';
alter session set events '1652 trace name errorstack level 3';

あるいは

oradebug setospid 
oradebug dump errorstack 3

出力結果は、以下のようになります。

----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
2CD21218       169  package body SYS.DBMS_PIPE
2CD215EC         6  package body UKJA.PKG_SYNC
2CD215EC        17  package body UKJA.PKG_SYNC
2CD98678         1  anonymous block
----- Call Stack Trace -----
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
_ksedst+38           CALLrel  _ksedst1+0           1 1
_ksedmp+898          CALLrel  _ksedst+0            1
_ksdxfdmp+847        CALLreg  00000000             3
_ksdxcb+1481         CALLreg  00000000             887FB20 11 3 887FA80 887FAD0
_ssthreadsrgruncall  CALLrel  _ksdxcb+0            1
back+428                                           
_OracleOradebugThre  CALLrel  _ssthreadsrgruncall  887FF84
adStart@4+795                 back+0               
7C80B710             CALLreg  00000000             
00000000             VIRTUAL  7C93E4F4             
7C80253D             CALLrel  7C802550             
_skgpwwait+124       CALL???  00000000             
_ksliwat+843         CALLrel  _skgpwwait+0         817C564 B818088 3424CE88
                                                   4C4B40 0
_kslwaitns+24        CALLrel  _ksliwat+0           1F4 1 E7 0 2CD20E44 1000
                                                   5265C00
_kskthbwt+159        CALLrel  _kslwaitns+0         1F4 1 E7 0 2CD20E44 1000
                                                   5265C00
_kslwait+52          CALLrel  _kskthbwt+0          
_kkxpgetr+916        CALLrel  _kslwait+0           1F4 E7 0 2CD20E44 1000
                                                   5265C00
_kkxpget+663         CALLrel  _kkxpgetr+0          4BFFFE8 6 4FAEF10 1000
                                                   817C844 5265C00 3D
_pevm_icd_call_comm  CALLreg  00000000             4F7CBE0 4 4D04828
on+722                                             
...

----------------------------------------
Cursor#1(04F60C24) state=BOUND curiob=04F67C5C
 curflg=46 fl2=0 par=00000000 ses=3432A014
 sqltxt(2CD987BC)=select * from t1
where c1 = :b1 and c2 = :b2
			and pkg_sync.f_wait_for_signal = 1
  hash=59ca9b387f72d09556b17be170c424e0
  parent=305B8518 maxchild=02 plk=31B534D4 ppn=n
cursor instantiation=04F67C5C
 child#0(2CD98678) pcs=305B871C
  clk=31BB2B50 ci=305BF038 pn=31B520F4 ctx=303E7E24
 kgsccflg=0 llk[04F67C60,04F67C60] idx=0
 xscflg=c0110676 fl2=d100008 fl3=42222008 fl4=0
 sharing failure(s)=10
 Bind bytecodes
  Opcode = 2   Bind Twotask Scalar Sql In (may be out) Copy 
  oacdef = 305a03ac   Offsi = 36, Offsi = 0
  Opcode = 2   Bind Twotask Scalar Sql In (may be out) Copy 
  oacdef = 305a03d0   Offsi = 36, Offsi = 20
kkscoacd
 Bind#0
  oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
  oacflg=03 fl2=1000000 frm=00 csi=00 siz=56 off=0
  kxsbbbfp=04f78304  bln=22  avl=02  flg=05
  value=1
 Bind#1
  oacdty=01 mxl=32(10) mxlc=00 mal=00 scl=00 pre=00
  oacflg=03 fl2=1000000 frm=01 csi=846 siz=0 off=24
  kxsbbbfp=04f7831c  bln=32  avl=01  flg=01
  value="x"
 Frames pfr 04F7AB28 siz=2288 efr 04F7AB70 siz=1916
 Cursor frame dump
  enxt: 3.0x00000044  enxt: 2.0x00000028  enxt: 1.0x00000710
  pnxt: 2.0x00000004  pnxt: 1.0x00000170
 kxscphp  04F6608C siz=1000 inu=0 nps=744
 kxscehp  04F66194 siz=1000 inu=0 nps=160
...

ASHダンプ

SGAのASH(Active Session History)情報を取得します。

 alter session set events 'immediate trace name ashdump level ';
 oradebug dump ashdump ;

Levelは過去数分間の履歴を取得するかを指定します。もしlevel10に指定すると、過去10分間の情報を取得することになります。ASH情報はアクティブセッションのリストを保存するため、Oracle ハングのような現象が発生したとき、事後分析用途に有用です。

トレースファイルに記録されているダンプの内容の例は、以下のようになります。

Processing Oradebug command 'dump ashdump 10'
ASH dump
<<>>
****************
SCRIPT TO IMPORT
****************
------------------------------------------
Step 1: Create destination table 
------------------------------------------
CREATE TABLE ashdump AS
SELECT * FROM SYS.WRH$_ACTIVE_SESSION_HISTORY WHERE rownum < 0
----------------------------------------------------------------
Step 2: Create the SQL*Loader control file  as below
----------------------------------------------------------------
load data 
infile * "str '\n####\n'"
append
into table ashdump
fields terminated by ',' optionally enclosed by '"'
(                               
SNAP_ID  CONSTANT 0           , 
DBID                          , 
INSTANCE_NUMBER               , 
SAMPLE_ID                     , 
SAMPLE_TIME TIMESTAMP ENCLOSED BY '"' AND '"' "TO_TIMESTAMP(:SAMPLE_TIME   ,'MM-DD-YYYY HH24:MI:SSXFF')"   , 
SESSION_ID                    , 
SESSION_SERIAL#               , 
SESSION_TYPE                  , 
USER_ID                       , 
SQL_ID                        , 
SQL_CHILD_NUMBER              , 
SQL_OPCODE                    , 
FORCE_MATCHING_SIGNATURE      , 
TOP_LEVEL_SQL_ID              , 
TOP_LEVEL_SQL_OPCODE          , 
SQL_PLAN_HASH_VALUE           , 
SQL_PLAN_LINE_ID              , 
SQL_PLAN_OPERATION#           , 
SQL_PLAN_OPTIONS#             , 
SQL_EXEC_ID                   , 
SQL_EXEC_START DATE 'MM/DD/YYYY HH24:MI:SS' ENCLOSED BY '"' AND '"' ":SQL_EXEC_START"   , 
PLSQL_ENTRY_OBJECT_ID         , 
PLSQL_ENTRY_SUBPROGRAM_ID     , 
PLSQL_OBJECT_ID               , 
PLSQL_SUBPROGRAM_ID           , 
QC_INSTANCE_ID                , 
QC_SESSION_ID                 , 
QC_SESSION_SERIAL#            , 
EVENT_ID                      , 
SEQ#                          , 
P1                            , 
P2                            , 
P3                            , 
WAIT_TIME                     , 
TIME_WAITED                   , 
BLOCKING_SESSION              , 
BLOCKING_SESSION_SERIAL#      , 
CURRENT_OBJ#                  , 
CURRENT_FILE#                 , 
CURRENT_BLOCK#                , 
CURRENT_ROW#                  , 
CONSUMER_GROUP_ID             , 
XID                           , 
REMOTE_INSTANCE#              , 
TIME_MODEL                    , 
SERVICE_HASH                  , 
PROGRAM                       , 
MODULE                        , 
ACTION                        , 
CLIENT_ID                       
)                               
---------------------------------------------------
Step 3: Load the ash rows dumped in this trace file
---------------------------------------------------
sqlldr userid/password control=ashldr.ctl data= errors=1000000
---------------------------------------------------
<<>>
<<>>
####
58646642,1,12519562,"04-26-2010 09:44:01.822000000",160,1,2,0,
"",0,0,0,"",0,0,0,0,0,
0,"",0,0,0,0,0,0,0,
3213517201,9858,0,3,1,0,69788,4294967295,0,
4294967295,0,0,0,0,,0,0,165959219,
"ORACLE.EXE (CKPT)","",
"",""
####
58646642,1,12519486,"04-26-2010 09:42:45.808000000",160,1,2,0,
"",0,0,0,"",0,0,0,0,0,
0,"",0,0,0,0,0,0,0,
3213517201,9767,1,1,1,0,38825,4294967295,0,
4294967295,0,0,0,0,,0,0,165959219,
"ORACLE.EXE (CKPT)","",
"",""
####
58646642,1,12519416,"04-26-2010 09:41:35.770000000",160,1,2,0,
"",0,0,0,"",0,0,0,0,0,
0,"",0,0,0,0,0,0,0,
4078387448,9683,3,3,3,0,11083,4294967295,0,
4294967295,0,0,0,0,,0,0,165959219,
"ORACLE.EXE (CKPT)","",
"",""
####
58646642,1,12519384,"04-26-2010 09:41:03.774000000",163,1,2,0,
"",0,0,0,"",0,0,0,0,0,
0,"",0,0,0,0,0,0,0,
3176176482,40612,5,1,1000,999888,0,4294967291,0,
4294967295,0,0,0,0,,0,0,165959219,
"ORACLE.EXE (DIA0)","",
"",""
####
58646642,1,12519304,"04-26-2010 09:39:43.719000000",160,1,2,0,
"",0,0,0,"",0,0,0,0,0,
0,"",0,0,0,0,0,0,0,
3213517201,9551,1,1,1,0,38798,4294967295,0,
4294967295,0,0,0,0,,0,0,165959219,
"ORACLE.EXE (CKPT)","",
"",""
####
58646642,1,12519265,"04-26-2010 09:39:04.663000000",163,1,2,0,
"",0,0,0,"",0,0,0,0,0,
0,"",0,0,0,0,0,0,0,
3176176482,40493,5,1,1000,999941,0,4294967291,0,
4294967295,0,0,0,0,,0,0,165959219,
"ORACLE.EXE (DIA0)","",
"",""
####
58646642,1,12519183,"04-26-2010 09:37:42.554000000",160,1,2,0,
"",0,0,0,"",0,0,0,0,0,
0,"",0,0,0,0,0,0,0,
3213517201,9406,0,1,1,0,54077,4294967295,0,
4294967295,0,0,0,0,,0,0,165959219,
"ORACLE.EXE (CKPT)","",
"",""
####
<<>>

*** 2010-04-26 09:45:51.625
Oradebug command 'dump ashdump 10' console output: