一. 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 修改数据库ID(DBID)
介质恢复完成后,数据库将处于一致的状态中,此时RMAN将修改新复制的DBID。由于在这个时间点之前的所有操作都要求复制数据库与目标数据库具有相同的DBID,所以RMAN必须等待复制数据库中的其他动作全部完成。如果控制文件具有不同的DBID,复制在介质恢复期间就不能应用归档日志。
修改DBID的进程非常简单,RMAN 有一个称为dbms_backup_restore.zerodbid()的过程。 在数据库处于加载但未打开的状态时,这个过程会查看文件头并将每个文件头中的DBID清零。 随后,RMAN关闭这个数据库并再次重新创建辅助控制文件。 重新构建控制文件时,Oracle会检查文件头中的DBID,如果没有发现任何DBID,Oracle 就会生成一个新的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');
二. 复制的位置
2.1 复制到相同的服务器
2.1.1 内存问题
Oracle 基于init.ora 文件中的DB_NAME参数值引用服务器上的内存段,因此,Oracle 不允许在同一个系统中运行具有相同DB_NAME参数值的两个实例。如果尝试加载具有相同名称的另一个实例,就会得到下面的错误:
ORA-01102: cannot mount database in EXCLUSIVE mode.
因此,在同一个系统中执行复制操作时,必须将辅助实例init.ora 文件中的DB_NAME参数修改成与目标实例不同的数据库名,如:
Db_name='orcl'
Instance_name='orcl'
2.1.2 文件位置问题
在1.2.2小节中我们讨论了三种方法来处理文件位置的问题,最简单的就是使用db_file_name_convert参数。
除了数据文件外,重做日志位置也是需要关注的。我们可以在duplicate命令中使用logfile关键字来构建完全不同的重做文件,构建这些重做文件具有不同的大小,组数和成员数,这个选项实际上重写了create controlfile命令的logfile参数。也可以在init.ora文件中添加log_file_name_convert参数来修改重做日志的位置。
2.2 复制到相同服务器的不同ORACLE_HOME目录
当辅助实例具有不同的ORACLE_HOME目录时,所遵守的规则会稍微有所不同,除了辅助到相同服务器要遵守的规则外,还需要考虑备份片的位置。如果复制磁盘备份,只需要提前确认具有相应的OS权限。然后,如果复制磁带备份,就必须确认MML文件以相同的方式连接目标实例的ORACLE_HOME和辅助实例的ORACLE_HOME,否则辅助实例就不能访问磁带备份,并且由于介质管理器不可访问,复制操作将会失败。
2.3 复制到远程服务器
2.3.1 内存问题
与复制到相同服务器的情况不同,我们不必考虑init.ora 文件中的DB_NAME参数,因为在不同的服务器上,Oracle 不会限制内存所使用的数据库名。
2.3.2 文件位置问题
由于在一个新的服务器上,所以也不必立即为辅助实例修改文件位置信息。在新的服务器上不会运行具有相同文件的另一个数据库,因此可以保留和目标实例相同的所有文件规范,这样能够避免在配置中出错。同样的,在位于不同的系统中,我们可以简化许多进程。
如果没有修改文件的位置,就必须在duplicate命令中指定nofilenamecheck参数,该参数通知复制操作不必在执行还原操作前确认文件名是不同的。如果没有指定nofilenamecheck参数,rman会给出一条错误消息。
对于这种简单的设置来说,需要注意的一个问题是有可能辅助主机不具有与目标主机相同的文件结构和加载点设置。如果加载点或驱动器配置不同,我们仍然需要为辅助实例修改文件规范,这样RMAN才能在实际存在的位置执行还原操作。
2.3.3 备份位置为磁盘
在不同的服务器上执行还原操作的复杂性在于提供访问的不同服务器上备份的辅助通道进程功能。对于磁盘备份和磁带备份来说,我们都必须考虑这个问题。
如果要复制磁盘备份,我们的选择会受到限制。RMAN将对dbms_backup_restore数据包的调用传递给辅助实例上的通道进程,但是该操作没有考虑文件系统的差异。RMAN必须在目标数据库控制文件中记录实际位置和格式中查找备份片。如使用下面的命令在目标系统上执行完全备份操作:
Backup database format='/u01/backup/prod/%U';
执行这条命令会在/u01/backup/prod目录中创建一个备份片,并且在目标数据库控制文件中记录这个备份。在随后的复制操作期间,RMAN 会向辅助实例传递file restore命令,并且通知辅助实例从/u01/backup/prod中还原文件。 这就以为着在辅助实例上必须存在一个名为/u01的加载点和backup/prod目录,并且该目录下有目标数据库的备份片。如果不存在这些元素,复制操作就会失败。
有三种方法来复制磁盘备份:
第一种:将备份文件从目标主机复制到辅助主机的相同位置,该方法非常直观。但是这种方法要通过网络大量地传输文件。
第二种方法是从辅助主机中NFS加载(NFS-mount)目标主机上的备份位置。只有当加载目标的位置与RMAN将使用的加载点名称相同的情况下,才能执行复制操作。
如: mount cervantes:/u04/backup/prod /u04/backup/prod
如果是windows平台,我们加载的就是网络驱动器,而不是NFS,此时应用的规则是相同的:辅助主机与目标主机上的驱动器规范必须相同。因此,如果备份被写入F:/backup,就必须能够将F:用作网络驱动器,否则复制操作将会失败。此外,必须设置辅助服务(oracleserverSID)和监听程序服务(orcleOraHometnslistener), 并且具有读写权限的域管理员身份登陆辅助主机和目标主机。
第三中方法,修改备份位置。 Oracle 10g提供了2个命令:backup backupset命令和catalog backupset命令。使用backup backupset 命令可以备份磁盘上的前一个备份集,并且将其移动到不同的磁盘位置。 这就提供了很大的灵活性。我们可以将备份片从/u01/backup/prod移动到/u02/backup/prod,然后从辅助系统中NFS加载/u02/backup/prod. 还可以从目标主机NFS加载辅助主机上的一个驱动器,然后使用backup backupset命令将备份移动到辅助主机上。
Catalog backupset命令提供了重新定位新服务器上备份集的另一种简单方法。 为了使RMAN了解备份集所在的位置,只需要告诉RMAN对指定的文件或目录编写目录,它就会在该位置查找任何有效的备份并且为其生成元数据。
2.3.4 备份位置为磁带
将磁盘备份复制到远程服务器比将磁盘备份复制到远程服务器容易很多。因为磁带备份本身只有文件句柄而不具有文件位置。RMAN 只关心磁带备份的文件句柄,而介质管理器完全控制文件句柄与具体磁带位置的联系。因此复制磁带备份时采用的所有配置都来自于介质管理器的配置。
首先,必须在辅助站点上配置MML文件,这个配置与目标站点上的配置相同。由于辅助通道执行还原操作,它必须能够执行还原操作。
其次,必须确认正确地配置了介质管理服务器,也就是说必须在目标节点锁注册的同一个介质管理服务器中将辅助站点注册为一个客户端,并且辅助站点必须具有为了还原而能够访问磁带的必要权限。 最重要的是,必须支持辅助站点还原不同服务上生成的备份。由于能够安全地将一个客户端上的文件还原到另一个客户端是一个安全漏洞,大多数介质管理软件默认禁用这个功能。
最后一个配置步骤是设置辅助通道。RMAN在辅助实例上分配一个或多个通道来执行复制操作中的还原与恢复步骤。从RMAN连接到目标数据库时,可以使用configure命令配置这个通道。用于辅助通道的环境变量parms必须包含通常的MML环境控制变量,尤其需要指定生成备份的客户端。
2.4 复制和网络
在这里我们要解决2个问题,一个是口令文件,另一个就是监听程序。
如果使用远程连接,就必须为目标节点配置口令文件。还需要配置监听,监听使用专用的服务器进程,而不是共享的服务器进程。
在Oracle 10g中,如果只连接打开的数据库,就不需要listener.ora文件,这是因为数据库的PMON进程使用系统上运行的监听程序自动注册数据库。因此,即使在Oracle 10g的默认安装后没有任何配置操作,也能看见一个正在运行的,监听数据库的监听程序。
关于口令文件的一些说明:
在UNIX平台上,口令文件名必须为orapw<SID>, 其中SID 为实例名。口令文件存放在$ORACLE_HOME/dbs目录下。
在Windows平台上,口令文件名格式必须为pwd<SID>.ora。口令文件存在$ORACLE_HOME/database目录下。
我们在创建口令文件的时候,只要把文件创建到指定位置,oracle 就能自己识别。如:
UNIX: orapwd file=/u01/database/db_1/dbs/orapwORCL password=admin
WINDOWS: orapwd file=d:/database/db_1/database/pwdORCL.ora password=admin.
注意:1. 口令文件中的实例名区分大小写。
2. Init.ora中的 Remote_login_passwordfile 参数要设为excusive。
相关知识可以参考我的Blog:
Oracle 数据库监听配置
http://blog.csdn.net/tianlesoftware/archive/2009/11/25/4861572.aspx
Oracle OS认证 口令文件 密码丢失处理
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4698293.aspx
Oracle Listener 动态注册 与 静态注册
http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx