ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 教你如何成为Oracle 10g OCP - 第十三章补充:RMAN的组成及工作原理

教你如何成为Oracle 10g OCP - 第十三章补充:RMAN的组成及工作原理

原创 Linux操作系统 作者:tolywang 时间:2011-07-11 14:15:10 0 删除 编辑


 
-----   RMAN的组成及工作原理 
 
RMAN由可执行程序和名为recover.bsq的脚本文件组成,RMAN可执行程序就是命令行接口
(命令解释程序),在备份和恢复过程中,可执行程序完成的实质性工作很少,进行的大部
分都是协调工作。
 
 
备份恢复工作的实质性工作是由目标数据库上的程序包完成的,对目标数据库上包的调用
就要借助于recover.bsq 脚本文件了,该文件在$ORACLE_HOME/rdbms/admin目录下,打开
文件可以看到里面都是各种PL/SQL脚本块。事实上,在RMAN交互界面中输入的各种命令,
都会被RMAN可执行程序转化为对recover.bsq文件中的各种相关的PL/SQL块的调用,并将
相关的PL/SQL块传递到目标数据库上去执行,从而完成对数据库的备份与恢复,可以说,
recover.bsq (实质上是一个库文件)才是RMAN备份恢复的核心 。要注意的是,可执行文件
和recover.bsq文件需要版本一致,否则不能正常工作。

在recover.bsq文件包含的PL/SQL块中,主要调用了目标数据库中以下两个程序包。
 
dbms_rcvman : 用来读取目标库的控制文件信息,将这些信息传给RMAN, 从而RMAN可以
获得要备份的文件列表以及其他所需的信息。
dbms_backup_restore :  完成具体的备份恢复工作,并在控制文件中写入备份的元
数据,比如创建备份的时间,路径,大小等。
 
而且由于RMAN可以在数据库关闭的情况下进行备份,因此这两个包都是硬编码在Oracle
软件中的,在数据库没有启动的时候也能调用执行。
 
 

--- 内核中的RMAN数据包

创建数据库时,运行cataproc.sql可以默认安装dbms_rcvman及dbms_backup_restore两个
包,dbca创建期间无法跳过这一步,所以8i以后的版本中都存在rman包。 而且他们被硬编
码到Oracle软件的库文件中,因此即使没有打开库,也可以调用这些数据包。我们知道,
大多数数据包只有数据库打开时才能被使用,不过RMAN可以在数据库实例处于nomount和
mounted模式时编写对dbms_backup_restore数据包的调用(nomunt状态只能用于恢复)。

RMAN是做物理备份的,RMAN工作的时候调用dbms_backup_restore 包,这个包集成到ORACLE
内核中,即使在nomount状态下也可以做恢复(但注意,nomount状态不能做备份)。

用RMAN做备份的前提是目标数据库必须是OPEN或MOUNT状态,因为要把备份的元数据写入
控制文件。
 

---------------------------------------------------------
在目标库所在server上做rman备份。
1. 没有恢复目录, 且目标库open, : 使用目标库中的recover.bsq及目标库中的程序包。  
2. 没有恢复目录, 且目标库mounted, 使用目标库中的recover.bsq及目标库中的Oracle硬编码程序包。 
3. 有恢复目录, 且目标库open :    使用目标库中的recover.bsq及目标库中的程序包。
4. 有恢复目录, 且目标库mounted : 使用目标库中的recover.bsq及目标库中的Oracle硬编码程序包。
 
在恢复目录库所在server上做rman备份。
1.  目标库open :    使用恢复目录库中的recover.bsq及目标库中的程序包。
2.  目标库mounted : 使用恢复目录库中的recover.bsq及目标库中Oracle硬编码的程序包。
---------------------------------------------------------
 

--- RMAN与数据库权限

RMAN需要访问目标库sys用户下的各种数据包,还需要启动和关闭目标库的权限,所以
RMAN通常以sysdba身份连接到目标库。
 
 

--- RMAN备份的网络拓扑结构
 
