Showing posts with label Preliminary Connection. Show all posts
Showing posts with label Preliminary Connection. Show all posts

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の用度は想像するのによって多様なものなどがあるでしょう。