教你如何成为Oracle 10g OCP - 第十三章补充:RMAN备份使用PGA还是SGA

本文详细介绍了RMAN在进行数据库备份时如何管理内存缓冲区,包括何时使用PGA内存空间,何时使用SGA中的共享池或large池。还讨论了如何通过配置参数来优化RMAN的内存使用。

           RMAN基于备份算法规则来编译要备份的数据文件列表。基于通道数和同时备份的数据文件数,RMAN在ORACEL共享内存段中创建一些内存缓冲区, 一般是在PGA中, 不过有时候内存缓冲区会被推入SGA。通道服务进程随后就开始读取数据文件,并在RMAN缓冲区中填充这些数据块。一个缓冲区被填满时,输入缓冲区的数据就会推出到输出缓冲区。数据文件中的数据块都会发生这种memery-to-monery write 的过程,如果数据块符合备份的标准,并且memery-to-monery  write操作没有检查到数据corruption  则该数据块会被保存到输出数据缓冲区中,直到输出缓冲区被填满。一但输出缓冲区被填满,输出缓冲区的内容就会被推到备份位置(磁盘或者磁带).  

        那么到底RMAN在什么时候使用PGA,  什么时候又会被推入SGA呢 ? 

        在磁盘上的备份会使用PGA内存作为备份缓冲区,PGA内存空间从用于通道进程的内存空间中分配。 如果操作系统没有配置本地异步I/O,  可以利用DBWR_IO_SLAVES参数使用I/O从属来填充内存中的输出缓冲区。如果设置DBWR_IO_SLAVES参数为任意的非零值 (Oracle下默认一般是0),RMAN会自动分配4个I/O从属来协调缓冲区内存中数据块加载。为了实现这一功能,RMAN必须利用一个共享内存区域 。 因此,用于磁盘备份的内存缓冲区会被推入共享池 ,如果存在Large池,则被推入large池。

       即如果没有配置操作系统异步I/O,  参数 DBWR_IO_SLAVES = 0 (默认是0),那么RMAN内存缓冲区使用PGA  ;    如果配置 DBWR_IO_SLAVES = 非零值, 那么RMAN磁盘备份的内存缓冲区会被推入SGA中的共享池(shared pool), 如果有larget pool  ,    会被推入larget pool .  

       如果没有使用磁带I/O从属  (默认BACKUP_TAPE_IO_SLAVES=FALSE), 会在PGA中分配用于磁带输出缓冲区的内存 ;       如果设置 BACKUP_TAPE_IO_SLAVES=TURE,   利用磁带I/O从属 RMAN会为每个通道创建一个从属进程来帮助备份工作。为了协调这一功能,RMAN会将内存分配推入SGA。

        Large池是Oracle内存空间的SGA中的一个特定区域。 对于某些需要共享空间且涉及共享池中常见操作的内存可以利用large池。 占用large池的主要限于RMAN内存缓冲区 (如果使用了I/O从属)  和用于共享服务器。Large池又是用于java连接,如果PARALLEL_AUTOMATIC_TUNING (10g中不再使用) 被设置为TRUE,   large池还会包括并行查询从属(parallel query slave)

         实际上,我们不一定需要large池。如果没有large池,所有可能占用large池的会简单地使用共享池(shared pool)中的空间。 不过最好将RMAN缓冲区分到PGA中他们自己独立的空间中。这样,SQL和PL/SQL分析以及其他普通操作的共享池操作不会受到RMAN备份的影响。反之亦然,此外还可以更方便,更直接地调整RMAN的Oracle内存空间。

       如果配置了任一种I/O从属选项并且没有配置large池,则会从SGA的共享池区(shared pool)中分配内存。如果没有配置large池却又要使用I/O从属,我们建议最好创建一个large池,这个large池的大小基于备份分配的通道总数(加上1MB用于开销)。

      Larget pool 通常用于RMAN备份恢复, MTS共享服务器,并行计算中, 在Oracle9i或之前设置large pool的大小参数为 larget_pool_size ,   10g 及以后一般使用ASMM (自动共享内存管理), 只需指定SGA_TARGET参数(SAG的总大小),数据库将会根据负载和历史信息来自动分配SAG的每个组件。  启用ASSM需将STATISTICS_LEVEL参数设为TYPICAL或ALL,  并且SGA_TARGET参数为非0. 

ASMM自动分配以下SGA组件:
--DB_CACHE_SIZE
--SHARED_POOL_SIZE
--LARGE_POOL_SIZE
--JAVE_POOL_SIZE
以下的组件还需要手动来管理
--LOG_BUFFER
--DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE,DB_nK_CACHE_SIZE
--STREAMS_POOL_SIZE
--Fixed-SGA area and internal allocations

如果使用spfile,  我们在 create pfile='xxxx'  from spfile ; 之后看到的larege_pool_size 就是当时large_pool 被分配的内存空间。  类似下面:

ecsdb2.__db_cache_size=5486149632
ecsdb1.__db_cache_size=3456106496
ecsdb1.__java_pool_size=33554432
ecsdb2.__java_pool_size=16777216
ecsdb1.__large_pool_size=16777216
ecsdb2.__large_pool_size=16777216

ecsdb2.__shared_pool_size=3053453312
ecsdb1.__shared_pool_size=5033164800
ecsdb1.__streams_pool_size=33554432
ecsdb2.__streams_pool_size=0

不过在10g 中查看参数一般都是 0 : 

SQL> show parameter large_pool

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
large_pool_size                      big integer 0 

Oracle 9i 在使用RMAN备份的时候, 分配多通道(channel) ,可以考虑参考如下公式:

LARGE_POOL_SIZE = number_of_allocated_channels * (16MB+( 4 * size_of_tape_buffer))

 

如果在磁带上做备份,就需要使用一个Media Management Server(介质管理服务器)产品。如果从与目标数据库相同的系统运行Media Manager(介质管理器),磁带子系统会需要额外的系统资源。调整备份时一定要考虑到这个因素。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-695461/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-695461/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值