RMAN的备份原理
今天看了DAVE对RMAN的备份原理的讲解,真的令我受益匪浅,之前只是能够熟练地运用该工具,却不知所以然。今天总算对RMAN的备份原理深入了一把。
以下是我个人对DAVE讲的内容以及网上的文章的进行整理。
注:本文只对RMAN的备份原理进行探究,并不讲到如何对数据库进行备份。
RMAN的组成
RMAN是SMR(Server Managed Recovery:服务器管理恢复)的具体实现。
RMAN主要有两部分组成:可执行文件rman.exe和recover.bsq文件
rman.exe和大部分exe文件一样,是rman的启动文件,如:
当我们执行rman target /,就是通过rman.exe连接上rman
recover.bsq文件实际上是库文件,rman程序从recover.bsq文件中解析代码来创建在目标数据库上执行的PL/SQL调用。
比如我们在登录rman后发出backup database,那么rman就会根据该语句在recover.bsq文件中解析出PL/SQL代码块,让数据库执行。
所以说rman只是起了协调作用,并不真正地干活。
RMAN的用户权限
在oracle 11g中,rman是通过sys权限连入数据库的
因为rman需要访问目标数据库上sys用户,还需要有启动和关闭数据的权限。
但是,平时我们直接在rman target /连接时候,就算rman不是sys权限也能连入,那是因为他跟sqlplus / as sysdba一样,是操作系统认证。若是rman没有sys权限,进行远程连接,那么肯定会报权限不足的错误。
在12c中,rman权限又发生了改变。
RMAN与控制文件
1.rman通过直接读取控制文件里面的信息
2.控制文件里面记录了rman的备份信息
控制文件分为两部分:
不可变部分
可变部分记录的是数据文件,日志文件的路径,文件名,表空间信息,数据库名等等。这部分的数据是不会被覆盖掉的。
RMAN就是通过读取该部分信息,方便自己对数据库进行备份恢复。
可变部分
当我们的RMAN是nocatalog方式的话,RMAN所备份的信息(包括备份的记录,备份开始和结束时间的检查点)就是记录在这一部分之内,当然这一部分还记录了很多其他信息。但是当这部分的信息满了,外部还需要往这部分里面写入数据,那么就需要覆盖这里面的信息,包括RMAN的备份信息。这时为了我们的备份信息不被覆盖,就需要设置下面的参数:
controlfile_record_keep_time:该参数是指定RMAN的备份信息在控制文件中多少天不被覆盖。
show parameter control
SQL> show parameter control _file_record_keep_time
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
Oracle默认是为7天,但具体应该设置为多少天,应该根据我们生产过程中备份计划来定。
快照控制文件
RMAN在备份的时候需要读一个一致性的控制文件,但是控制文件是一个IO比较频繁的文件,在备份过程中难免发生修改,若是我们在备份过程中锁定了控制文件已达到这种目的,那就悲剧啦。数据库的很多业务都会无法正常运行。
因此,Oracle通过快照控制文件来解决这个问题。
当我们用RMAN执行备份的时候,在$ORACLE/dbs下会产生一个快照控制文件。
[oracle@potato dbs]$ ll
total 9556
-rw-rw---- 1 oracle oinstall 1544 Jul 26 15:09 hc_orcl.dat
-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora
-rw-r----- 1 oracle oinstall 24 Jul 26 15:13 lkORCL
-rw-r----- 1 oracle oinstall 1536 Jul 26 15:38 orapworcl
-rw-r----- 1 oracle oinstall 9748480 Jan 13 23:25 snapcf_orcl.f
-rw-r----- 1 oracle oinstall 2560 Jan 13 23:18 spfileorcl.ora
如上,snapcf_orcl.f便是快照控制文件,RMAN通过读取该文件里信息来代替真的控制文件里的内容。有效地解决该问题。、
RMAN服务器进程
rman连接到目标库的客户端时会创建两个服务器进程:
主要进程:生成对sys包的调用,从而执行备份和恢复操作,并协调工作。
次要进程:轮询rman的长事务并在内部记录信息。
RMAN所调用的两个数据包
RMAN通道服务进程在协调工作时要访问两个sys数据包BMS_RCVMAN和DBMS_BACKUP_RESTORE,这俩包包含rman在目标库操作的所有功能。
这两个包是在创建数据库时,运行cataproc.sql脚本安装的,它们是被硬编码到Oracle软件的库文件中的,所以即使没有打开数据库也能调用这些数据包。
SYS.DBMS_RCVMAN用来访问控制文件并校验所必须的信息,并将此信息传递给rman服务进程,rman服务进程会基于recover.bsq文件中的代码创建pl/sql块。这些pl/sql块会调用SYS.DBMS_BACKUP_RESTORE,进行数据文件,控制文件的和归档的redo log的备份。备份集完成后,SYS.DBMS_BACKUP_RESTORE会往控制文件中记录备份信息。
RMAN备份过程
备份开始后,建立一个通道进程(应为现在使用的是默认设置),因为没有使用i/o从属,通道程序会在pga中分配。rman主要进程通过编译一个DBMS_RCVMAN调用,从目标库控制文件解析出数据库结构信息(确定目标库版本和控制文件信息(类型,当前序列号,创建时间))。编译文件列表后,之后RMAN便会创建快照控制文件,rman创建对DBMS_BACKUP_RESTORE的调用,并根据数据文件数分配输入和输出缓冲区(分配内存)。分配了内存后,rman初始化备份片,备份片得到了一个唯一的默认名字。当备份片初始化完成,通道进程开始数据库备份。rman会判断是需不需要对参数文件和控制文件进行备份。之后,rman创建对DBMS_BACKUP_RESTORE的调用,并根据数据文件数分配输入和输出缓冲区(分配内存)。分配了内存后,rman初始化备份片,备份片得到了一个唯一的默认名字。完成控文件制和spfile的备份,通道进程开始读取数据文件并将数据块输入缓冲区到输出缓冲区的内存对内存的写操作。在这个写操作期间,任满会判断块是否被初始化或数据块头信息是否为零。如果块用过(块头信息不为0,若是块头信息为0,该块可以丢弃不写,这也是RMAN的优点之一),rman会在这个块上执行效验操作。如块头和脚注不匹配,rman会指出存在讹误的数据块并终止备份。如通过数据块被推入输出缓冲区。 一般输出缓冲区填满,就会把输出缓冲区的内容转存到备份文件位置。当所有文件通过内存缓冲区过滤,就完成备份片,同时RMAN会在目标数据库的控制文件中写入备份信息。
注:以上部分内容来源于网络。