
Oracle Dump - 日本エクセム株式会社 Oracle 技術情報
目次[非表示]
- 1.インデックスツリーダンプ
- 2.ヒープダンプ
- 3.ライブラリキャッシュダンプ
- 4.ハング分析
- 5.システム/プロセス状態ダンプ
- 6.エラースタックダンプ
- 7.ASHダンプ
インデックスツリーダンプ
インデックスのツリー構造を取得します。
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: