在Oracle10g中,Oracle引入了sga_target初始化参数,进而实现了 ASMM(Automatic Shared Memory Management),即让设置一个SGA的目标值以及SGA的最大值,数据库来动态调整其中的各个组件,如Database buffer cache、Shared pool等等。从使用的角度来说ASMM的出现极大地简化了Oracle内存初始化参数的设置,在ASMM的使用上高级DBA和初学者不会有太大的差别;然而,ASMM带来便利的同时,更大程度上它是一个黑盒,黑盒里面藏了很多秘密,这些秘密带来比手动管理更多的不确定性。
下面我们看一下如何修改sga_target初始化参数的大小。
1.测试环境
我们在Oracle10g中进行测试,操作系统是Windows Server 2008 R2 Standard。
-
SQL>
-
SQL> select * from v$version;
-
-
BANNER
-
----------------------------------------------------------------
-
-
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
-
PL/SQL Release 10.2.0.4.0 - Production
-
CORE 10.2.0.4.0 Production
-
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
-
NLSRTL Version 10.2.0.4.0 - Production
2.官方文档定义
接下来,我们看一下和ASMM相关的两个初始化参数在官方文档中的说明。
SGA_MAX_SIZE
属性
|
描述
|
参数类型
|
Big integer
|
语法
|
SGA_MAX_SIZE = integer [K | M | G]
|
默认值
|
数据库启动时SGA的初始化大小,取决于SGA中不同池的大小,例如缓冲区,共享池,大池,等等。
|
是否可修改
|
否
|
取值范围
|
0~视操作系统而定
|
SGA_MAX_SIZE指定了实例生命周期内SGA的最大值。
在64位平台或者非32位Windows平台,当MEMORY_TARGET或MEMORY_MAX_TARGET被设定时,SGA_MAX_SIZE会被设置为二者的较大值。这样将会预留更多的地址空间用于扩大SGA。
SGA_TARGET
属性
|
描述
|
参数类型
|
Big integer
|
语法
|
SGA_TARGET = integer [K | M | G]
|
默认值
|
0(SGA自动调整功能在DEFERRED模式调整请求下被禁用,但是在IMMEDIATE模式调整请求下是允许的)
|
是否可修改
|
ALTER SYSTEM
|
取值范围
|
64M~视操作系统而定
|
是否基本参数
|
是
|
SGA_TARGET制定了SGA各个组件的总大小。如果SGA_TARGET被指定,那么下面所列出的内存池大小将被自动分配:
l Buffer cache (DB_CACHE_SIZE)
l Shared pool (SHARED_POOL_SIZE)
l Large pool (LARGE_POOL_SIZE)
l Java pool (JAVA_POOL_SIZE)
l Streams pool (STREAMS_POOL_SIZE)
如果上述自动调整的内存池被设置为非零值,那么这些值将被自动共享内存管理系统(ASMM, Automatic Shared Memory Management)视为最小值。如果一个应用组件正常运行要求一个最小数值的内存,那么你就需要设定最小值。
下述内存池需要手工设置大小,不受自动共享内存管理系统(ASMM, Automatic Shared Memory Management)的影响:
l Log buffer
l Other buffer caches, such as KEEP, RECYCLE, and other block sizes
l Fixed SGA and other internal allocations
当自动共享内存管理系统在计算自动调整内存池的具体大小时,会将上述内存池内存从总的可用SGA_TARGET中扣除。
在“默认值”字段中,IMMEDIATE模式自动调整要求是必要的,这样可以避免ORA-04031错误。DEFERRED和IMMEDIATE模式的具体值,可以通过V$MEMORY_RESIZE_OPS视图的OPER_MODE列来查看。
3.查看相关初始化参数值
我们通过show parameter来查看初始化参数值,相关的参数包括sga_max_size、sga_target、pga_aggregate_target等。
-
SQL>
-
SQL> show parameter sga
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
lock_sga boolean FALSE
-
pre_page_sga boolean FALSE
-
sga_max_size big integer 1232M
-
sga_target big integer 1232M
-
SQL>
-
SQL> show parameter pga
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
pga_aggregate_target big integer 808M
-
SQL>
我们看到,sga_max_size和sga_target两个参数的值都是1232M。
4.修改sga_target
我们通过alter system语句来修改sga_target,需要注意的是,sga_target是个动态参数,而sga_max_size是个静态参数。
这样一来,当修改值<=sga_max_size时,我们可以直接修改sga_target值;但是,当修改值>sga_max_size时,我们必须首先修改sga_max_size参数值,重启数据库使静态参数生效后再去修改sga_target值,否则,数据库会报错。
注意:
修改sga_target值时,不能将参数值设置过小,否则会报错ORA-00827。
4.1修改值<=SGA_MAX_SIZE
首先,尝试将sga_target参数值修改为800M,修改成功;
然后,尝试将sga_target参数值修改为500M,数据库报错ORA-00827,提示“无法将 sga_target 压缩到指定值”;
-
SQL>
-
SQL> alter system set sga_target=800M;
-
-
系统已更改。
-
-
SQL>
-
SQL> alter system set sga_target=500M;
-
alter system set sga_target=500M
-
*
-
第 1 行出现错误:
-
ORA-02097: 无法修改参数, 因为指定的值无效
-
ORA-00827: 无法将 sga_target 压缩到指定值
-
-
-
SQL>
修改完成后,我们可以查看一下参数值,确认参数是否修改成功。
-
SQL>
-
SQL> show parameter sga
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
-
lock_sga boolean FALSE
-
pre_page_sga boolean FALSE
-
sga_max_size big integer 1232M
-
sga_target big integer 800M
-
SQL>
4.2修改值>SGA_MAX_SIZE
首先,尝试将sga_target参数值修改为2G,数据库报错ORA-00823,提示“指定的 sga_target 的值大于 sga_max_size”;
-
SQL>
-
SQL> alter system set sga_target=2G;
-
alter system set sga_target=2G
-
*
-
第 1 行出现错误:
-
ORA-02097: 无法修改参数, 因为指定的值无效
-
ORA-00823: 指定的 sga_target 的值大于 sga_max_size
-
-
-
SQL>
从官方文档对两个初始化参数的解释得知,sga_target的最大值是sga_max_size。
因此,我们需要首先修改sga_max_size的值,由于sga_max_size是静态参数,因此需要重启数据库,待静态参数修改生效后,这时才能将ga_target设置为目标值。
-
SQL>
-
SQL> alter system set sga_max_size=2G scope=spfile;
-
-
系统已更改。
-
SQL>
但是在重启过程中报错,提示“ORA-28547: 连接服务器失败, 可能是 Oracle Net 管理错误”。报错过程如下:
-
SQL>
-
SQL> shu immediate
-
数据库已经关闭。
-
已经卸载数据库。
-
ORACLE 例程已经关闭。
-
SQL>
-
SQL>
-
SQL> startup
-
ORA-28547: 连接服务器失败, 可能是 Oracle Net 管理错误
-
SQL>
-
SQL> conn /@hoegh as sysdba
-
ERROR:
-
ORA-01041: 内部错误, hostdef 扩展名不存在
-
-
-
SQL> conn sys/oracle@hoegh as sysdba
-
ERROR:
-
ORA-28547: 连接服务器失败, 可能是 Oracle Net 管理错误
-
-
-
SQL>
经过分析可能和Windows下的服务有关,Windows平台下,oracle 中组成实例的后台进程是由 oracle 服务派生出来的线程实现的,所以任务管理器看不见 DBWn 之类的后台进程。shutdown 停掉实例过程,是关闭后台进程(这里对应线程)和释放 SGA 内存。因为关闭的是线程,所以在任务管理器中看不出变化。停掉 oracle 服务,才能停掉 oracle 进程。于是,我手动关闭并重启了Oracle服务,再次连接sys用户,顺利登陆。
-
SQL> conn /@hoegh as sysdba
-
已连接。
-
SQL>
-
SQL>
-
SQL> show parameter sga
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
-
lock_sga boolean FALSE
-
pre_page_sga boolean FALSE
-
sga_max_size big integer 2G
-
sga_target big integer 800M
-
SQL>
我们看到,sga_max_size参数已经成功修改为2G,此时我们就可以修改sga_target的值了。
-
SQL>
-
SQL> alter system set sga_target=2G;
-
-
系统已更改。
-
-
SQL>
-
SQL>
-
SQL> show parameter sga
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
-
lock_sga boolean FALSE
-
pre_page_sga boolean FALSE
-
sga_max_size big integer 2G
-
sga_target big integer 2G
-
SQL>
Oracle10g修改SGA_TARGET
原文:http://blog.itpub.net/30162081/viewspace-1744573/