RMAN通过Oracle Net连接到目标库,一般倾向于在目标库的ORACLE_HOME中运行RMAN, 这
是避免在混合环境中出现兼容性问题的最简单的方法。 我们需要在这种混合环境中负责
跨多个oracle数据库和版本的备份。注意:RMAN不能使用共享服务器。

 

--- 数据库控制文件

控制文件用作RMAN备份目录,RMAN完成DB任何备份后,会在控制文件中添加该备份的
元数据(备份开始及结束时间检查点,备份文件大小,文件名等),这些也可以存储在
恢复目录中。 控制文件记录分为循环重用部分及非重用部分,RMAN备份记录及归档
日志历史信息属于循环重用记录, RMAN备份记录如果被重用覆盖,RMAN就不能使用
备份来执行恢复操作。 控制文件中可删除部分默认保存7天。需要注意的是,即使有
了恢复目录,备份信息还是会写入控制文件 。
 
如果要实现一个恢复目录,就不用担心重用问题,因为只要在controlfile_record_keep_time
参数指定的时间内至少实现一次恢复目录同步(控制文件中的备份信息同步到恢复目录),
那么这些记录将随着时间的推移被删除。
 

--- 快照控制文件


控制文件非常繁忙,但是RMAN开始备份每一个数据文件的时候是需要得到一个一致的控制文件
的(备份期间锁定控制文件时不可能了),其实RMAN只需要知道备份开始时最新的检查点信息和
文件就够了,开始备份后,RMAN需要这些信息在备份期间保持一致。
 
RMAN使用快照控制文件(snapshot controlfile)来解决当前的问题,快照控制文件是控制文件
的副本。RMAN只是在备份和同步操作期间使用快照控制文件。这些操作开始时,RMAN会根据实
际控制文件来刷新快照控制文件, 这样会短暂锁定控制文件,随后,RMAN 会切换到快照并在备
份期间持续使用这个快照, 这种方式具有读取一致性,且不妨碍数据库活动。

默认情况下,快照控制文件位于unix平台的ORACLE_HOME/dbs目录下,或windows的
ORACLE_HOME\database目录下,使用下面命令可以更改快照控制文件名:
configure snapshot controlfile name to 'location\file_name'
 

如果rman需要从读一致性的控制文件中再同步的话,RMAN会创建临时snapshot 控制文件。
RMAN只在恢复目录再同步或者备份当前控制文件的时候需要快照控制文件。
 

如果不通过rman,oracle是无法实现联机全备的,这也是oracle比较尴尬的事情,
oracle通过rman实现了联机全备,最本质的原因就是引入了snapshot controlfile,
因为scn时时刻刻是要被写入控制文件的,但是联机全备时又需要短暂的锁住控制
文件(全备时要保证控制文件,数据文件scn是一致的啊),这样就产生了矛盾,于
是在rman中就引入了snapshot controlfile,事实上在rman备份时用snapshot
controlfile临时代替了controlfile,备份之后他们之间又重新同步了

 

下面是用例子說明RMAN备份的详细过程:

C:\>set nls_date_format=yyyymmdd hh24:mi:ss
C:\>rman  target sys/oracle@test01  catalog  rman_cat/oracle@rman01
RMAN> backup device type disk format 'D:\rmanbak\%U' database plus archivelog;

启动 backup 于 2011-07-06 08:47:06
当前日志已存档
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =19 记录 ID=18 时间戳=752151901
输入存档日志线程 =1 序列 =20 记录 ID=19 时间戳=752153326
输入存档日志线程 =1 序列 =21 记录 ID=20 时间戳=752155232
输入存档日志线程 =1 序列 =22 记录 ID=21 时间戳=752170780
通道 ORA_DISK_1: 正在启动段 1 于 2011-07-06 08:47:12
通道 ORA_DISK_1: 已完成段 1 于 2011-07-06 08:47:37
段句柄=D:\RMANBAK\1QMGOB0D_1_1 标记=TAG20110706T084708 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:28
完成 backup 于 2011-07-06 08:47:37
启动 backup 于 2011-07-06 08:47:37
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\SYSTEM01.DBF
输入数据文件 fno=00003 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\SYSAUX01.DBF
输入数据文件 fno=00005 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\USERS02.DBF
输入数据文件 fno=00002 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\UNDOTBS01.DBF
输入数据文件 fno=00004 name=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST01\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 2011-07-06 08:47:37 
通道 ORA_DISK_1: 已完成段 1 于 2011-07-06 08:48:32 
段句柄=D:\RMANBAK\1RMGOB19_1_1 标记=TAG20110706T084737 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:55

通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 2011-07-06 08:48:34
通道 ORA_DISK_1: 已完成段 1 于 2011-07-06 08:48:35
段句柄=D:\RMANBAK\1SMGOB31_1_1 标记=TAG20110706T084737 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
完成 backup 于 2011-07-06 08:48:35

启动 backup 于 2011-07-06 08:48:35
当前日志已存档
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =43 记录 ID=42 时间戳=755772516
通道 ORA_DISK_1: 正在启动段 1 于 2011-07-06 08:48:39
通道 ORA_DISK_1: 已完成段 1 于 2011-07-06 08:48:40
段句柄=D:\RMANBAK\1TMGOB36_1_1 标记=TAG20110706T084838 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
完成 backup 于 2011-07-06 08:48:40
RMAN>

 

以上面的简单备份为基准,描述RMAN运行过程。假设在目标库上做RMAN备份。且使用了
恢复目录。

RMAN的运行过程如下:

8:47:06      从current controlfile中取归档日志文件list, 开始备份归档日志 
8:47:37      完成归档日志备份, 之后更新备份元数据到current controlfile   
8:47:37      从current controlfile中取数据文件list, 开始备份数据文件 
8:48:32      完成数据文件备份, 之后更新备份元数据到current controlfile    
8:48:32      开始备份控制文件及spfile
8:48:33      生成快照控制文件, 同时RMAN根据current controlfile刷新快照控制文件
8:48:34      控制文件备份集创建
8:48:35      完成控制文件备份  (其实备份的是快照控制文件 ??? )
8:48:35      从current controlfile中取新归档日志list, 开始备份备份期间生成的新归档日志
8:48:40      完成新生成归档日志的备份, 之后更新备份元数据到current controlfile  
8:48:41      (快照文件的最新更新时间),刷新current controlfile 备份元数据到快照控制文件

备份完毕后,我们没有看到类似 “正在启动全部恢复目录的 resync ,完成全部 resync”
的提示, 是因为我们在备份过程中,没有更新控制文件的物理内容(比如加入数据文件),
如果有加入datafile或加入一组redo logfile, 那么最后你就会看到“正在启动全部恢复
目录的 resync ,完成全部 resync” 的字样。


注意: 因为我们最初在连接目标库,做register database; 的时候,我们会看到如下:
“注册在恢复目录中的数据库  正在启动全部恢复目录的 resync  完成全部 resync ”,
也就是说还没有开始就已经将控制文件信息同步到了catalog, 所以后面如果对控制文件没有
物理上的改变,备份完毕后是不会再次进行 “全部恢复目录的 resync” ,是否会进行“部分
恢复目录的 resync” 还不清楚。


这里有几个问题点;

1. current controlfile中的备份元信息如何同步到快照控制文件 ?
2. 如果备份log中没有“全部恢复目录的 resync”,备份元信息(特别是最后备份备份过程中
的归档日志)如何更新到catalog 中 ?
3. 同步catalog使用的是快照控制文件 ?

个人理解:
1. 备份完毕后,同步catalog之前,current controlfile中的备份元信息会刷新到快照控制文件。
2. 期间如果没有更新控制文件,虽然不会出现“全部恢复目录的 resync”,但备份元信息(特别
是最后备份备份过程中的归档日志)会从刚刷新的快照控制文件更新到catalog 中。
3. 同步catalog使用的是快照控制文件。Oracle会比较这个文件和catalog,完成比较后,oracle
根据这个snapshot controlfile来同步catalog,并使它们保持一致。


