七. 备份数据块

即使是高级备份技术,备份的单元依然是数据文件,最终进行备份的OS 使用程序将查看并备份整个文件,因此需要特别注意保证Oracle 数据块

的完整性,然后,RMAN 与之不同,因为RMAN 是集成在RDBMS 中的,它是在数据块层面访问数据,这和数据库本身所使用的方式相同。

块级别访问是RMAN 区别于其他备份工具的地方,正是由于rman 采用了这一层面的访问,才使得它具有诸多优势,因此我们可以更有效的利用数

据块进行备份和恢复。


7.1 数据块备份概述

数据块备份的工作原理:RMAN 基于备份算法规则来编译要备份的文件列表。基于通道数和同时备份的文件数,RMAN 在Oracle 共享内存段中创建

一些内存缓冲区。 一般在PGA中,不过有时内存缓冲区会被推入SGA。 通道服务器进程随后开始读取数据文件,并在RMAN缓冲区中填充这些数据

块。一个缓冲区被填充时,输入缓冲区中的数据快会被推入输出缓冲区。 数据文件中的每个数据块都会发生这种内存对内存的写操作(memor-

to-memory write)。 如果数据块复合备份的标准并且内存对内存的写操作没有检测到讹误(corruption),则这些数据块会保留在输出缓冲区

中直至输出缓冲区被填满。 一旦输出缓冲区被填满,输出缓冲区就会被推至备份位置(磁带或者磁盘)。

一旦所有文件已通过内存缓冲区过滤,就完成了备份片,同时RMAN 会在目标数据库的控制文件中写入备份片的完成时间和备份片的名称。


7.2 块级备份的优点

每个数据块从磁盘移入内存时都会发生内存对内存的写操作,在这个操作期间会检查数据块的讹误。讹误检查是RMAN的一个重要特性。 要注意的

是: 执行代理复制操作时是不会使用数据库检查的。

访问数据块时可以选择 空值压缩(null compression),我们可以删除从来没有使用过的数据块(头为0),并在执行内存对内存的写操作时丢

弃这些数据块,因此,我们只需要备份使用过的数据块,从而执行更有效的备份操作。

块级备份从生成redo 的角度来说也提供了性能增益。如果是老式的热备份方法,运行热备份模式的表空间生成的redo log数量有失会呈指数增长

,这会造成过多的redo 切换,检查点故障和 生成大量的redo log。巨量的archive log会给日志归档位置上的空间管理带来一定困难。

另一方面,由于在备份期间不要求保证数据块的一致性,所以RMAN不要求用热备份模式。RMAN 对数据块的访问允许RMAN 与写‘脏’缓冲区的

DBWR进程协调,并且在将这个数据块读入内存以前,它可以等待直至数据块达到一致,因此数据块不会被转存为redo,并且备份中的数据块总是

一致的。

当然,RMAN 也不要求用archive log 模式,但是如果是非归档模式,rman 不允许我们在数据库打开时备份一个数据文件,否则会报如下错误:

ora-19602:cannot backup or copy active file in NOARCHIVELOG mode。

RMAN 可以使用块级备份提供进一步的恢复新选项: 块介质恢复(block media recovery). 如果出现: ora-1578:block corruption

detected, 就不需要恢复整个文件以及执行恢复操作,RMAN 可以简单的恢复坏数据块并执行恢复操作,也就是说数据文件中的其他数据在恢复期

间仍然可用。


八. 内存中的RMAN

RMAN 会在内存中构建一些缓冲区,然后通过这些缓冲区将数据块写入到备份中。 内存的利用与PGA(有时是SGA)的总体大小有关。 内存缓冲区分

为输入缓冲区和输出缓冲区。 输入缓冲区(input buffer)填充从备份文件中读取的数据块;输出缓冲区(output buffer)则在执行内存对内

存的写操作时填充需要备份的数据块,一旦输出缓冲区被填满,输出缓冲区的内容就会被写到备份位置。


8.1 输入内存缓冲区

备份数据库时,输入内存缓冲区的大小和数据取决于实际执行的备份命令,事实上它主要取决于在一个备份中多路服用(multiplexing)的文件

