oracle SGA大小设置问题。设置sga_target sga_max_size之后依然有问题!
Oracle SGA,系统全局区(System Global Area),SGA的大小对oracle的性能有直接影响,那么应该如何调整SGA的大小呢?
调整之前需要明确一个常识:32位版本的oracle最大支持1.75GB的SGA,如果oracle版本是32位的,那么你就不必尝试去调整大于1.7GB的SGA了。
Oracle的一个重要发展方向就是自动管理,当然,SGA与PGA也不例外,从Oracle 9i开始,就出现了一个新的参数sga_max_size,可以保证在此数值之内的内存可以自由地修改与调配。如指定了sga_max_size,就可以在这个范围内自由地设置Shared pool、Data buffer等的大小。从Oracle 10g开始,又出现了另外一个新的参数,sga_target,只要设置了这个参数.所有的SGA的组件,如Shared pool、Data buffer、Large pool等,都不需要手工指定了,Oracle会自动管理。这一特性被称为自动共享内存管理(Automatic Shared Memory Management,ASMM)也就是说,Oracle会根据需要随时改变各个内存组件的大小,以达到最佳使用状态。但这个参数的最大值会受sga_max_size值限制;关闭自动管理,只需将这个sga_target参数设置为0。
SGA中内存被各个组件以粒组GRANULE为单位进行划分,粒组的计算方法因SGA总大小和平台而异:
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 272M
sga_target big integer 272M
SQL> create pfile from spfile;
File created.
SQL>
SQL> alter system set sga_target=300M;
alter system set sga_target=300M
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00823: Specified value of sga_target greater than sga_max_size
反过来,如果sga_target值已经设置了272M,再将sga_max_size改成200M小于sga_target的值
SQL> alter system set sga_max_size=200M;
alter system set sga_max_size=200
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
静态参数不能直接修改内存
SQL> alter system set sga_max_size=200M scope=spfile;
System altered.
要加上scope=spfile才可以,spfile是动态参数文件。
SQL> startup force
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 92276304 bytes
Database Buffers 188743680 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 272M
sga_target big integer 272M
SQL>
没问题运行正常,因为oracle检测到sga_max_size设置的比当前sga_target还小 就自动调整sga_max_size至sga_target相等。
再设置sga_max_size值超越sga_target
SQL> alter system set sga_max_size=300M scope=spfile;
System altered.
Elapsed: 00:00:00.02
SQL> startup force
ORACLE instance started.
Total System Global Area 314572800 bytes
Fixed Size 1267260 bytes
Variable Size 121637316 bytes
Database Buffers 188743680 bytes
Redo Buffers 2924544 bytes
Database mounted.
Database opened.
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 300M
sga_target big integer 272M
如此设置才能被接受 此时也可以动态调整sga_target<=sga_max_size了
SQL> alter system set sga_target=290M;
System altered.
Elapsed: 00:00:00.04
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 300M
sga_target big integer 292M
总结:
sga_max_size 是静态的 设置必须重启库改完要重启数据库生效
sga_target 是动态的 直接可以修改内存
设置大于0的确定值就是开启ASMM ,设置0就是关闭ASMM
当sga_max_size设置小于SGA_TARget时,则sga_max_size=SGA_TARget
当sga_max_size设置大于sga_target时,则正常生效
当sga_target设置大于sga_max_size时 报错
ORA-00823: Specified value of sga_target greater than sga_max_size
当sga_target设置小于sga_max_size时正常并可动态修改,这也是oracle给我们的灵活的之处,10G中有了sga_target弥补了9I中设置sga_max_size需要重启的缺陷,10G生产中 我们就可以给sga_max_size一个大值,动态的调整sga_target来寻求合适的大小。
本文作者:steptodream
在正常情况下,查询非常慢。
1、检查SGA大小,以DBA身份连接到oracle数据库,输入show sga。
2、如果SGA过小,请修改其大小
修改SGA必须保持的原则:
1).sga_target不能大于sga_max_size,可以设置为相等。
2).SGA加上PGA等其他进程占用的内存总数必须小于操作系统的物理内存。
做如下操作前,必须备份dbs目录下的所有文件。
方法一:直接SQL命令行修改:
(如果spfile文件不存在,需先创建create spfile from pfile;)
SQL>alter system set sga_max_size=1024m scope=spfile;
然后需要重启数据库
SQL>shutdown immediate
SQL>startup
SQL>show sga;即可看到SGA的大小已经被修改
重启之后,再修改sga_target
SQL>alter system set sga_target=1024m scope=both;
alter system set MEMORY_TARGET=1300m scope=spfile ;
梅诗卡维: sga_max_size需要重启数据库来进行调整,而其中的db_cache_size等可以动态调节,在调节共享池时需要计算好SGA的总容量,假如超过了sga_max_size,就会出现报错的现象.
赤坎区19519568314: OracleSGA大小的解决方法是什么? ?
梅诗卡维: 在修改数据缓冲区的时候,提示错误如下: SQL> alter system set db_cache_size=... 所以我们需要修改init$ORACLE_SID. ORA的中sga的大小 (1)首先创建参数文件,...
赤坎区19519568314: 请教ORACLE11G怎么修改SGA的大小 - ?
梅诗卡维: 在正常情况下,查询非常慢.1、检查SGA大小,以DBA身份连接到oracle数据库,输入show sga.2、如果SGA过小,请修改其大小 修改SGA必须保持的原则: 1).sga_target不能大于sga_max_size,可以设置为相等. 2).SGA加上PGA等其他...
赤坎区19519568314: 如何修改oracle SGA大小 - ?
梅诗卡维: DBA用户登录,命令如下,完事后重启数据库.. alter system set sga_max_size=500M SCOPE=SPFILE;
赤坎区19519568314: 如何修改Oracle的块大小 - ?
梅诗卡维: 在正常情况下,查询非常慢.1、检查SGA大小,以DBA身份连接到oracle数据库,输入show sga.2、如果SGA过小,请修改其大小 修改SGA必须保持的原则: 1).sga_target不能大于sga_max_size,可以设置为相等. 2).SGA加上PGA等其他...
赤坎区19519568314: oracle SGA大小设置问题.设置sga - target sga - max - size之后依然有问题! - ?
梅诗卡维: 看来你是设置了MEMORY_TARGET 的大小,你先设置MEMORY_TARGET的值大于1024m,然后再执行你的sga设置语句.alter system set MEMORY_TARGET=1300m scope=spfile ;
赤坎区19519568314: oracle sga正确的设置大小 - ?
梅诗卡维: Oracle从10g开始,基本上就不需要用户分配 SGA、PGA 了,数据库自己会进行优化分配
赤坎区19519568314: oracle sga 参数无法修改是什么原因? - ?
梅诗卡维: 修改SGA参数时你用的是什么启动?是用spfile启动的吗?alter system set sga_max_size=2000m scope=spfile; 你查看下sga_max_size的status select * from v$parameter where name ='sga_max_size' ; 看看 ISSYS_MODIFIABLE 和 ISSES_MODIFIABLE 等字段是否为false , 如是,好像只能修改pfile 然后用 create spfile from pfile , 然后再重新启动oracle试试
赤坎区19519568314: 怎样调节oracle缓冲区大小 - ?
梅诗卡维: 调大sga此时数据库需要是在关闭状态,由于sga不是动态参数,所以我们需要修改init$ORACLE_SID.ORA的中sga的大小 (1)首先创建参数文件,这是为了保持和服务器参数文件一致SQL>create pfile from spfile; (2)修改init$ORACLE_SID....
赤坎区19519568314: SGA,PGA设置多少比较合理 - ?
梅诗卡维: SGA、PGA的分配原则 OLTP:SGA=系统内存*0.56,PGA=SGA*(0.1~0.2) OLAP:SGA=系统内存*0.48,PGA=SGA*(0.45~0.65)8G的话SGA设置4G就差不多了...PGA设置为1G差不多了