Tuesday, August 25, 2009

Preliminary ConnectionとOradebug Direct Access

Oracle10gでPreliminary Connectionという機能を使ったことがあるでしょう。Preliminary Connectionというのはインスタンスに接続しないで、Direct Memory Accessで作業を行うのを指します。


この意味からこの機能をSessionless Sessionと言う場合もあります。


Oracleが完全にHang状態に落ちいて正常的なSessionを作ることができない時、System State DumpやHang AnalyzeなどのデータをDBAが収集できるようにする機能だと見れば正確です。

(もちろんMaxgaugeのようなDirect Memory Access基盤の製品を使ってもいいですね。)


次のような方法でSQL*Plusを実行すればPreliminary Connection状態になります。


set oracle_sid=ukja1106

sqlplus -prelim sys/oracle as sysdba

-- または

sqlplus /nolog
@> set _prelim on
@> conn sys/oracle as sysdba

この状態では一般的なQueryは実行されません。

SYS@ukja1106> select * from dual;
select * from dual
*
ERROR at line 1:
ORA-01012: not logged on
Process ID: 0
Session ID: 0 Serial number: 0

次のようにSystem State DumpやHang Analyzeは成功的に実行されます。

SYS@ukja1106> oradebug setmypid
Statement processed.
SYS@ukja1106> oradebug dump systemstate 266
Statement processed.
SYS@ukja1106> oradebug dump hanganalyze 10
Statement processed.

ただし、SGA Heap DumpのようなOperationは不可能なようです。すべてのVersionで確認したことではありません。

SYS@ukja1106> oradebug dump heapdump 0x20000002
ORA-00600: internal error code, arguments: [ksfglt:no_proc], [], [], [], [], [],
[], []

Oracle11gではoradebugにdirect accessという機能が追加されました。Direct Memory AccessでFixed Table(X$ Table)を読む機能です。この機能はPreliminary Connectionまたは一般Connectionで使えます。

例えは、次のようにSessionデータを読みます。

SYS@ukja1106> oradebug direct_access select * from x$ksuse;
ORA-15655: Fixed table "X$KSUSE" cannot be accessed safely in prelim connection.

エラーです。この場合には次のようにUnsafeモードを指定します。

SYS@ukja1106> oradebug direct_access set mode=unsafe
Statement processed.

....
ADDR = 2F0D0850
INDX = 170
INST_ID = 1
KSSPAFLG = 1
KSSPAOWN = 2FA92228
KSSPATYP = 1
KSUUDSES = 0
KSUUDUID = 0
KSUUDNAM = SYS
KSUUDLUI = 0
KSUUDLNA =
KSUUDPRV = 0
KSUUDOCT = 0
KSUUDFLG = 0
KSUUDPFN = 0
KSUUDSID = 0
KSUUDSNA = SYS
KSUUDSAE = 0
KSQPSWAT = 0
KSQPSRES = 0
KSQPSRESLAT = 0
KSUSEPRO = 2FA92228
KSUSETRN = 0
KSUSEBRN = 0
KSUSENUM = 170
KSUSESER = 14
KSUSEFLG = 81
KSUSEIDL = 1
KSUSESOW = 2147483644
KSUSEPID = 2064
KSUSEUNM = SYSTEM
KSUSEMNM = XXXX-3C2E2AF808
KSUSEPNM = ORACLE.EXE (CJQ0)
KSUSETID = XXXX-3C2E2AF808
KSUSESQL = 0
KSUSESQH = 0
KSUSESQI =
KSUSESCH = 0
KSUSESPH = 0
KSUSEPSI =
KSUSEPSQ = 0
KSUSEPHA = 0
KSUSEPCH = 0
KSUSEPPH = 0
KSUSEPEO = 0
KSUSEPES = 0
KSUSEPCO = 0
KSUSEPCS = 0
KSUSEOBJ = 5653
KSUSEFIL = 1
KSUSEBLK = 11378
KSUSESLT = 0
KSUSEFIX = 2362004
KSUSEAPP =
KSUSEAPH = 0
KSUSEACT =
KSUSEACH = 0
KSUSECLI =
KSUSECTM = 528627
KSUSELTM = 19-AUG-09 02.04.55 PM
KSUSEFT = 0
KSUSEFM = 0
KSUSEFS = 0
KSUSEQCSID = 0
KSUSEGRP =
KSUSEPFL = 0
KSUSEPXOPT = 17
KSUSETMC = 0
KSUSECQD = 0
KSUSEPGAMAN = 0
KSUSEPGAAUTO = 0
KSUSECLID =
KSUSEBLOCKER = 4294967292
KSUSESEQ = 12717
KSUSEOPC = 6
KSUSEP1 = 500
KSUSEP1R = 00000000000001F4
KSUSEP2 = 0
KSUSEP2R = 0000000000000000
KSUSEP3 = 0
KSUSEP3R = 0000000000000000
KSUSETIM = 0
KSUSEWTM = 1
KSUSESVC = SYS$BACKGROUND
KSUSEFLG2 = 1032
KSUSESESTA =
KSUSESEID = 0
KSUSEPESTA =
KSUSEPEID = 0
KSUSECRE = 2FA92228
KSUSECSN = 6

170 rows selected

私が想像するDirect Accessの用度は「OracleがHangに陥った時、System State DumpやHang Analyzeの他にFixed Tableから別度の情報を得たい場合」です。例えば、次のようなFixed Tableを通じればSession,Wait,Latch Missなどのような情報を得ることができます。

oradebug direct_access select * from x$ksuse;

oradebug direct_access select * from x$kslwt;

oradebug direct_access select * from x$kslwsc;


Direct Accessの用度は想像するのによって多様なものなどがあるでしょう。

No comments:

Post a Comment