数。 多路复用指的是在同一个备份片中备份某数据块的文件数。为了保持合理范围的内存分配,根据一起备份的文件数,分配内存缓冲大小需要

应用下面的规则。

1) 如果备份集内的文件数小于或者等于4个,RMAN 会为每个文件分配4个大小为1MB的缓冲区。缓冲区总和小于或者等于16MB。

2) 如果备份集内文件数多余4个但少于等于8个,RMAN 会为每个文件分配4个大小为512KB的缓冲区。缓冲区总和确保少于或者等于16MB。

3) 如果多路复用的文件数多余8个,RMAN 会为每个文件分配4个大小为128KB的缓冲区。这就确保每个要备份的文件占用512KB的缓冲区内存。

一定要记住在每个通道基础上分配内存大小。因此,如果分配两个通道来备份具有32个数据文件的数据库,RMAN会根据负载均衡来分配两个通道

,而不是为每个通道分配16个文件。 如果某些文件比另外的文件大的多,我们可能在一个备份集内备份8个文件,在另一个备份集内备份24个文

件。 如果是这样,则用于第一个通道(8个文件)的缓冲区会分配16MB的输入缓冲区(8个文件,每个文件有4个缓冲区,每个缓冲区512Kb),用

于第二个通道(24个数据文件)的缓冲区会分配12MB的输入缓冲区(24个文件,每个文件的缓冲区为512KB)。

可以使用如下的查询来监控备份运行时基于每个每个文件的缓冲区大小:

/* Formatted on 2010/6/9 9:37:52 (QP5 v5.115.810.9015) */

 SELECT   set_count,

          device_type,

          TYPE,

          filename,

          buffer_size,

          buffer_count,

          open_time,

          close_time

   FROM   v$backup_async_io

ORDER BY   set_count,

          TYPE,

          open_time,

          close_time;


8.1.1 备份到磁盘时的输出内存缓冲区

除了输入缓冲区之外,RMAN还会根据输出设备分配输出缓冲区。如果备份到磁盘,则RMAN 将分配输出缓冲区以在数据溢出到备份片之前接收来自

输入缓冲区的数据块。此时,每个通道有4个输出缓冲区,每个输出缓冲区大小为1MB,因此每个通道的内存区域通常为4MB。


8.1.2 备份到磁带时的输出内存缓冲区

备份到磁带时的内存分配是不同的,这是由于磁带设备的I/0速率较慢。在磁带上备份或从磁带上恢复时,RMAN会为每个通道进程分配4个输出缓

冲区,每个缓冲区的大小为256KB,因此每个通道的内存区域通常为1MB。


8.2 用于还原的内存缓冲区

还原操作期间的内存分配与备份操作期间的内存分配稍有不同,这是因为他们的作用是相反的:备份操作是读取数据文件并写入备份位置,而还

原操作则是读取备份位置并写入数据文件。 还原磁盘备份时,输入缓冲区的大小为1MB,同时RMAN 会为每个通道分配4个缓冲区。 还原磁带备份

时,RMAN 会分配4个输入缓冲区,每个缓冲区的大小等于blksize参数的值(默认值为256kb)。用于还原的输出缓冲区通常为128kb,并且每个通

道有4个输出缓冲区。


8.3 RMAN内存利用: PGA 和 SGA

在磁盘上的备份会使用PGA内存空间作为备份缓冲区,PGA 内存空间从用于通道进程的内存空间中分配。如果操作系统没有配置本地异步I/O,可

以利用DBWR_IO_SLAVES参数使用I/O从属来填充内存中的输入缓冲区。如果设置DBWR_IO_SLAVES 参数为任意的非零值,RMAN 会自动分配4个I/O

从属协调输入缓冲区内存中的数据块加载。为了实现这一功能,RMAN 必须利用一个共享内存区域。因此,用于磁盘备份的内存区会被推入共享池

,如果存在large池,则被推入large池。

如果没有使用磁带I/O从属,会在PGA中分配用于磁带输出缓冲区的内存。设置init.ora 参数BACKUP_TAPE_IO_SLAVES=TRUE,可以使用磁带I/O从

