rman理论(一)
1) 快照控制文件:
开始备份后,RMAN 需要这些信息在备份操作期间保持一致,也就是说RMAN需要一个读取一致的控制文件视图。
除非RMAN 在备份持续时间内锁定控制文件,否则数据库会不断更新控制文件,所以不可能。
锁定控制文件意味着数据库不能执行检查点操作和切换日志,或则不能产生新的归档日志,这些操作是不可能的。
RMAN 使用快照控制文件(snapshot controlfile)来解决前面提出的问题,快照控制文件是控制文件的副本。
RMAN 只在备份和同步操作期间使用快照控制文件。 这些操作开始时,RMAN 会根据实际控制文件来刷新快照控制文件,这样会短暂的锁住控制文件,随后,RMAN 会切换到快照并在备份持续使用这个快照。 这种方式具有读取一致性,且不妨碍数据库活动。
在默认情况下,快照控制文件位于UNIX 平台上的ORACLE_HOME/dbs 目录中,或者是在windows 的ORACLE_HOME/database 目录下。
RMAN> show all; 输出结果中 Configure snapshot controlfile name 显示了快照控制文件的位置。
2) RMAN 过程中几个重要的包:
2.1 DBMS_RCVMAN 数据包:
DBMS_RCVMAN 数据包用来访问控制文件中的信息并将此信息传递给RMAN,使用RMAN 可以构建准确反应数据库结构的备份和还原操作。DBMS_RCVMAN 包负责在执行任何操作前设置time 运算符和校验数据文件头中的检查点信息,数据文件的位置和大小,以及有关节点相似性(在RAC 环境中)和磁盘相似性的其他信息。这种信息会影响RMAN的性能,并且RMAN 在构建实际备份/还原命令之前自动执行负载均衡(load-balancing)算法和性能增强(performance-enhancing)算法。
2.2 SYS.DBMS_BACKUP_RESTORE 数据包:
DBMS_BACKUP_RESTORE数据包来创建系统调用以备份数据文件,控制文件和归档的redo log。
RMAN 接收从DBMS_RCVMAN 数据包返回的信息,并在通道间基于负载均衡算法分配工作,然后创建一系列DBMS_BACKUP_RESTORE 数据包调用。
在V$SESSION_LONGOPS 视图中可以跟踪的是DBMS_BACKUP_RESTORE 数据包的工作。它执行备份和还原操作,此外还可以以受限方式访问控制文件。DBMS_BACKUP_RESTORE 数据包访问控制文件以备份该文件(实际上是控制文件的快照),在备份完成后写入备份信息。
一旦完成了一个备份集, DBMS_BACKUP_RESTORE 数据包就会在控制文件的表中写入备份开始时间,备份大小和备份名的信息。
3) RMAN过程中内存分配:
RMAN 会在内存中构建一些缓冲区,然后通过这些缓冲区将数据块写入到备份中。 内存的利用与PGA(有时是SGA)的总体大小有关。 内存缓冲区分为输入缓冲区和输出缓冲区。 输入缓冲区(input buffer)填充从备份文件中读取的数据块;输出缓冲区(output buffer)则在执行内存对内存的写操作时填充需要备份的数据块,一旦输出缓冲区被填满,输出缓冲区的内容就会被写到备份位置。
为了保持合理范围的内存分配,根据一起备份的文件数,分配内存缓冲大小需要应用下面的规则。
1) 如果备份集内的文件数小于或者等于4个,RMAN 会为每个文件分配4个大小为1MB的缓冲区。缓冲区总和小于或者等于16MB。
2) 如果备份集内文件数多余4个但少于等于8个,RMAN 会为每个文件分配4个大小为512KB的缓冲区。缓冲区总和确保少于或者等于16MB。
3) 如果多路复用的文件数多余8个,RMAN 会为每个文件分配4个大小为128KB的缓冲区。这就确保每个要备份的文件占用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;
4) RMAN 过程的相关进程:
4.1 RMAN 服务器进程
RMAN 生成一个到目标数据库的客户连接,并创建两个服务器进程。一个主要进程生成对SYS用户中的数据包的调用,从而执行备份和恢复操作,该进程会在备份和还原期间协调通道进程的工作。 另外一个次要的进程(或影子进程)轮询RMAN中的所有长事务(long-running transaction)并在内部记录信息。
-- 查询影子进程
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
4.2 RMAN 通道进程
除了默认的两个进程外,在备份活还原操作期间还会为分配的每个通道单独的创建一个进程。 RMAN 将通道视为目标数据库上的服务器进程,该进程在备份期间协调读取数据文件和写入指定位置的操作,在还原期间则协调读取备份位置和在数据文件位置写入数据块的操作。
注意:通道进程只有两种类型: 磁盘通道 和 磁带通道。 我们不能为一个备份操作同时分配这两种通道,备份只能写入磁盘或写入磁盘。
5) 数据块备份概述:
数据块备份的工作原理:RMAN 基于备份算法规则来编译要备份的文件列表。
基于通道数和同时备份的数据文件数,RMAN 在Oracle 共享内存段中创建一些内存缓冲区。 一般在PGA中,不过有时内存缓冲区会被推入SGA。
通道服务器进程随后开始读取数据文件,并在RMAN缓冲区中填充这些数据块。
一个缓冲区被填充时,输入缓冲区中的数据块会被推入输出缓冲区。 数据文件中的每个数据块都会发生这种内存对内存的写操作(memor-to-memory write)。 如果数据块符合备份的标准并且内存对内存的写操作没有检测到讹误(corruption),则这些数据块会保留在输出缓冲区中直至输出缓冲区被填满。 一旦输出缓冲区被填满,输出缓冲区就会被推至备份位置(磁带或者磁盘)。
一旦所有文件已通过内存缓冲区过滤,就完成了备份片,同时RMAN 会在目标数据库的控制文件中写入备份片的完成时间和备份片的名称。
块级备份的优点:
讹误数据块、空值压缩。
注意:如果是非归档模式,rman 不允许我们在数据库打开时备份一个数据文件,否则会报如下错误:ora-19602:cannot backup or copy active file in NOARCHIVELOG mode。
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 查看:
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备份流程简单理解:
开始备份 -> 创建快照控制文件 -> SYS.DBMS_RCVMAN -> 读取控制文件中的信息,并效验 -> RMAN 服务器进程
-> recover.bsq 库文件中的代码创建一些PL/SQL 块
-> DBMS_BACKUP_RESTORE数据包来创建系统调用以备份数据文件,控制文件和归档的redo log ->完成备份,备份信息写入控制文件
说明:参考 dave 笔记