прямой доступ к SGA / адреса полей в x$ksuse

 

 

 

 

На первый взгляд, нелёгкая это задача -- узнавать адреса полей в x$ksuse.
Но здесь на помощь нам приходят две "волшебные" таблицы x$kqfta (kernel query fixed tables) и x$kqfco (kernel query fixed tables column definitions), без которых вся идея прямого чтения SGA была бы практически обречена на провал.
Но используя эти таблицы мы с лёгкостью получаем необходимые данные:

 

SQL> select c.kqfconam field_name,
  2    c.kqfcooff offset,
  3    c.kqfcosiz sz
  4  from x$kqfco c,x$kqfta t
  5  where t.indx = c.kqfcotab and t.kqftanam='X$KSUSE'
  6  order by offset;

FIELD_NAME                         OFFSET         SZ
------------------------------ ---------- ----------
ADDR                                    0          4
INDX                                    0          4
INST_ID                                 0          4
KSUSEPRO                                0          4
KSSPATYP                                0          4
KSUSECTM                                0          4
KSUSECQD                                0          4
KSSPAFLG                                1          1
KSSPAOWN                                4          4
KSUUDSES                               24          4
KSUUDUID                               28          4
KSUUDLUI                               32          4
KSUUDNAM                               36         30
KSUUDLNA                               67         30
KSUUDPRV                              104          1
KSUUDOCT                              105          1
KSUUDFLG                              108          4
KSUUDPFN                              152          4
KSUUDSID                              160          4
KSUUDSNA                              164         30
KSUSEGRP                              198         32
KSUSETRN                              228          4
KSUSEBRN                              232          4
KSUSENUM                             1380          2
KSUSESER                             1382          2
KSUSEFLG                             1388          4
KSQPSWAT                             1416          4
KSUSEIDL                             1420          1
KSUSESOW                             1484          4
KSUSESQL                             1500          4
KSUSESQH                             1504          4
KSUSEUNM                             1528         30
KSUSEMNM                             1564         64
KSUSETID                             1632         30
KSUSEPID                             1668         12
KSUSEPNM                             1684         48
KSUSEFIL                             1740          2
KSUSEBLK                             1744          4
KSUSESLT                             1748          2
KSUSEOBJ                             1752          4
KSUSEAPP                             1756         48
KSUSEAPH                             1808          4
KSUSEACT                             1812         32
KSUSEACH                             1848          4
KSUSEFIX                             1852          4
KSUSECLI                             1856         64
KSUSELTM                             2084          7
KSUSEPSQ                             2096          4
KSUSEPHA                             2100          4
KSUSEPFL                             2108          4
KSUSEQCSID                           2120          2
KSUSEFT                              2196          4
KSUSEFM                              2200          4
KSUSEFS                              2204          4
KSUSETMC                             2348          4
KSUSECLID                            2356         64
KSUSEPGAMAN                          2360          4
KSUSEPGAAUTO                         2364          4

58 rows selected.

 

Всё!
Здесь можно добавить, что поля со смещением 0 не хранятся в рамках данной структуры, а вычисляются Oracle'ом динамически.
И ещё, обратите внимание на поле KSUSECLID. Оно начинается со смещения 2356 и имеет длину 64. Получается, что оно заканчивается на смещении 2420. Но ранее мы узнали, что размер записи в x$ksuse равен 2408 байт, что меньше чем 2420! Как такое может быть?
Краткое объяснение (а полное пока выходит за рамки этой статьи) здесь такое: по смещению 2356 хранится не значение поля, а его адрес.




назад далее