属,必要时还可以在spfile里动态修改。 该参数设为true时,rman 会为每个通道创建一个从属进程来帮助备份工作。为了协调这一功能,RMAN

会将内存分配推进SGA。

如果配置了任一种I/O从属选项并且没有配置large 池,则会在SGA的共享池曲终分配内存。如果没有配置large池又要使用I/O从属,建议最好创

建一个large池,这个large池的大小基于为备份分配的通道总数(加上1MB用于开销)。


九. 恢复目录

恢复目录存储的是与RMAN 备份有关的元数据。在某种意义上,恢复目录可以看做是保存RMAN 备份和恢复所需的相关信息的副本。我们可以在

Oracle 数据库中在用户模式下创建恢复目录,这个恢复目录仅仅是一些数据包,表,索引和视图。 RMAN 中的再同步命令会使得目标数据库控制

文件中的内容刷新这些表中的数据。当然,区别在于恢复目录可以包含企业中所有数据库的信息,而控制文件只包含关于它自己的数据库的信息

在连接恢复目录的连接字符串中,要输入该RMAN目录用户的用户名和口令。与连接目标数据库不同,到恢复目录的连接不是一个sysdba连接,因

此不需要sysdba 权限。

一旦连接了恢复目录,就可以手工在同步恢复目录,或者任何备份操作都可以隐式的再同步恢复目录。 再同步是指用目标数据库控制文件中的内

容刷新恢复目录中表的信息。

一个恢复目录可以存储多个目标数据库的信息,这样可以集中管理许多不同数据库的备份,通过SQL可以查询恢复目录的视图,由此确定在恢复目

录中注册的每个目标数据库的备份数,备份大小和备份范围。

恢复目录中存在数据包DBMS_RCVMAN会给包含该恢复目录的数据库带来混乱,这样的数据库通常称为目录数据库(catalog database)。目录数

据库也可能是目标数据库,它也含有SYS模式中的DBMS_RCVMAN 数据包,因此如果选择目录数据库中的DBA_OBJECTS,就会存在模式不同但是名称

相同的两个数据包。 这样并不会引起错误或我难题。因为其中一个数据包在数据库创建时由cataproc.sql 构建(在SYS模式下),另外一个数据

包则是在创建恢复目录时构建,在常规用户模式下。

恢复目录中的第二个数据包是DBMS_RCVCAT数据包,这个数据包只在RMAN操作期间执行特殊的恢复目录操作。实质上,可以将这个数据包看做恢复

目录的DBMS_BACKUP_RESTORE数据包实现。区别仅在于DBMS_BACKUP_RESTORE数据包在目标数据库控制文件中写入备份完成信息,而DBMS_RCVCAT数

据包则将这些信息写入恢复目录。

另外,包含恢复目录中信息的基表(base table)并不重要,因为我们不想手工修改这些基表。为了保护恢复目录,Oracle创建了一系列前缀为

RC_的视图,使用这些视图可以从恢复目录中析取信息。手工执行任何针对目录对象的DML命令都是非常危险的。还有一点,这些视图是数据库控

制文件中相应v$视图的不同实现。


十. 辅助数据库

辅助数据库(auxiliary database)是指在表空间时间点恢复(Tablespace Point In Time Recovery: TSPITR),,复制操作(克隆数据库)或使用

RMAN 备份创建备用数据库时,为了还原目标数据库的文件而临时生成的实例。执行上述任一种任务时,我们都要在RMAN中同时连接目标数据库和

辅助数据库,这样就可以利用目标数据库控制文件中的备份信息在辅助数据库位置调整这些备份还原。

RMAN>connect target /

RMAN>connect auxiliary sys/pwd@SID

执行这些命令后,RMAN会同时生成到每个数据库的连接,并要求访问目标数据库与辅助数据库中的SYS.DBMS_BACKUP_RESTORE 和

SYS.DBMS_RCVMAN 数据包。 这样一来,RMAN要求用户对辅助数据库具有与目标数据库相同的sysdba权限。由于RMAN必须生成到这两个数据库的

sysdba 连接,而且不可能本地连接两个不同的数据库,所以必须至少要配置一个数据库,创建一个口令文件,并且生成到这个数据库的Oracle

