今早重新又翻看了eygle的深入浅出的关于sga和pga的章节,对于sga和pga如何设置可以说一直没有什么定性的标准,这里先说一下关于自动管sga和pga管理中参考的两个视图v$sga_target_advice和v$pga_target_advice
SQL> desc v$sga_target_advice;
Name Type Nullable Default Comments
------------------- ------ -------- ------- --------
SGA_SIZE NUMBER Y
SGA_SIZE_FACTOR NUMBER Y 此表中的sga_size和当前parameter中sga大小比值
ESTD_DB_TIME NUMBER Y
ESTD_DB_TIME_FACTOR NUMBER Y
ESTD_PHYSICAL_READS NUMBER Y 在该sga_size参数下估计的物理读次数
SQL> desc v$pga_target_advice;
Name Type Nullable Default Comments
----------------------------- ----------- -------- ------- --------
PGA_TARGET_FOR_ESTIMATE NUMBER Y
PGA_TARGET_FACTOR NUMBER Y
ADVICE_STATUS VARCHAR2(3) Y advice是否可采用on/off,取决于staitiscs_level
BYTES_PROCESSED NUMBER Y 所有进程占用的资源bytes
ESTD_EXTRA_BYTES_RW NUMBER Y 被估计用于读和写的资源占用
ESTD_PGA_CACHE_HIT_PERCENTAGE NUMBER Y 估计的命中率
ESTD_OVERALLOC_COUNT NUMBER Y 此参数非0则表示pga设置不足够大
我们完全可以根据上述视图的几个列来设置sga和pga的大小,例如根据v$sga_target_advice视图的estd_physical_reads和sga_size来查看sga的变化带来的物理读次数的变化,或者根据v$pga_target_advice视图的estd_pga_cache_hit_percentage和pga_target_for_estimate参数,随着pga的变化带来的命中率的变化而设置一个合理的数值。
根据oracle的建议,oracle最多可以使用80%物理内存,其余20%给os,在80%的内存中,对于OLTP系统分配20%给pga,80%给sga,对于DSS系统,则可以分别分配50%给pga和sga使用,当然需要参考系统的具体业务情况,做awr和statspack统计系统的运行信息设置合理的参数!
随便提一下:有网友经常提到数据库实例都有个误解的说法,就是数据库起不来说是实例起不来,实例只是数据库访问的一种方式,从结构上说就是sga和oracle后台进程。
SQL> show sga
Total System Global Area 419430400 bytes
Fixed Size 1249320 bytes
Variable Size 83890136 bytes
Database Buffers 327155712 bytes
Redo Buffers 7135232 bytes
固定sga:
记得以前看官方文档时,sga中的固定部分的fixed size始终不理解具体是个什么,而eygle深入浅出中理解为数据库和实例的状态等通用信息,后台进程需要经常访问这些信息。
Linux等平台shmmax内核参数:
记得前些天在linux上安装oracle时,设置了一个内核参数shmmax,该参数存在于linux/unix操作系统内,shmmax内核参数定义式系统允许的单个共享内存段最大值,可以试想如果sga大于shmmax,sga会创建分配于多个共享内存段,当然系统中最好将sga分配在一个共享内存中。
共享内存没有释放:后台进程或者sga设置过大
前些天pub的网友的一个帖子中说到数据库无法启动nomount,nomount阶段oracle数据库需要的spfile文件,这个既然可以保证,那么就可能是内存方面无法分配了,可能由于sga设置过大,超过物理内存无法启动,还有可能是数据库异常关闭,后台进程未正常退出,共享内存也就没有及时释放引起,推过ipcs找出共享内存段shared memory id然后ipcrm强制释放即可!
两个参数statistics_level和db_cache_advice
在oracle 9I前调整sga的各个组件的大小都需要重新启动数据库,oracle 9I后可以动态调整sga的各组件的大小,这里还是列出视图v$db_cache_advice和v$shared_pool_advice,其中跟此视图相关的有两个参数db_cache_advice和statistics_level ,其中的db_cache_advice跟视图v$db_cache_advice相关,缺省值为on为开启建议并且消耗cpu和内存,off为关闭建议不为建议分配内存,ready为关闭建议但保留分配的内存。(这里eygel提到了:可能在某些版本中由off到on时出现ora-4031,无法从共享池中分配内存,不过在10g的自动sga管理中可能很难看见了)
另一个参数statistics_level控制数据库收集统计信息级别,缺省的为typical收集大部分统计信息,而all则为收集全部统计信息,basic则为收集基本统计信息。
Asmm下的调整信息保留和mman进程:
在oracle 10G的asmm自动管理sga下,我们很少去关心sga的各组件的具体设置,而只需要设置一个sga_target参数让其自动管理即可,即使重启数据库oracle也会记录上次启动的sga的各组件具体信息在spfile,下次启动数据库时不会丢失之前的调整结果(其实关于asmm下sga的信息的db下次启动的保留oracle concept中也提到了,所以有些知识和细节是需要反复阅读和探究才会发觉和熟悉的!)这里顺便提一下一个后台进程是在asmm管理模式下的mman进程,此进程用于自动管理调整sga各组件大小,而调整的依据还是收集的统计信息建议,该进程可以在v$processes视图或者alert.log中均可以发现。
V$sga_dynamic_component:在oracle 10G的asmm下,增加的视图v$sga_dynamice_component,其中记载了各动态组件的当前大小current_size和最近一次的调整时间last_oper_time和调整类型last_oper_type。
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1056619/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25362835/viewspace-1056619/