SGA(system global area)系统全局区,这是所有oracle进程/线程都可以访问的一片内存区域。在linux/unix平台上,Oracle是多进程实现的,SGA以共享内存段的方式分配。而在windows平台,oracle以单进程多线程的方式现象,所以SGA实际上是Oracle进程的一片私有内存,但是可以供所以的线程共享访问。
通过sqlplus的show sga命令,可以看到,instance的sga主要分为4个部分:
SQL> show sga;
Total System Global Area 142606336 bytes
Fixed Size 1247732 bytes
Variable Size 92276236 bytes
Database Buffers 41943040 bytes
Redo Buffers 7139328 bytes
show sga命令和查询v$sga的结果是一致的,只是v$sga中没有列出四个部分的总和。
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 1247732
Variable Size 92276236
Database Buffers 41943040
Redo Buffers 7139328
Fixed Size
这是SGA中的固定区域,对于特定平台,这个值一般是固定的,也不会因为一些初始化参数的修改而变动。该部分主要保存SGA的一些控制信息,如固定大小原子变量,一些比较小的数据结构比如latch以及指向SGA其他部分的指针,指向其他一些较大的或者大小可变的变量的指针等。
oracle内部有几千个原子变量,内部表x$ksmfsv中列出了这些变量的名字,类型,大小以及内存地址等信息。
在oracle10.2.0.1中,共有8540个原子变量
SQL> select count(*) from x$ksmfsv;
COUNT(*)
----------
8540
SGA中每一个内存地址都在x$ksmmem中对应了一条记录,x$ksmmem记录了内存中的实际值。x$ksmmem每条记录代表了4字节的内存的内容。
SQL> select count(*) from x$ksmmem;
COUNT(*)
----------
35651584
35651584X4 = size of SGA = 142606336
通过关联x$ksmfsv和x$ksmmem,就能找到对应原子变量的实际值,在我的10.2.0.1版本中,关联查询这两个内部表的全部记录时,session会被断开,只能显示出前30行记录。
SQL> select a.ksmfsnam,b.ksmmmval,b.addr
2 from x$ksmfsv a, x$ksmmem b
3 where a.ksmfsadr=b.addr;
KSMFSNAM KSMMMVAL ADDR
-------------------- -------- --------
ksmsgf_ 00 03C384E0
ksmvsg_ 00000EEE 03C384E4
ksmver_ 0A200100 03C384E8
ksmismf_ 00000001 03C384EC
ksmidbf_ 00 03C384F0
ksmdbsize_ 00 03C384F4
ksmdbpn_ 00 03C384F8
ksmdbarea_ 00 03C384FC
ksmdbmapsize_ 00 03C38500
ksmdsgf_ 00 03C38504
ksmgsp_ 03C3A018 03C38508
KSMFSNAM KSMMMVAL ADDR
-------------------- -------- --------
ksmsgh_ 00 03C38510
ksmnwsgn_ 00 03C391EC
ksmlgh_ 00 03C391F0
ksmsth_ 04E9A1A4 03C39ECC
ksmfst_ 6B434010 03C39ED0
ksmjst_ 00 03C39F20
ksmlpz_ 00 03C39F6C
ksmlpm_ 00 03C39F70
ksmcrttimestamp_ 0006AA09 03C39F78
ksmanotendnfy_ 00 03C39F80
ksmanotshm_ 00 03C39F88
KSMFSNAM KSMMMVAL ADDR
-------------------- -------- --------
ksmanotshlvn_ 00 03C3A000
ksmanotshia_ 00 03C3A004
ksmanotshnm_ 00 03C3A008
ksmanotshnme_ 00 03C3A00C
ksmanotscl_ 00000001 03C3A010
ksmanotsto_ 00 03C3A014
ksmgsg_ 03C38510 03C3A018
ksmgsgp_ 03C3BB28 03C3BE64
ERROR:
ORA-03113: end-of-file on communication channel
查看alert.log,可以发现07445错误
ORA-07445: exception encountered: core dump [ACCESS_VIOLATION] [_qerfxGCol+1726] [PC:0x22F1E4A] [ADDR:0x3CE7000] [UNABLE_TO_READ] []
有些地址是不允许读,所以,最好不要通过这种方式来查询所有变量。
另外,利用oradebug工具也可以获得这些变量的值。
下面的例子中,sgaflg变量标志了distibuted recovery的状态。
SQL> oradebug setmypid
Statement processed.
SQL> alter system disable distributed recovery;
System altered.
SQL> oradebug dumpvar sga sgaflg
ub4 sgaflg_ [3C5129C, 3C512A0) = 00700012
SQL> alter system enable distributed recovery;
System altered.
SQL> oradebug dumpvar sga sgaflg
ub4 sgaflg_ [3C5129C, 3C512A0) = 0070001A
SQL> select a.ksmfsnam,b.ksmmmval,b.addr
2 from x$ksmfsv a, x$ksmmem b
3 where a.ksmfsadr=b.addr
4 and a.ksmfsnam='sgaflg_';
KSMFSNAM KSMMMVAL ADDR
-------------------- -------- --------
sgaflg_ 0070001A 03C5129C
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/193161/viewspace-50272/,如需转载,请注明出处,否则将追究法律责任。