提示: 什么时候需要手工同步控制文件及catalog? 只有我们有时候用catalog,而有某些
时候又不用catalog来做backup or restore的时候才需要发出 resync catalog的命令来手工做同步。
 

 

--- RMAN备份数据块
RMAN备份需要注意保证Oracle数据块的完整性,它是在数据块层面访问数据,这和数据库
本身所使用的方式相同。 Oracle block级别访问是RMAN区别于其他备份工具的地方。

 


--- RMAN备份对split block的处理 

     RMAN备份是以Oracle数据块为单位进行读取和写入,如果在备份某个Oracle数据块时,
发现它是一个脏数据块,那么他可以等DBWn将内存里的内容刷新到数据文件以后(RMAN会与DBWR
协调),才备份该数据块,因此RMAN是不需要发出begin backup命令的。 同时,RMAN备份处
理split block与热备份不一样,它不存在redo log激增的问题,是因为它在执行备份每个数
据块的时候会判断这个数据块是否是split的(RMAN比较块头块尾保证块的完整性),如果是,
它会重新读这个数据块(Oracle block)直到得到一个consistent version。数据块备份被
转储为redo, 并且备份中的Oracle数据库总是一致的。

在Oracle10.2.0.1及以前,RMAN只会对使用过的数据块进行备份(不管当前是否有数据),
因为RMAN可以在数据库未开启的情况下备份,因此RMAN备份时,只能从物理层面来判断某
数据块是否被使用过,如果某数据块头部被格式化过,RMAN就认为它被使用过,就会备份
该数据块。 但是Oracle10.2.0.2 或以后,Oracle只备份当前有数据的数据块 。
 
备份期间,RMAN不要求保证Oracle数据块的一致性,所以RMAN不要求用热备份模式。
RMAN是在数据块层面访问数据,oracle block级别访问时RMAN区别于其他备份工具的
地方。

 


--- RMAN使用的sys下的数据包
RMAN服务器进程在协调通道工作时要访问两个SYS数据包:dbms_rcvman和dbms_backup_restore
数据包,这两个包包含了目标库中RMAN的所有功能。

dbms_rcvman包用来访问控制文件中的"表"并将此信息传递给RMAN, DBMS_RCVMAN 包负责在
执行任何操作前设置time 运算符和校验数据文件头中的检查点信息,检查文件位置和大小,
以及有关节点相似性(在RAC 环境中)和磁盘相似性的其他信息。 这种信息会影响RMAN的
性能,并且RMAN 在构建实际备份/还原命令之前自动执行负载均衡(load-balancing)算法
和性能增强(performance-enhancing)算法。

dbms_rcvman包访问控制文件并校验所有必须的信息。这些必需的信息会被传递回RMAN服务
器进程,RMAN服务器进程随后会基于recover.bsq文件中的代码创建一些PL/SQL块。这些
PL/SQL块含有对dbms_backup_recover数据包的调用,实际上,RMAN中是由这个包来创建
系统调用以备份数据文件,控制文件及归档日志。RMAN在通道间基于负载均衡算法分配工作
,然后创建一系列dbms_backup_restore数据包调用。一旦完成一个备份集,dbms_backup_
restore数据包就会在控制文件的表中写入备份开始时间,备份大小和备份名等信息。

 


--- 数据块备份

RMAN基于备份算法来编译要备份的文件列表。基于通道数和同时备份的文件数,RMAN在
Oracle共享内存段中创建一些内存缓冲区,一般是在PGA中(默认),如果设置了dbwr_io_slaves
为非0值,那么我们的缓冲区会被推入SGA中(有large pool就用large pool, 没有就用shared
pool). 通道服务器进程随后开始读取数据文件,并在RMAN缓冲区中填充这些Oracle数据块,
一个缓冲区被填满时,输入缓冲区中的数据块会被推入输出缓冲区。  数据文件中的每
个数据块都会发生这种内存对内存的写操作(memory-to-memory write), 这种内存对内存的
写操作还会检测corruption,  如果没有检测到corruption, 数据块会保留在输出缓冲区直到
输出缓冲区被填满。 一旦输出缓冲区被填满,输出缓冲区就会被推至备份位置(磁带或磁盘)。

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

