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


一. 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-20011: target 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 辅助通道配置

为了执行复制操作,RMAN 必须在辅助实例上分配一个或多个通道进程。 从Oracle 9i开始,由于使用目标实例控制文件中存储的永久配置参数可以自动创建辅助通道,所以不必在复制时手工地分配辅助通道。辅助通道的构成主要来自于为目标通道建立的参数,其默认设备类型和并行化几倍都使用与目标通道设置相同的永久参数。 因此,如果使用磁盘上的备份执行复制操作,就不需要在配置辅助通道。 不过,如果利用磁带上的备份执行复制操作,就必须配置辅助通道,以包含目标通道具有的全部介质管理器环境参数。 如下面实例中,将默认设备类型设置为磁带,默认的并行话级别设置为2

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命令。创建完控制文件后,可以加载这个辅助数据库。 此时,RMAN执行切换操作切换到新的文件,这个切换操作可以使用RMAN修改辅助站点上的新控制文件以指向数据文件位置。

1.2.4 恢复归档日志

还原和切换完文件后,就能够对数据库执行恢复操作。 此时即可以将数据库恢复到当前时间点,可以将数据库恢复到until time子句指定的时间点。要执行恢复操作,RMAN需要访问归档日志。 如果RMAN 备份了归档日志,RMAN就能够将这些归档日志从备份位置还原到辅助数据库init.ora 文件中指定的Log_archive_dest位置。我们也可以手工地将归档日志移动到新实例要求的位置,这样RMAN 就能够不需要还原归档日志而在磁盘上查找到这些文件。 如果在目标数据库当前驻留的相同服务器上执行复制操作,RMAN就能够在目标数据库的LOG_archive_dest 位置中查找到归档日志。

还原完归档日志后,RMAN会执行一些必需的恢复操作。 如果没有指定结束恢复操作的时间点,RMAN 会还原到最后一个可用的归档日志,然后结束恢复操作。 在复制操作期间,RMAN不能进一步检查联机重做日志文件的恢复信息。到达归档日志的结束点后,RMAN 停止恢复操作。如果RMAN从备份中还原了归档日志,这些归档日志就会在恢复操作完成后被删除。

1.2.5 修改数据库IDDBID

介质恢复完成后,数据库将处于一致的状态中,此时RMAN将修改新复制的DBID。由于在这个时间点之前的所有操作都要求复制数据库与目标数据库具有相同的DBID,所以RMAN必须等待复制数据库中的其他动作全部完成。如果控制文件具有不同的DBID,复制在介质恢复期间就不能应用归档日志。

修改DBID的进程非常简单,RMAN 有一个称为dbms_backup_restore.zerodbid()的过程。 在数据库处于加载但未打开的状态时,这个过程会查看文件头并将每个文件头中的DBID清零。 随后,RMAN关闭这个数据库并再次重新创建辅助控制文件。 重新构建控制文件时,Oracle会检查文件头中的DBID,如果没有发现任何DBIDOracle 就会生成一个新的DBID并且将其加入到每个文件头中。

如果手工的使用zerodbid()过程要非常谨慎。 此外Oracle 9i后提供了一个dbnewid的使用程序,这个程序能安全地为数据库生成新的ID.

1.2.6 在辅助站点上创建日志文件

在完成复制进程并执行最有一条open resetlogs命令时,RMAN 必须为辅助数据库构建全新的日志文件。 这种情况下在执行open resetlogs命令时通常会发生,不过在使用duplicate命令时需要确定新日志文件的定义。如果在目标数据库所在的系统上执行复制操作,至少需要重命令日志文件。

如果要修改新数据库使用的日志文件的大小,数目和位置,可以在执行duplicate命令时指定新日志文件的定义:

Duplicate target database to auxname

Pfile=/u01/oracle/admin/auxname/init.ora

Logfile=

'/u01/oracle/oradate/auxname/redo01.log' size 100m,

'/u01/oracle/oradate/auxname/redo02.log' size 100m,

'/u01/oracle/oradate/auxname/redo03.log' size 100m;

此外,还可以使用目标数据库中已有的日志文件定义,并且可以使用init.ora 文件的LOG_FILE_NAME_CONVERT参数简单的将该定义转移到新的位置中。如:

log_file_name_convert = ('/u01/app/oracle/oradata/test01','/u01/oradata/dvdsame');

  • 1
  • 2
  • 下一页

相关内容