RMAN 复制目标数据库的理论知识(一)

2014-11-24 17:59:46 · 作者: · 浏览: 3

一. RMAN 复制的基础



1.1 使用RMAN 复制的原因


RMAN 复制是必须的。 我们可以只将控制文件复制到新位置,然后再运行还原与恢复操作。 但是在使用了恢复目录的情况下,如果不使用RMAN复制来复制数据库,就存在许多问题。 由于RMAN 基于数据库DBID 在恢复目录中注册数据库,因此即使存在同名的数据库(inint.ora 中的DB_NAME参数),数据库ID也能唯一地标识数据库。如果不使用duplicate命令,就会存在具有相同的DBID的两个数据库。此时,尝试在相同的目录中注册复制的数据库,就会报错:


Rman-20002: target database already registered in recovery catalog;


如果忽略,并继续执行数据库的备份操作,会收到另一个错误:


Rman-20011target database incarnation is not current in recovery catalog


产生这种错误消息的原因是RMAN 认为用户复制的只是产品系统的还原版本,所以该复制当作产品服务器的当前对应物,这样RMAN就完全不知道真正的产品服务器是什么。 虽然我们可以将对应物重置回与产品服务器匹配的一个对应物,但是实际上已经破坏了恢复目录,所以应当取消数据库的注册,然后在恢复目录中重新注册这个数据库。



如果没有使用恢复目录,非完全拷贝的复制也会造成严重的损害。 例如,在与主数据库相同的系统中复制数据库,然后在磁带上备份这两个数据库,由于没有使用恢复目录,所以会打开这两个实例的控制文件自动备份。 某天,突然丢失了一个磁盘阵列信息,整个系统出现故障,同时还丢失了所有数据库和控制文件。 此时,会认为由于自动备份了控制文件,所以只需要使用其中一个备份就能够恢复系统。


但实际情况并非如此,restore controlfile from autobackup 命令使用DBID 跟踪控制文件的自动备份,由于两个数据库都备份在同一个磁带上,所以该命令可能从错误的数据库备份中还原控制文件,用户得到的就是含有错误信息的错误文件。




1.2 复制的体系结构


这小节介绍复制的工作原理。 使用时,RMAN 连接到目标数据库和恢复目录(如果有),用户通过这个连接才能够访问目标数据库控制文件中的备份位置的详细信息。 连接目标数据库后,还必须连接辅助实例。 辅助实例驻留复制的数据库。 启动复制操作前,必须为辅助实例构建一个init.ora文件,同时以nomount模式启动辅助实例,这样就可以初始化内存段,并且RMAN 可以生成到这个辅助实例的sysdba连接。由于辅助实例仍然不包含控制文件(复制操作会负责创建),因此我们不能加载这个辅助实例。


生成连接后,就可以使用duplicate 命令,复制实例:


Duplicate target database to SID;



复制进程分为一下这些不同的阶段:


(1)RMAN 确定备份的状态和位置


(2)RMAN 在辅助实例上分配辅助通道


(3)RMAN 在辅助实例中还原数据文件


(4)RMAN 构建新的辅助控制文件


(5)如果有必要,RMAN 从备份中还原归档日志,同时执行任何必要的恢复操作。


(6)RMAN 重置辅助实例的DBID,并且使用OPEN RESETLOGS 命令打开辅助数据库。


首先,RMAN 设置运行时(runtime)参数,如duplicate命令中的until time 子句。 接着RMAN 基于这些参数检查目标数据库的控制文件和恢复目录,确定适当的备份。 随后,RMAN创建访问备份的远程过程调用,但是不会在目标数据库上执行代码,RMAN 会在辅助实例上创建一个称为辅助通道(auxiliary channel)的通道进程。 RMAN 向这个通道传递对DBMS_BACKUP_RESTORE数据包的调用。紧接着,辅助实例访问备份和还原所有必须的数据文件。



1.2.1 辅助通道配置


Configure default device type to sbt;


Configure device type sbt parallelism 2;


Configure auxiliary channel 1 device type sbt parms="env=(nb_ora_serv=mgtserv,nb_ora_class=oracle)";


Configure auxiliary channel 2 device type sbt parms="env=(nb_ora_serv=mgtserv,nb_ora_class=oracle)";



1.2.2 将数据文件还原到不同的文件位置


加载新的控制文件后,RMAN就可以开始还原数据文件。如果在驻留目标数据库的相同服务器上复制数据库,就必须修改数据文件还原的位置。


即使将数据文件还原到不同的服务器上,加载点和目录结构中的差异也要求使用新的文件位置。 我们可以使用三种方法来修改复制进程的数据还原步骤以指向新的文件位置。



(1) 使用configure 命令,为需要配置新位置的所有数据文件配置auxname,这个配置存储在目标数据库的控制文件中。


Configure auxname for datafile 1 to '/u01/oradata/sidname/system01.dbf'


Configure auxname for datafile 2 to '/u01/oradata/sidname/undo01.dbf';


......



(2) run代码块中指定新的数据文件名:


Run{


Allocate channel c1 type 'sbt_tape';


Set newname for datafile 1 to '/u01/oradata/sidname/system01.dbf';


Set newname for datafile 2 to '/u01/oradata/sidname/undo01.dbf';


Duplicate target database to auxsidname;


}



(3) 在辅助实例的init.ora 文件中添加DB_FILE_NAME_CONVERT参数。该参数有2个字符串,第一个为数据文件在目标数据库上的原始位置,第二个是数据文件在辅助实例中的新位置。如:


Db_file_name_convert(


'/u01/oradata/prod/system01.dbf','/u01/oradata/dave/system01.dbf',


'/u01/oradata/prod/undo01.dbf','/u01/oradata/dave/undo01.dbf')



但是当数据文件比较多的时候,这种方法就有点麻烦,我们可以写到数据文件实例名这一层即可,其他的会自动完成,如:


db_file_name_convert = (''/u01/oradata/prod','/u01/oradata/dave')




1.2.3 创建新的控制文件


还原完所有的文件后,复制操作会为辅助实例创建新的控制文件。通过使用duplicate命令中概述的各种参数,RMAN在辅助实例上执行create controlfile命令。创建完控制文件