每个数据块从磁盘移入内存时都会发生内存对内存的写操作,在这个操作期间会检查数据块
的corruption 。访问数据块时可以选择空值压缩(null compression), 我们可以删除从来
没有使用过的数据块(头为0),并在执行内存对内存的写操作时丢弃这些数据块,因此,我们
只需要备份使用过的数据块,从而执行更有效的备份操作。

在Oracle10.2.0.1及以前,RMAN只会对使用过的数据块进行备份(不管当前是否有数据),
因为RMAN可以在数据库MOUNT的情况下备份,因此RMAN备份时,只能从物理层面来判断某
数据块是否被使用过,如果某数据块头部被格式化过,RMAN就认为它被使用过,就会备份
该数据块。 但是Oracle10.2.0.2 或以后,Oracle只备份当前有数据的数据块 。

RMAN可以在归档方式在线备份,但是如果是非归档模式,rman是不允许我们在数据库打开
时备份一个数据文件,因为RMAN备份的Oracle block之间都是不一致的,需要归档来进行
同步。

 

 

--- 数据块备份: 块介质恢复(block media recovery)

RMAN可以使用块级备份提供进一步的恢复选项: 块介质恢复(block media recovery).
如果出现ora-01578: block corruption detected , 就不需要恢复整个文件以,RMAN
可以简单的恢复坏数据块并执行恢复操作,也就是说数据文件中的其他数据在恢复期间
仍然可用。

 


--- 内存中的RMAN

RMAN中的内存缓冲区分为输入缓冲区和输出缓冲区。输入缓冲区(input buffer)填充从
备份文件中读取的数据块; 输出缓冲区(output buffer)则在执行内存对内存的写操作
时填充需要备份的数据块, 一旦输出缓冲区被填满,就被写入备份的位置。

输入缓冲区的大小和数据取决于实际执行的备份命令,事实上它主要取决于在一个备份
中多路复用(multiplexing)的文件数. 多路复用指在同一个备份片中备份数据块的文件数。


多路复用体现的是一种并行,如果系统在RMAN多路复用期间还有更多的并行的能力
且备份设备还有空余的能力,调整多路复用数一般都会提升备份的性能。但是这也
有一个度的问题,并不是说并行程序多高越好,如果并行度过高会对数据库服务器
产生影响,在降低备份服务器性能的同时也会很多的影响到备份的性能。

从实际的测试及Oracle的建议来看,多路复用设置的规则为:如果要备份的所有磁盘
或数据文件很好的做了条带(stripe),多路复用处就不大了,可以将多路复用级别设
为1或者2,如果磁盘没有做条带,多路复用应当设一个8之下的一个值。大于8的值常
用在备份有很多空块的文件或在做增量备份时。

为了保持合理内存分配,根据一起备份的文件数,分配内存缓冲大小需要遵循下面
的规则:
1. 如备份集内的文件数小于或等于4个,RMAN会为每个文件分配4个大小为1M的缓冲区。
缓冲区总和小于等于16M .
2. 如备份集内的文件数小于或等于8个,RMAN会为每个文件分配4个大小为512K的缓冲区。
缓冲区总和小于等于16M .
3. 如备份集内的文件数大于8个,RMAN会为每个文件分配4个大小为128K的缓冲区。这就
确保每个要备份的文件占用 512K 的缓冲区内存。 

 

-- 备份到磁盘时的输出缓冲区

RMAN将分配输出缓冲区以在数据溢出到备份片之前接受来自输入缓冲区的数据块。此时
每个通道有4个输出缓冲区,每个大小为1MB, 因此每个通道的内存区域通常为4MB .

 

-- 备份到磁带时的输出缓冲区

备份到磁带时的内存分配是不同的,这是由于磁带设备的I/O速率较慢。在磁带上备份或
恢复时,RMAN会为每个通道分配4个输出缓冲区,每个大小为 256K, 因此每个通道的内存
区域通常为 1M . 

 

