Oracle内存结构(一)----SGA的区域信息

SGA 的区域信息

SGA(system global area) 系统全局区跟一些必须的后台进程合进来称为实例 (Instance). 说它是全局区是包含了全局变量和数据结构 , 是系统区是包含了进入整个 Oracle Instance 的数据结构而不是特定的进程结构 .

SGA 区域 :

SGA 大概包括下面四到五种区域 :

The fixed area

The variable area

The database blocks area

The log buffer

The instance lock database(for parallel server instances)----OPS&RAC

根据内存的大小 , 我们可以把 The fixed area 和 The log buffer 设为很小 .

The fixed area:

SGA 中的 The fixed area 包含了数千个原子变量 , 以及如 latches 和指向 SGA 中其它区域的 pointers( 指针 ) 等小的数据结构 . 通过对 fixed table 内表 X$KSMFSV 查询 ( 如下 ) 可以获得这些变量的名字 , 变量类型 , 大小和在内存中的地址 .

SQL> select ksmfsnam, ksmfstyp, ksmfssiz, ksmfsadr

2> from x$ksmfsv;

这些 SGA 变量的名字是隐藏的而且几乎完全不需要去知道 . 但是我们可以通过结合 fixed table 内表 X$KSMMEM 获得这些变量的值或者检查它们所指向的数据结构 .

SQL>select a.ksmmmval from x$ksmmem a where addr=(select addr from x$ksmfsv where ksmfsnam=’kcrfal_’);

SGA 中的 fixed area 的每个组成部分的大小是固定的 . 也就是说它们是不依靠于其它的初始化参数的设置来进行调整的 .fixed area 中的所以组成部分的大小相加就是 fixed area 的大小 .

The variable area:

SGA 中的 the variable area 是由 large pool 和 shared pool 组成的 .large pool 的内存大小是动态分配的 , 而 shared pool 的内存大小即包含了动态管理的内存又包含了永久性的 ( 已经分配的 ) 内存 . 实际上 , 初始化参数 shared_pool_size 的大小设置是指定 shared pool 中动态分配的那部分内存的一个大概的 SIZES 而不是整个 shared pool 的 SIZES

Shared pool 中永久性的内存包含各种数据结构如 :the buffer headers, processes, sessions, transaction arrays, the enqueue resources , locks, the online rollback segment arrays, various arrays for recording statistics. 其中大部分的 SIZE 是依靠初始参数的设置来确定的 . 这些初始参数只能在实例被关闭的状态下才能够进行修改 . 所以这里说的永久性是针对实例打开状态下的生存期而言 . 简单的一个例子 PROCESSES 参数 . 在这个 process arrays 中的 slots 用完之后 , 如果有其它的 process 想再申请一个 process 则会失败 , 因为它们在内存中的大小是在实例启动时预分配的 . 不能动态修改之 .

针对很多永久性的 arrays, 有很多的 X$ 表都把这些元素做一个记录而成员结构则作为字段 .V$ 视图的数据就是从这些 X$ 表获得 . 如 V$PROCESS 是基于 X$KSUPR 内表的 .V$PROCESS 视图不包含 X$KSUPR 的全部字段 . X$KSUPR 也没有覆盖 SGA 进程结构的所有成员 .

The variable area 的在 SGA 中的 SIZES 就等于 LARGE_POOL_SIZE,SHARED_POOL_SIZE 和永久性的内存 arrays 的 SIZE 三者相加 . 永久性的内存 arrays 的总的 SIZE 可以通过初始参数的设置来计算得到 . 然而 , 你需要知道从参数获得这些 array sizes 的方程式 , 每个 array 元素大小的字节数 , 还有 array 头信息的 sizes. 这些跟 Oracle 的版本号和 OS 有关 . 实际使用中 , 我们是不必要计算这个永久性的内存 arrays 的 SIZE 的 . 如果想知道 , 一个方法就是在 STARTUP NOMOUNT 数据库时记下 the variable area. 然后减去参数中 LARGE_POOL_SIZE 和 SHARED_POOL_SIZE 的大小就可以 .

The database block area:

这个区域是数据库块的拷贝 . 在 Oracle 8i 中 ,buffer 数由 DB_BLOCK_BUFFERS 指定 . 每个 buffer 的大小由 DB_BLOCK_SIZE 指定 . 所以这个区域的大小是两者相乘 . 在 Oracle 9i 中 , 这个区域的大小是 DB_CACHE_SIZE 指定 . 这个区不包含它们自己的控制结构 , 只包含 database block copies data. 每个 buffer 的 header 信息存在于 SGA 的 the variable area 中 . 还有 latches 信息也放在 SGA 的 the variable area 中 . 在设置 DB_BLOCK_BUFFERS 时每 4 个 BUFFERS 会影响 the variable area 的 1K 的 SIZE. 关于这一点 . 可以通过测试 ( 针对 8i 而言 ).

The log buffer:

这个区域的 SIZE 是由参数 LOG_BUFFER 指定的 . 如果 OS 支持内存保护 ,log buffer 将会被两个保护页面包围起来以免被一些 ORACLE 的错误进程损坏 log buffer. 在 SGA 中 , 跟其它的如 variable area 和 database block area 相比 ,log buffer 是非常小的 .log buffer 分成内部的 buffer blocks, 而这些 block 各有 8 个字节的头部信息存在于 variable area 中 .

The instance lock database

在 OPS/RAC 配置中 ,instance locks 用来控制由所有 instances 共享的资源以串行的方式被进入并使用 .SGA 中的这个区域所维护的是本地实例所要使用的数据库资源 , 所有实例和进程都会用到的数据库资源 , 还有所有实例和进程当前需要的或者已经拥有的锁 (LOCKS). 这三个 arrays 的 SIZE 分别由参数 LM_RESS,LM_PROCS,LM_LOCKS 参数指定 .( 这三个参数是 RAC 的参数 , 在单实例中用 SHOW PARAMETER 是查看不到的 ). The instance lock database 还包含了 message buffers 和其它的 structure. 但是其 SIZE 是非常小的 .

这个区域的 SIZE 是没办法在实例启动的时候看到的 . 这是 Oracle Internals. 可以用 ORADEBUG 工具查看 .SQL>ORADEBUG IPC. 至于 ORADEBUG 工具就不做介绍 . 用这个工具做操作时需要经过 Oracle Support 同意 .

可以用以下的两种方式 DUMP SGA:

SQL> ALTER SESSION SET EVENTS 'immediate trace name global_area level 2';

或者 SQL>ORADEBUG DUMP GLOBAL_AREA 2

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus