调整SGA大小

 
调整SGA大小
 
如何设置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总大小和平台而异:
granule_size在不同平台、不同版本中,Oracle的设置的缺省值都可能不同
Oracle9i的官方文档如下描述:
 Granule size is determined by total SGA size.
 On most platforms, the size of a granule is 4 MB if the total SGA size is less than 128 MB,
 and it is 16 MB for larger SGAs. There may be some platform. dependency,
 for example, on 32-bit Windows NT, the granule size is 8 MB for SGAs larger than 128 MB.
Oracle10gR2文档如下描述:
 Granule size is determined by total SGA size.
 On most platforms, the size of a granule is 4 MB if the total SGA size is less than 1 GB,
 and granule size is 16MB for larger SGAs.
 Some platform. dependencies arise.
 For example, on 32-bit Windows, the granule size is 8 M for SGAs larger than 1 GB.
 所以我们知道对于这种没固定的内容了解即可
 那么如果粒度为16M 某个组件原来占32M,之后你改成了35M,实际则是48M大小
查询各个组件内存分配情况和粒度值 V$SGA_DYNAMIC_COMPONENTS
col COMPONENT for a30
col CURRENT_SIZE for a30
col GRANULE_SIZE for a30
SQL> select COMPONENT,CURRENT_SIZE/1048576||'M' CURRENT_SIZE,GRANULE_SIZE/1048576||'M' GRANULE_SIZE
     from V$SGA_DYNAMIC_COMPONENTS;
COMPONENT         CURRENT_SIZE        GRANULE_SIZE
------------------------------ ------------------------------ ------------------------------
shared pool         68M         4M
large pool         4M         4M
java pool         4M         4M
streams pool         0M         4M
DEFAULT buffer cache        192M         4M
KEEP buffer cache        0M         4M
RECYCLE buffer cache        0M         4M
DEFAULT 2K buffer cache        0M         4M
DEFAULT 4K buffer cache        0M         4M
DEFAULT 8K buffer cache        0M         4M
DEFAULT 16K buffer cache       0M         4M
DEFAULT 32K buffer cache       0M         4M
ASM Buffer Cache        0M         4M
13 rows selected.
SQL>

如果自动管理只给sga_target一个值即可,之后内部组件的分配大小oracle会自动调配

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

SQL>
反过来,如果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.
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
SQL>
如此设置才能被接受 此时也可以动态调整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
SQL>

总结:
 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来寻求合适的大小.
SGA和物理内存的比照值
 这只是初期设置参考 我们要根据业务运行一段时间后来确定最终值
    

查看SGA中各个组件的大小 show sga查到的值并不十分精确 要查v$sgainfo
如果自动管理 查 v$sga_dynamic_components
SQL> select * from v$sgainfo;
NAME       BYTES RES
-------------------------------------------------- ---------- ---
Fixed SGA Size           1218580 No
Redo Buffers           2973696 No
Buffer Cache Size        130023424 Yes
Shared Pool Size         62914560 Yes
Large Pool Size           4194304 Yes
Java Pool Size           4194304 Yes
Streams Pool Size         0 Yes
Granule Size           4194304 No
Maximum SGA Size        209715200 No
Startup overhead in Shared Pool        37748736 No
Free SGA Memory Available         4194304
11 rows selected.
Elapsed: 00:00:00.01
SQL>
SQL> select COMPONENT,CURRENT_SIZE from v$sga_dynamic_components where CURRENT_SIZE <> 0;
COMPONENT        CURRENT_SIZE
---------------------------------------------------------------- ------------
shared pool            62914560
large pool             4194304
java pool             4194304
DEFAULT buffer cache          117440512
KEEP buffer cache            8388608
RECYCLE buffer cache            4194304
6 rows selected.

其他SGA参数
lock_sga        boolean  FALSE
pre_page_sga        boolean  FALSE

pre_page_sga
 默认FALSE
  当启动时SGA中的内存是虚拟内存 使用每个内存页前要通过touch动作
 修改true
  就会在启动时将所有申请的虚拟内存都touch一遍 以后用就不需touch了
  但相应的会使启动速度变慢
lock_sga
 将全部SGA都锁在物理内存中 禁止做页入页出
上面两个参数要靠平台支持才可以启效果.
/etc/sysctl.conf 中的 安装时参数:
 kernel.shmmax 要大于等于SGA_MAX_SIZE
 如果小于 就会变成一个SGA有两个内存段 造成在两个内存段中来回切换 性能下降
[root@dba ~]# ipcs -m
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status     
0x740203cd 1605632    root      600        4          0                      
0x264feb88 2293761    oracle    640        318767104  18                     
0x740203cc 1572866    root      600        4          0                      
[root@dba ~]#
如果你的oracle异常停止 内存段不能释放 这时也无法启动
释放内存段的方法
[root@dba ~]# ipcrm -m SHMID
如果这条命令还不能释放 只能重新启动操作系统.
### ### 调整 Oracle 数据库 SGA 大小的方法 调整 Oracle 数据库的 **SGASystem Global Area)** 大小通常涉及修改数据库的初始化参数,并重新启动数据库实例以使更改生效。以下是一般步骤和注意事项: #### **1. 创建参数文件** 在调整 SGA 大小之前,建议先创建一个 **PFILE(文本参数文件)**,以便后续修改和使用。可以使用以下 SQL 命令从当前的 **SPFILE(服务器参数文件)** 创建 PFILE: ```sql CREATE PFILE FROM SPFILE; ``` 此操作有助于保持与当前数据库配置的一致性,同时便于后续手动编辑参数文件[^1]。 #### **2. 修改 SGA 参数** SGA大小主要由 `SGA_MAX_SIZE` 和 `SGA_TARGET` 参数控制。`SGA_MAX_SIZE` 指定了 SGA 的最大上限,而 `SGA_TARGET` 则用于启用 **自动共享内存管理(ASMM)**,允许 Oracle 自动调整 SGA 内部的子组件(如 `DB_CACHE_SIZE`、`SHARED_POOL_SIZE` 等)。 可以通过编辑 PFILE 文件,将 `SGA_MAX_SIZE` 设置为期望的值,例如: ```ini sga_max_size=80G ``` 如果启用了 ASMM,则还需设置 `SGA_TARGET`: ```ini sga_target=80G ``` #### **3. 创建新的 SPFILE** 在修改完 PFILE 后,需要将其转换为 SPFILE,以便数据库在启动时使用新的配置: ```sql CREATE SPFILE FROM PFILE; ``` 该命令将使用当前的 PFILE 创建一个新的 SPFILE,确保数据库下次启动时应用新的 SGA 设置[^1]。 #### **4. 重启数据库实例** 为了使新的 SGA 配置生效,必须重启数据库实例: ```sql SHUTDOWN IMMEDIATE; STARTUP; ``` 重启后,Oracle 会根据新的参数重新分配 SGA 内存空间。 #### **5. 调整 SGA 子组件** 在启用 ASMM 的情况下,Oracle 会自动管理 SGA 的子组件(如 `DB_CACHE_SIZE`、`SHARED_POOL_SIZE` 等),但也可以手动指定这些组件的大小。例如: ```sql ALTER SYSTEM SET DB_CACHE_SIZE = 30G; ALTER SYSTEM SET SHARED_POOL_SIZE = 3G; ``` 这些设置将影响数据库的性能,特别是数据缓存和 SQL 解析效率。合理配置这些子组件可以显著减少物理 I/O 操作,提高数据库响应速度[^2]。 #### **6. 监控与优化** 调整 SGA 后,建议持续监控数据库性能,确保内存资源被合理利用。可以通过以下视图查看 SGA 的使用情况: ```sql SELECT * FROM V$SGA; ``` 此外,还可以通过 `V$SGASTAT` 视图查看 SGA 各个子组件的详细内存分配情况: ```sql SELECT pool, name, bytes FROM V$SGASTAT; ``` 合理调整 SGA 大小对数据库性能至关重要。如果 SGA 过小,会导致频繁的磁盘 I/O 和 SQL 重新解析,影响系统响应速度;如果 SGA 过大,则可能占用过多物理内存,影响其他系统资源的可用性[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值