---- RMAN的内存利用:PGA & SGA

在磁盘上的备份会使用PGA内存作为备份缓冲区,如果设置dbwr_io_slaves为任意的非零值,
RMAN会自动分配4个I/O从属协调输入缓冲区内存中的数据块加载,为实现此功能,RMAN磁盘
备份的内存区会被推入SGA中的shared pool, 如果SGA中有large pool, 则被推入large pool.
默认情况下 dbwr_io_slaves=0, 所以磁盘备份默认使用PGA内存区。

默认backup_tape_io_slaves=false, 不使用磁带I/O从属,这时备份内存空间会使用PGA,
如果设置backup_tape_io_slaves=true, RMAN会为每个通道创建一个从属进程来帮助备份
工作,为协调这一功能,RMAN会将内存分配推进到SGA.   如果配置了I/O从属且有large
pool, 那么会使用large池,如果没有large池,会在SGA的shared pool中分配内存。large
池的大小基于为备份分配的通道总数(加上1MB用于开销)。

 

---- 恢复目录

恢复目录(Recovery Catalog)存储的是与RMAN备份有关的元数据,可以看作是保存RMAN备份
和恢复所需相关信息的副本, 恢复目录仅仅是一些数据包,表,索引和视图。 RMAN中的再
同步命令会使得目标数据库控制文件中的内容刷新到这些表中。当然,区别在于,恢复目录
可以包含企业中所有数据库的信息,而控制文件只包含它自己数据库的信息。

连接目标数据库需要sysdba权限,但是到恢复目录的连接不需要sysdba权限 。

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

手工执行任何针对恢复目录对象的DML命令都是非常危险的,所以Oracle创建了前缀为RC_
的视图,可以从这些视图中析取信息,从而保护了恢复目录表。 其实这些视图是目标库中
控制文件中对应的v$视图的不同实现。 

恢复目录中还有一个数据包dbms_rcvcat数据包,可以将这个数据包看作恢复目录的dbms_backup
_restore数据包实现。区别在于dbms_rcvcat将备份完成信息写入恢复目录,而后者将信息
写入目标库控制文件。

 

 

---- 版本兼容

鉴于必须使用多种不同的组件,我们在使用RMAN时必须注意数据库版本的限制。
兼容性问题分为 5 个部分,每一个部分都有一个版本号:
1. RMAN可执行版本 ;
2. 目标数据库;
3. 恢复目录schema ;
4. 恢复目录数据库 ;
5. 辅助数据库;

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

针对恢复目录数据库与恢复目录模式的兼容性问题,简单的方式就是,在高版本
的数据库中创建该版本的恢复目录,这个目录可以注册低版本的DB, 注意低版本
不能注册高版本的库。

 

 

---- RMAN备份全过程

RMAN作为sysdba登录目标库,我们被连接为内部用户sys, rman会立即产生一个用于
执行备份的通道进程,默认只分配一个通道,默认也不会使用I/O Slave, 通道进程
会在PGA中分配内存。

随后,RMAN通过编译一个sys.DBMS_RCVMAN调用,从目标库控制文件中请求数据库结
构信息,RMAN从控制文件中收集版本信息和控制文件本身的信息(当前序列号,创建
时间), 比如全备份,RMAN会请求数据库中每个数据文件的信息,判断是否存在离线
的数据文件,这些数据文件信息包括每个数据文件所在磁盘和工作方式的信息,RMAN
编译了文件列表之后,准备开始执行备份,为了保证一致性,RMAN必须构建快照控制
文件,如果snapshot controlfile已经存在,那么将这个文件重写为新的快照控制文
件,接下来,RMAN创建对dbms_backup_restore数据包的调用,该调用可以创建备份片,
备份片被创建在默认的文件位置, RMAN拥有文件类表,所以它可以为磁盘读取操作
分配内存缓冲区,分配内存以后,RMAN初始化备份片。备份片得到一个唯一的默认值,
开始备份,RMAN不会检查是否存在用于成功备份的足够空间,空间如果用完,备份即
失败。

