ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 教你如何成为Oracle 10g OCP - 第十三章补充:RMAN备份使用PGA还是SGA

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

原创 Linux操作系统 作者:tolywang 时间:2011-05-16 10:31:44 0 删除 编辑

           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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13778706