我是靠谱客的博主 懦弱豌豆,最近开发中收集的这篇文章主要介绍RMAN原理(二)--数据块备份,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

如果是非归档模式,rman 不允许我们在数据库打开时备份一个数据文件,否则会报如下错误:
        ora-19602:cannot backup or copy active file in NOARCHIVELOG mode。

        RMAN 会在内存中构建一些缓冲区,然后通过这些缓冲区将数据块写入到备份中。 内存的利用与PGA(有时是SGA)的总体大小有关。 内存缓冲区分为输入缓冲区和输出缓冲区。 输入缓冲区(input buffer)填充从备份文件中读取的数据块;输出缓冲区(output buffer)则在执行内存对内存的写操作时填充需要备份的数据块,一旦输出缓冲区被填满,输出缓冲区的内容就会被写到备份位置。

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

可以使用如下的查询来监控备份运行时基于每个文件的缓冲区大小:
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先检查ORACLE_SID变量中的实例名,并在该实例上产生一个服务器进程,然后作为sysdba用户登录。这样我们被连接为内部数据库用户sys。rman会立即产生一个用于执行备份操作的通道进程。在没有使用I/O从属的情况下,通道进程会在PGA中分配内存。随后RMAN 通过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 不再检查是否存在用于成功备份操作的足够空间,这是因为空值压缩和Oracle 10g 空白压缩可以极大地减少备份中的数据文件大小。相反,RMAN 将运行它的备份直到空间用完,然后备份失败。
        一旦初始化了备份片,通道进程就可以开始数据库备份进程。RMAN会判断是否使用了spfile,如果使用了spfile,RMAN 会自动将该文件备份为备份集的一部分。RMAN 还要在备份集中备份当前控制文件。只要备份了SYSTEM 表空间,就会自动备份当前的控制文件。完成spfile和控制文件的备份后,就开始读取数据文件并将数据块推入内存,为了实现这一功能,通道进程在磁盘上执行预读(read-ahead)操作,并且将多个数据块同时推入内存。随后发生的是从输入缓冲区到输出缓冲区的内存对内存的写操作,在这个写操作期间,RMAN会判断数据块是否被初始化,或者数据块头信息是否仍然为零。如果数据块未被使用过,就不会发生到输出缓冲区的写操作,同时丢弃这个数据块。如果数据块被使用过,RMAN就会在这个数据块上执行检验和checksum 操作。 如果数据块的头和脚注不匹配,这个数据就会被写入输出缓冲区。一旦输出缓冲区被填满,就会将输出缓冲区的内容转存储到备份文件位置。 由于RMAN缓冲区填充来之所有数据文件的数据块,所以在转存储文件中的数据块是杂乱无序的。一旦一个数据文件的所有数据块都被读入输入缓冲区并且确定状态,RMAN 就会通过将这个数据文件头写入被分片来结束该文件的备份操作。在所有数据文件头都被写入备份片之后,RMAN 会生成最后一个对SYS.DBMS_BACKUP_RESTORE数据包的调用,该调用在控制文件中写入备份信息,这些备份信息包括备份片名,启动备份操作时的检查点的SCN和完成备份操作的时间。

最后

以上就是懦弱豌豆为你收集整理的RMAN原理(二)--数据块备份的全部内容,希望文章能够帮你解决RMAN原理(二)--数据块备份所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部