RMAN体系结构概述
RMAN的物理构成
RMAN由两部分组成,可执行文件和recover.bsq 文件。 Recover.bsq 文件实质上是库文件,可执行文件从recover.bsq 文件中析取代码来创建在目标数据库上执行的PL/SQL 调用。Recover.bsq 文件是整个操作的中枢。这个文件始终保持链接,并在逻辑上构成RMAN 客户端使用程序。要注意的是: recover.bsq 文件和 可执行文件的版本必须是相同,否则不能正常工作。
RMAN 分企业版和标准版2种,如果只能使用标准版的RMAN,那么RMAN 就只能分配一个通道
因为RMAN通常需要访问数据库中sys包等信息,所以在连接时要用sysdba的身份连接。
RMAN和控制文件关系(NOCATALOG模式)
RMAN利用控制文件中的信息
由于控制文件存储的是数据库文件信息,所以RMAN 会利用控制文件获取备份所需的信息,具体的操作方式是: RMAN 使用控制文件来编译文件列表,得到检查点信息,并确定可恢复性。通过直接访问控制文件,RMAN可以编译文件列表而不需要用户创建文件列表,这样避免了备份脚本时的一个非常繁琐的步骤,并且在添加一个新文件时不需要更改这个脚本。控制文件会存储新文件的信息,因此RMAN也能从控制文件中得到这个信息。
控制文件还能用作RMAN 目录。RMAN完成数据库任何部分的备份后,会在控制文件中添加该备份的记录,以及说明备份开始和结束时间的检查点。这也是从Oracle 7 到Oracle 8 版本控制文件大小呈指数增长的一个主要原因:控制文件中存在RMAN记录。控制文件中的这些记录通常成为元数据,它和实际备份中记录的数据有 ,它也可以存储在恢复目录中。
RMAN信息在控制文件中保存时间
控制文件中的RMAN 备份记录属于循环重用记录类型(即如果分配的空间超过了就可以删除这部分空间以供后续数据使用),如果含有这些记录的控制文件区域已满,这些记录就会删除。这会给恢复带来灾难,致使控制文件中不存在任何备份记录,就好像从未发生过备份一样。一定要注意的一点: 如果控制文件不含有任何RMAN 备份记录,RMAN 就不能使用备份来执行恢复操作。
我们可以使用参数CONTROL_FILE_RECORD_KEEP_TIME来设置存储RMAN信息的时间,默认是7天(SQL>ALTER SYSTEM SET CONTROL_FILE_RECORD_KEEP_TIME=14 SCOPE=BOTH;)
将控制文件备份为一个二进制文件而不是一个跟踪文件,所有备份信息都将被保留。 该命令类似于:Alter database backup controlfile to '/u01/backup/bkup_cfile.ctl';
快照控制文件(RMAN使用快照控制文件来保持数据的一致性)
控制文件是一个非常繁忙的文件,它存储数据库的结构信息,这些信息包括用于恢复的检查点SCN信息。连续的SCN 和文件管理对于数据库的生命期来说至关重要,因此RDBMS 必须能够持续的使用控制文件。
这样就会为RMAN带来一个问题。RMAN 开始备份每一个数据文件时需要得到一个一致的控制文件视图,此时RMAN 只需要知道备份开始时最新的检查点信息和文件就够信息。开始备份后,RMAN 需要这些信息在备份操作期间保持一致,也就是说RMAN需要一个读取一致的控制文件视图。除非RMAN 在备份持续时间内锁定控制文件,否则数据库会不断更新控制文件,所以不可能。 但是,锁定控制文件意味着数据库不能执行检查点操作和切换日志,或则不能产生新的归档日志,这些操作是不可能的。
RMAN 使用快照控制文件(snapshot controlfile)来解决前面提出的问题,快照控制文件是控制文件的副本。 RMAN 只在备份和同步操作期间使用快照控制文件。 这些操作开始时,RMAN 会根据实际控制文件来刷新快照控制文件,这样会短暂的锁住控制文件,随后,RMAN 会切换到快照并在备份持续使用这个快照。 这种方式具有读取一致性,且不妨碍数据库活动。
在默认情况下,快照控制文件位于UNIX 平台上的ORACLE_HOME/dbs 目录中,或者是在windows 的ORACLE_HOME/database 目录下。 快照控制文件的默认名为SNCF.ORA。 使用configure snapshot controlfile命令可以在任何时候更改快照控制文件名:
Configure snapshot controlfile name to 'location/file_name';
RMAN进程
RMAN的2个进程
RMAN在连接到数据库后,主要有2个进程,一个进程是对SYS数据包的调用来进行备份恢复;另外一个用来查询当前备份恢复的情况,可以通过以下sql来观察
SELECT sid,
serial#,
context,
sofar,
totalwork,
ROUND(sofar / totalwork * 100, 2) "%_complete"
FROM V$SESSION_LONGOPS
WHERE opname LIKE 'PMAN'
AND opname NOT LIKE '%aggregate%'
AND totalwork != 0
AND sofar <> TOTALWORK
还可以在v$version 视图中查看这些进程。 RMAN 分配一个通道时,它会在输出中提供如果所示的会话ID信息:
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=19 设备类型=DISK
SID 信息对应与v$session 中的SID 列。
SQL> col client_info format a30
SQL> col program format a15
SQL> select sid,saddr,paddr,program,client_info from v$session where sid=19;
SID SADDR PADDR PROGRAM CLIENT_INFO
---------- -------- -------- --------------- ------------------------------
19 A9CCBD10 AA728C44 rman.exe rman channel=ORA_DISK_1
RMAN 和 I/0 从属
如果在目标数据库上配置了I/O从属,RMAN 就可以使用I/0从属。 为了用RMAN 备份和还原,有两种可用的I/0从属: 磁盘I/0 从属 和 磁带I/0 从属。
使用DBWR_IO_SLAVES 参数可以配置磁盘I/O从属。 这个参数可以被设置为任意数值,它的主要作用是在将‘脏’缓冲区(即写满的缓冲区)的内容写入磁盘时唤醒另外的DBWR从属来执行磁盘写操作。 如果参数被设置为非0值(如:1,12或23),RMAN 会自动在每个通道中切换使用4个I/O 从属来帮助将数据库读入RMAN内存缓冲区。 这是一个不错的功能,但是RMAN 分配内存的方式有很大的变化。 只有在OS 平台不支持本地异步或者禁止Oracle RDBMS使用异步I/O时,DBWR_IS_SLAVES参数才会起到作用,如果支持异步I/O,就不需要使用磁盘I/O从属。
磁带I/O 从属可帮助服务器进程访问磁带设备。 如果BACKUP_TAPE_IO_SLAVES 参数被设置为TRUE,RMAN 会为每个磁带通道进程分配一个I/O 从属来帮助在磁带位置上执行写操作。 与磁盘I/O 从属不同的是,BACKUP_TAPE_IO_SLAVES 参数只对RMAN 磁带备份起作用。 由于磁带设备不存在本地异步I/O,我们建议将该参数设置为true。 这有助于保持磁带设备传输,以达到更佳的备份和还原性能
RMAN 使用的SYS数据包
RMAN 服务器进程在协调通道工作时要访问两个SYS数据包:DBMS_RCVMAN 数据包 和 DBMS_BACKUP_RESTORE 数据包, 这两个包包含了目标数据库中RMAN的所有功能。
SYS.DBMS_RCVMAN 数据包(用于从控制文件中获取备份还原的信息)
DBMS_RCVMAN 数据包用来访问控制文件中的表并将此信息传递给RMAN,使用RMAN 可以构建准确反应数据库结构的备份和还原操作。DBMS_RCVMAN 包负责在执行任何操作前设置time 运算符和校验数据文件头中的检查点信息,并价差文件位置和大小,以及有关节点相似性(在RAC 环境中)和磁盘相似性的其他信息。 这种信息会影响RMAN的性能,并且RMAN 在构建实际备份/还原命令之前自动执行负载均衡(load-balancing)算法和性能增强(performance-enhancing)算法。
SYS.DBMS_BACKUP_RESTORE 数据包(实际运行备份还原命令)
SYS.DBMS_RCVMAN 包访问控制文件并校验所有必须的信息。 这些必须的信息被传递回RMAN服务器进程,RMAN 服务器进程随后会基于recover.bsq 文件中的代码创建一些PL/SQL 块。 这些PL/SQL 块含有对DBMS_BACKUP_RESOTRE 数据包的调用,实际上RMAN 中是由DBMS_BACKUP_RESTORE数据包来创建系统调用以备份数据文件,控制文件和归档的redo log。 RMAN 接收从DBMS_RCVMAN 数据包返回的信息,并在通道间基于负载均衡算法分配工作,然后创建一系列DBMS_BACKUP_RESTORE 数据包调用。
在V$SESSION_LONGOPS 视图中可以跟踪的是DBMS_BACKUP_RESTORE 数据包的工作。它执行备份和还原操作,此外还可以以受限方式访问控制文件。 DBMS_BACKUP_RESTORE 数据包访问控制文件以备份该文件(实际上是控制文件的快照),在备份完成后写入备份信息。 一旦完成了一个备份集, DBMS_BACKUP_RESTORE 数据包就会在控制文件的表中写入备份开始时间,备份大小和备份名的信息。
内核中的RMAN 数据包
创建数据库时,运行cataproc.sql 脚本可以默认安装上述两个RMAN 数据包。 数据库创建期间无法跳过这一步骤。所以在8i 以后的每个版本里都存在rman 包。
这些RMAN 数据包还有一个重要的特性,他们被硬编码到Oracle 软件的库文件中,因此及时没有打开数据库也可以调用这些数据包。 我们知道,大多数数据包只在数据库打开时才能被使用,不过RMAN可以在数据库实例处于未加载模式或者加载模式时编写对DBMS_BACKUP_RESTORE 数据包的调用。 这也是为什么在没有打开数据库时也能够备份和还原数据库。
RMAN的数据块备份
原理简述:开辟内存区域(PGA或者SGA)à读取要备份数据文件à填入输入缓冲区(当一个输入缓冲区满)à填入输出缓冲区(当一个输出缓冲区满)à写入备份位置的文件中.
数据块备份的工作原理:RMAN 基于备份算法规则来编译要备份的文件列表。基于通道数和同时备份的文件数,RMAN 在Oracle 共享内存段中创建一些内存缓冲区。 一般在PGA中,不过有时内存缓冲区会被推入SGA。 通道服务器进程随后开始读取数据文件,并在RMAN缓冲区中填充这些数据块。一个缓冲区被填充时,输入缓冲区中的数据快会被推入输出缓冲区。 数据文件中的每个数据块都会发生这种内存对内存的写操作(memor-to-memory write)。 如果数据块复合备份的标准并且内存对内存的写操作没有检测到讹误(corruption),则这些数据块会保留在输出缓冲区中直至输出缓冲区被填满。 一旦输出缓冲区被填满,输出缓冲区就会被推至备份位置(磁带或者磁盘)。
一旦所有文件已通过内存缓冲区过滤,就完成了备份片,同时RMAN 会在目标数据库的控制文件中写入备份片的完成时间和备份片的名称。
RMAN的内存利用
RMAN 会在内存中构建一些缓冲区,然后通过这些缓冲区将数据块写入到备份中。 内存的利用与PGA(有时是SGA)的总体大小有关。 内存缓冲区分为输入缓冲区和输出缓冲区。 输入缓冲区(input buffer)填充从备份文件中读取的数据块;输出缓冲区(output buffer)则在执行内存对内存的写操作时填充需要备份的数据块,一旦输出缓冲区被填满,输出缓冲区的内容就会被写到备份位置。
输入内存缓冲区
备份数据库时,输入内存缓冲区的大小和数据取决于实际执行的备份命令,事实上它主要取决于在一个备份中多路服用(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)。
可以使用如下的查询来监控备份运行时基于每个每个文件的缓冲区大小:
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;
备份到磁盘时的输出内存缓冲区
除了输入缓冲区之外,RMAN还会根据输出设备分配输出缓冲区。如果备份到磁盘,则RMAN 将分配输出缓冲区以在数据溢出到备份片之前接收来自输入缓冲区的数据块。此时,每个通道有4个输出缓冲区,每个输出缓冲区大小为1MB,因此每个通道的内存区域通常为4MB。
备份到磁带时的输出内存缓冲区
备份到磁带时的内存分配是不同的,这是由于磁带设备的I/0速率较慢。在磁带上备份或从磁带上恢复时,RMAN会为每个通道进程分配4个输出缓冲区,每个缓冲区的大小为256KB,因此每个通道的内存区域通常为1MB。
用于还原的内存缓冲区
还原操作期间的内存分配与备份操作期间的内存分配稍有不同,这是因为他们的作用是相反的:备份操作是读取数据文件并写入备份位置,而还原操作则是读取备份位置并写入数据文件。 还原磁盘备份时,输入缓冲区的大小为1MB,同时RMAN 会为每个通道分配4个缓冲区。 还原磁带备份时,RMAN 会分配4个输入缓冲区,每个缓冲区的大小等于blksize参数的值(默认值为256kb)。用于还原的输出缓冲区通常为128kb,并且每个通道有4个输出缓冲区。
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备份举例
先举一个简单的备份例子:
C:>Rman target /
Rman>backup database;
详细的看一下RMAN 备份的全过程:
(生成bequeath连接à产生服务进程以sysdba用户登陆à产生通道并分配à在PGA/SGA分配内存)
RMAN 生成到目标数据库的bequeath连接,这就是说RMAN会检查ORACLE_SID变量中的实例名,并在该实例上产生一个服务器进程,然后作为sysdba用户登录。这样我们被连接为内部数据库用户sys,rman会立即产生一个用于执行备份操作的通道进程。 如果使用默认设置,就只分配一个通道。 在没有使用I/O从属的情况下,通道进程会在PGA中分配内存。
(调用DBMS_RCVMAN从控制文件中获取备份信息)
随后RMAN 通过编译一个sys.DBMS_RCVMAN调用,从目标数据库控制文件中请求数据库结构信息,显示确定目标数据库的版本。RMAN从控制文件中收集版本信息和控制文件本身的信息,控制文件本身的信息包括控制文件的类型,控制文件中的当前序列号以及控制文件的创建时间。
我们在例子中指定了数据库的完全备份,所以RMAN会请求数据库中每个数据文件的信息,并且判断是否存在离线的数据文件。这些数据文件信息包括每个数据文件所在磁盘和工作方式的信息,由于使用了默认设置,所以只存在一个通道和一个备份集。 这样以来,rman会忽略所有的相似性信息,把注意力放在编译包含在数据集内的文件列表上。
(创建快照控制文件à调用DBMS_BACKUP_RESTOREà分配内存à创建备份片)
编译了文件列表之后,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 查看:
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
参考出处:http://blog.csdn.net/tianlesoftware/article/details/5659701
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25269462/viewspace-766287/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25269462/viewspace-766287/