net 连接。


十一. 版本兼容性

鉴于必须使用多种不同的组件,所以在使用RMAN时必须注意数据库版本的限制。兼容性问题分为5个部分,每一个部分都有一个版本号:

1) RMAN 可执行文件版本(客户端使用程序)

2) 目标数据库

3) 恢复目录模式

4) 恢复目录数据库

5) 辅助数据库(用户复制,TSPITR和备用数据库的创建)

当然,解决兼容性问题的最佳方法是保证这些组件都使用最新的版本,如果使用相同版本的组件,一切都会井然有序。


11.1 目标数据库与RMAN 可执行文件

一个通用规则:尽量保证目标数据库与RMAN可执行文件使用的是相同的版本。如果在目标数据库环境下运行RMAN,做到这一点就很容易。如果从

一个集中的客户端接口运行所有RMAN工作,这将非常棘手,它意味着客户端需要安装一个ORACLE_HOME客户端,版本上要对应需要连接和备份的每

个数据库版本,该解决方案相当复杂。 使用10G 的OEM 可以解决这个问题,该软件支持集中的客户端接口,因为我们可以从单个控制台使用远程

RMAN可执行文件,或者在多个DBA完成备份任务时从控制台使用远程RMAN可执行文件。


11.2 恢复目录数据库与版本目录模式

针对恢复目录数据库与恢复目录模式的兼容性问题,一种简单的方法,就是在高版本的数据库(如11g)中创建该版本的恢复目录,那么这个目录

可以注册低版本的数据库。但是低版本不能注册高版本的。


11.3 辅助数据库

从兼容性观点看,辅助数据库必须与要复制的目标数据库采用相同的版本。实际上,最好在复制的数据库中插入与目标数据库相同版本的

ORACLE_HOME 主目录。


十二. RMAN 进程

先举一个简单的备份例子:

C:>Rman target /

Rman>backup database;

详细的看一下RMAN 备份的全过程:

RMAN 生成到目标数据库的bequeath连接,这就是说RMAN会检查ORACLE_SID变量中的实例名,并在该实例上产生一个服务器进程,然后作为sysdba

用户登录。这样我们被连接为内部数据库用户sys,rman会立即产生一个用于执行备份操作的通道进程。 如果使用默认设置,就只分配一个通道

。 在没有使用I/O从属的情况下,通道进程会在PGA中分配内存。

随后RMAN 通过编译一个sys.DBMS_RCVMAN调用,从目标数据库控制文件中请求数据库结构信息,显示确定目标数据库的版本。RMAN从控制文件中

收集版本信息和控制文件本身的信息,控制文件本身的信息包括控制文件的类型,控制文件中的当前序列号以及控制文件的创建时间。

我们在例子中指定了数据库的完全备份,所以RMAN会请求数据库中每个数据文件的信息,并且判断是否存在离线的数据文件。这些数据文件信息

包括每个数据文件所在磁盘和工作方式的信息,由于使用了默认设置,所以只存在一个通道和一个备份集。 这样以来,rman会忽略所有的相似性

信息,把注意力放在编译包含在数据集内的文件列表上。

编译了文件列表之后,RMAN 就准备开始执行备份进程。 为了保证一致性,RMAN必须构建快照控制文件。如果存在快照控制文件,RMAN会将这个

文件重写为新的快照控制文件。 接下来,RMAN创建对DBMS_BACKUP_RESTORE数据包的调用,该调用可以创建备份片,备份片被构建在默认的文件

位置中,UNIX系统中的这个文件位置是ORACLE_HOME/DBS,WINDOWS 下默认位置是: ORACLE_HOME/database。 RMAN 拥有文件列表,所以它可以为

磁盘读取操作分配内存缓冲区。假如实例有20个数据文件,这样RMAN 会分配一些大小为128KB的输入缓冲区,由于每个文件有4个输入缓冲区,所

以这些输入缓冲区总共就需要10MB内存。RMAN 只分配4个输出缓冲区,每个输出缓冲区为1MB。 所以备份操作总共需要的内存是14MB。