一旦初始化了备份片,通道进程就可以开始数据库备份进程。RMAN会判断是否使用了
spfile, 如果使用了spfile, RMAN会自动将该文件备份为备份集的一部分。RMAN还要
在备份集中备份当前控制文件。 只要备份了system表空间,就会自动备份当前的控
制文件。

完成了spfile和控制文件的备份后,就开始读取数据文件并将数据块推入内存,随后
就是从输入缓冲区到输出缓冲区的内存对内存的写操作,在这个写操作期间,RMAN会
判断数据块是否被初始化,或者数据块头信息是否仍然为零。 如果数据块未被使用过,
就不会发生到输出缓冲区的写操作,同时丢弃此数据块,这其实是一种压缩方式,叫
Null Compression, rman永远不会备份从来没有使用过的数据块。

Unused Block Compression:  从Oracle 10.2.0.2版本开始,rman 备份时候不会备份
当前没有包含数据的数据块(即使有被使用过),这叫Unused Block Compression。rman
现在创建一个压缩比更强的数据文件的备份,会不备份当前没有用来存放数据的数据块。
同样这个过程也是在从输入缓冲区到输出缓冲区的内存对内存的写操作期间进行。


在满足一定条件下,Oracle 10.2.0.2.0 首先判断oracle block是否被使用过(头信息
是否为零), 如果使用过,然后判断是否存在数据, 如果存在就会在这个数据块上执
行检验和checksum 操作 。 最后判断Oracle block头和脚注是否匹配, 判断是否是
split block,  如果不是就写入输出缓冲区, 如果是split block,  那么重新将block
备份到输入缓冲区 。 (此过程有待确认) 


一旦输出缓冲区被填满,就会将内容转存到备份文件位置。由于RMAN缓冲区填充来自
于所有数据文件的数据块,所以在转存储文件中的数据块是杂乱无序的。转储文件只
是一个存储段,只有RMAN能够在还原时将这些数据块还原到正确的位置。在备份片中
中写入数据块时,可以从RMAN影子进程中得到备份的状态信息。RMAN影子进程在目标
数据库上检查远程过程调用(RPC), 并将信息传递给v$version_longops视图,供用户
查看。

一旦一个数据文件的所有数据块都被读入输入缓冲区并且确定状态,RMAN就会通过将
这个数据文件头写入备份片来结束该文件的备份操作。在所有数据文件头都被写入备份
片之后,RMAN会生成一个对sys.dbms_backup_restore数据包的调用。该调用在控制
文件中写入备份信息,包括备份片名,启动备份操作时的检查点SCN和完成备份操作的
时间 。

如果想进一步了解备份内存的工作流程,可以启动调试选项,从而得到一个完整的进程
列表。不过这个操作可能会影响到备份的性能。最好在测试环境进行。
c:\>  rman  target  /   debug  trace=/u01/backup/rmanback.out  

 


--- 闪回恢复区(flash recovery area: FRA)

作为10g 版本的新特性,FRA是磁盘上用于存储所有Oracle恢复文件的特定位置,恢复
文件包括: 完全的数据文件备份,增量备份,数据文件副本,备份控制文件及归档日志。
FRA也存储联机重做日志,块更改跟踪文件以及当前控制文件的镜象副本 。 具体参考:
http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx

 

--- 增量备份

注意:  9i, 10g RMAN备份机制不太一样。9i的rman增量备份实质上是将所有的
db block做了一次遍历,比较scn号是否发生变化,然后重新备份更新的OS块直到
得到一个一致版本的Oracle Block;10g是做了一个scn变化表,增量备份的时候直
接从改变读取变化的块 。

 

参考: 
http://www.360doc.com/content/11/0522/09/2054285_118496253.shtml

http://www.360doc.com/content/11/0522/09/2054285_118496253.shtml
http://www.360doc.com/content/11/0522/09/2054285_118496253.shtml 

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

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

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13505653