书名书名书名书名书名书名书名书名书名书名书名书名书名书名
Starting ORACLE instance (normal) Thu Nov 17 09:27:29 2005
WARNING: EINVAL creating segment of size 0x0000000033400000 fix shm parameters in /etc/system or equivalent
这是一个WARNING的提示,说明是建议修正,但并非强制的内容。在Solaris平台上,有时候也会看到类似的警报:
Sun Apr 30 05:35:20 2006
Starting ORACLE instance (normal) Sun Apr 30 05:35:20 2006
WARNING: Not enough physical memory for SHM_SHARE_MMU segment of size 0x000000006d400000 [flag=0x4000]
这通常是因为SGA设置过大,超过了物理内存而导致的,这种情况通过修正参数即可解决。有时候这类警告也可能是因为数据库异常关闭,后台进程未正常退出,共享内存未及时释放引起的,对于这种情况,可以通过ipcs命令找到共享内存段id(shared memory id),然后通过ipcrm命令可以强制释放该共享内存段,完成这些特殊处理后,数据库通常就可以正常启动了。
5.1.3 SGA管理的变迁
在Oracle9i之前,SGA一直是静态分配内存的。SGA分配的内存空间可以被所有的Oracle 进程/线程所共享,内存的大小是根据init.ora 参数文件中的值计算得来的,一旦分配完毕,可用共享内存的大小就不能增大或缩小,如果DBA 要增加数据库块缓冲区的数量,必须首先关闭例程修改初始化参数文件,然后重新启动该例程。
让我们从Oracle8i开始,研究一下Oracle SGA管理的变迁。 1. Oracle8i中静态SGA的管理
我们知道在Oracle8i之中,当我们需要修改SGA参数时(例如:SHARED_POOL_SIZE),必需修改参数文件,重新启动数据库之后,修改才能生效.
我们可以从参数文件中找到这些重要参数,下面是一个Oracle8i数据库的设置示例:
db_block_buffers = 25000 shared_pool_size = 104857600 large_pool_size = 8388608 java_pool_size = 10485760 log_buffer = 163840
当然这些参数的设置要受物理内存的限制,需要全面考虑。 2. Oracle9i动态SGA管理
从Oracle9i开始,Oracle推出了动态SGA调整,也就是说,允许我们不重新启动数据库而使得SGA的修改生效。
·36·
第1章 章名章名章名章名章名
在Oracle9i中,我们可以设置参数SGA_MAX_SIZE,该参数用以控制各缓冲池使用的内存总和,本质上是在进程中预先分配一段虚拟地址备用而不分配物理内存,目的是防止和进程私有地址段的冲突:
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ sga_max_size big integer 387418608
设置了该参数之后,我们可以通过在线方式修改Oracle SGA各内存组件的内存分配,经常我们可能用到类似如下命令(关于Scope参数等说明可以参考上一章的内容):
alter system set db_cache_size = 2g scope=memory; alter system set large_pool_size = 200m scope=memory; alter system set java_pool_size = 200m scope=memory;
只要总的SGA内存设置不超过SGA_MAX_SIZE的设置,更改都可以立即生效(但是需要注意的是,在Oracle9iR1中,动态减小内存设置可能会触发一些Bug,在繁忙的生产系统中,缩减各组件的内存使用应该是相当慎重的):
SQL> alter system set db_cache_size=100M; System altered.
如果内存不足,则Oracle会给出错误,提示内存缺乏:
SQL> alter system set db_cache_size=500M; alter system set db_cache_size=500M *
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid ORA-00384: Insufficient memory to grow cache
当然在动态修改这些参数时,存在一些常见的限制:
1. 修改的内存大小必须是粒度(granule)大小的整数倍,否则会自动向上取整 2. SGA 总大小不能超过SGA_MAX_SIZE
3. SGA 最低配置为三个粒度(granule)一个粒度用于固定的SGA(包括重做缓冲区),
一个粒度用于缓冲区高速缓存,一个粒度用于共享池。 通过OEM,我们可以直观的了解一下Oracle9i SGA各部分参赛设置:
·37·
书名书名书名书名书名书名书名书名书名书名书名书名书名书名
伴随动态SGA管理的新特性,Oracle推出了一系列内存设置建议功能,同时引入了一系列动态性能视图:
SQL> select tname from tab where tname like '-VICE%'; TNAME
------------------------------ GV_$DB_CACHE_ADVICE GV_$MTTR_TARGET_ADVICE
GV_$PGATARGET_ADVICE_HISTOGRAM GV_$PGA_TARGET_ADVICE GV_$SHARED_POOL_ADVICE V_$DB_CACHE_ADVICE V_$MTTR_TARGET_ADVICE V_$PGA_TARGET_ADVICE
V_$PGA_TARGET_ADVICE_HISTOGRAM V_$SHARED_POOL_ADVICE 10 rows selected.
其中和SGA相关的是V$DB_CACHE_ADVICE和V$SHARED_POOL_ADVICE,这些新功能通过在数据库运行时持续不断的收集信息,从而对内存的设置提供建议。
·38·
第1章 章名章名章名章名章名
缓冲区高速缓存建议(buffer cache advisory) 受初始化参数DB_CACHE_ADVICE控制。该参数为动态参数,可用的值有三个OFF、ON 和READY。
DB_CACHE_ADVICE 不同参数值的含义分别如下:
OFF-关闭建议并且不为建议分配内存 ON-开启建议并且CPU 和内存开销都会发生 READY-关闭建议但是仍保留为建议分配的内存
在某些版本中,如果在参数为OFF 状态时尝试将其设置为ON 可能会出现ORA-4031错误,无法从共享池中分配内存;如果参数处于READY 状态则可以将其设置为ON 而不会发生错误,这是因为需要的内存已经分配。
我们看一下一个生产数据库中,Oracle收集的buffer cache建议信息:
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ db_cache_advice string ON
SQL> select id,name,block_size,size_for_estimate sfe,size_factor sf, 2 estd_physical_read_factor eprf,estd_physical_reads epr 3 from v$db_cache_advice;
ID NAME BLOCK_SIZE SFE SF EPRF EPR ---------- -------------------- ---------- ---------- ---------- ---------- ---------- 3 DEFAULT 8192 96 0.0938 63.0018 2579371363 3 DEFAULT 8192 192 0.1875 28.9921 1186971632 3 DEFAULT 8192 288 0.2813 17.2038 7043452876 3 DEFAULT 8192 384 0.375 10.577 4330360330 3 DEFAULT 8192 480 0.4688 6.3443 2597429002 3 DEFAULT 8192 576 0.5625 4.1087 1682151293 3 DEFAULT 8192 672 0.6563 2.897 1186065595 3 DEFAULT 8192 768 0.75 2.1604 8844976015 3 DEFAULT 8192 864 0.8438 1.5728 6439364907 3 DEFAULT 8192 960 0.9375 1.1605 4751342947 3 DEFAULT 8192 1024 1 1 4094120994
3 DEFAULT 8192 1056 1.0313 0.937 3836222877 3 DEFAULT 8192 1152 1.125 0.7783 3186337904 3 DEFAULT 8192 1248 1.2188 0.6519 2669051919 3 DEFAULT 8192 1344 1.3125 0.534 2186279350 3 DEFAULT 8192 1440 1.4063 0.4296 1758909643 3 DEFAULT 8192 1536 1.5 0.3529 1444916209
·39·
书名书名书名书名书名书名书名书名书名书名书名书名书名书名
3 DEFAULT 8192 1632 1.5938 0.2946 1206059096 3 DEFAULT 8192 1728 1.6875 0.2416 989138472 3 DEFAULT 8192 1824 1.7813 0.2031 831457344 3 DEFAULT 8192 1920 1.875 0.1712 700889664 21 rows selected
我们可以看到,伴随db_cache_size的增大,估计的物理读(estd_physical_reads)在逐渐减少,我们的选择就在于在db_cache_size的设置和physical_reads之间寻找一个边际效益最高点,使用可以接受的内存设置,获得尽量低的物理读。
在Oracle9i中,OEM中提供了对以上数据的图形化展现,我们可以清楚的看到趋势曲线:
而对于Shred Pool的建议则受到另外一个初始化参数的影响,这个参数是: STATISTICS_LEVEL。STATISTICS_LEVEL控制数据库收集的统计信息的级别,该参数有三个选项:
u? BASIC-收集基本的统计信息
u? TYPICAL-收集大部分的统计信息,这是系统的缺省设置,为了从Oracle不断增加的
新特性中受益,始终应该将该参数设置为典型. u? ALL-收集全部的统计信息.
可以通过v$statistics_level视图来查看该参数的影响范围,在Oracle11g中该视图中的条
SQL>select STATISTICS_NAME,SESSION_STATUS, ·40·
目已经增加到24个:
05内存管理