分配了内存之后,RMAN 初始化备份片。备份片会得到一个唯一的默认名。随后RMAN 开始备份。从9i以后,RMAN 以50M 为增量分配磁盘空间,在

磁盘上分配50MB的空间并填充输出缓冲区,当输出缓冲区满时,则获取另一个50MB空间,知道将最后一个数据块转存到被分片上。当备份完成时

,释放最后一个50MB数据块上的剩余空间。 要注意的是:RMAN 不再检查是否存在用于成功备份操作的足够空间,这是因为空值压缩和新的10g

空白压缩可以极大地减少备份中的数据文件大小。相反,RMAN 将运行它的备份知道空间用完,然后备份失败。

一旦初始化了备份片,通道进程就可以开始数据库备份进程。RMAN会判断是否使用了spfile,如果使用了spfile,RMAN 会自动将该文件备份为备

份集的一部分。RMAN 还要在备份集中备份当前控制文件。只要备份了SYSTEM 表空间,就会自动备份当前的控制文件。

完成spfile和控制文件的备份后,就开始读取数据文件并将数据块推入内存,为了实现这一功能,通道进程在磁盘上执行预读(read-ahead)操

作,并且将多个数据块同事推入内存。随后发生的是从输入缓冲区到输出缓冲区的内存对内存的写操作,在这个写操作期间,RMAN会判断数据块

是否被初始化,或者数据块头信息是否仍然为零。如果数据块未被使用过,就不会发生到输出缓冲区的写操作,同时丢弃这个数据块。如果数据

块被使用过,RMAN就会在这个数据块上执行检验和checksum 操作。 如果数据块的头和脚注不匹配,这个数据就会被写入输出缓冲区。

一旦输出缓冲区被填满,就会将输出缓冲区的内容转存储到备份文件位置。 由于RMAN缓冲区填充来之所有数据文件的数据块,所以在转存储文件

中的数据块是杂乱无序的。 转储文件只是一个存储段,只有RMAN能够在还原时将这些数据块还原到正确的位置。在备份片中写入数据块时,可以

从RMAN影子进程中得到备份的状态信息。RMAN影子进程在目标数据库上检查远程过程调用(RPC),并将信息传递给V$VERSION_LONGOPS视图,以

供用户查看。基于在备份操作开始时收集的信息,RMAN会估计每个通道进程完成的百分比,可以通过一下SQL 查看:

/* Formatted on 2010/6/9 22:50:05 (QP5 v5.115.810.9015) */

SELECT   sid,

        serial#,

        context,

        sofar,

        totalwork,

        ROUND (sofar / totalwork * 100, 2) "%_complete"

 FROM   v$session_longops

WHERE       opname LIKE 'RMAN%'

        AND OPNAME NOT LIKE '%aggregate%'

        AND sofar <> totalwork;

在备份进程期间,可以重复执行这个脚本,来查看剩余工作量信息。

一旦一个数据文件的所有数据块都被读入输入缓冲区并且确定状态,RMAN 就会通过将这个数据文件头写入被分片来结束该文件的备份操作。在所

有数据文件头都被写入备份片之后,RMAN 会生成最后一个对SYS.DBMS_BACKUP_RESTORE数据包的调用,该调用在控制文件中写入备份信息,这些

备份信息包括备份片名,启动备份操作时的检查点的SCN和完成备份操作的时间。

以上就是备份操作的所有过程。如果想进一步了解备份内存的工作流程,可以启动调试选项,从而得到一个完成的进程列表。 不过这个操作可能

会影响备份的性能。 最好只在测试环境下使用。

Rman target / debug trace=/u01/backup/rmanback.out


十三. 闪回恢复区

闪回恢复区(Flash recovery area: FRA)不是所有RMAN 需要的组件,但是它应该成为RMAN所需的组件。作为10g 版本的新特性,FRA是磁盘上

用于存储所有Oracle 恢复文件的特定位置。 恢复文件是指进行介质恢复时所需的所有文件: 完全的数据文件备份,增量备份,数据文件副本,

备份控制文件以及归档的日志。 FRA 也存储联机重做日志,块更改跟踪文件以及当前控制文件的镜像副本。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html