二、重命名副本数据库文件(Renaming Database Files in RMAN Duplicate Database)
1、创建过程中重命名控制文件
创建控制文件的语法与sql语句中的创建方法一致。如果手工选择控制文件名称的话,务必确认辅助实例的初始化参数中参数设置正确。
2、创建过程中重命名在线日志文件
有多种方式可以重命名在线日志文件,见下列诸条:
1). 执行duplicate命名时指定LOGFILE子句设置redo logs文件名。
2). 辅助实例初始化参数文件中设置LOG_FILE_NAME_CONVERT参数。该参数语法如下:
LOG_FILE_NAME_CONVERT = 'string1' , 'string2' , 'string3' , 'string4' , ...
将string1替换为string2,string3替换为string4,几乎无限组对。
3). 辅助实例中设置其它的初始化参数:DB_CREATE_FILE_DEST, DB_CREATE_ONLINE_DEST_n, or DB_RECOVERY_FILE_DEST。这些参数的作用类似于SQL语句:ALTER DATABASE ADD LOGFILE.
4). 如果副本数据库与目标库不在同一台机器上,并且副本数据库的在线日志文件路径与目标库相同,则运行duplicate命令时必须指定NOFILENAMECHECK参数以避免冲突提示。晕了吧,异机操作路径相同还必需指定NOFILENAMECHECK。此处oracle表现的很傻,它不知道你要恢复的路径是在另一台机器上,它只是认为要恢复到的路径怎么跟目标数据库表现的一样呢?会不会是要覆盖目标数据库啊,为了避免这种情形,于是它就报错。所以一旦异机恢复,并且路径相同,那么你必须通过指定NOFILENAMECHECK来避免oracle的自动识别。
提示:上述各方式是有优先级的,按照顺序序号最小的最先执行。如果你在操作过程中统统指定,则oracle会自动判断并以优先级最高的设置为准。
3、创建过程中重命名数据文件
这个方法也比较多:第三章第2节"不同路径结构的复制"时已经耗费了不少笔墨(o,是按键次数)并辅以各种脚本实例说明,什么,没看明白,拖出去关小黑屋反复杀死100遍。
4、跳过文件名检测NOFILENAMECHECK
这项操作主要是为了避免oracle错误的领会你的操作意图。
例如:
a库有两个数据文件:文件号1的文件f:\oracle\oradata\file1.dbf和文件号2的文件f:\oracle\oradata\file2.dbf,当你将其复制到另一台服务器的b库时:
RUN { SET NEWNAME FOR DATAFILE 1 TO f:\oracle\oradata\file2.dbf; SET NEWNAME FOR DATAFILE 2 TO f:\oracle\oradata\file1.dbf; DUPLICATE TARGET DATABASE TO newdb; }
执行上面的脚本oracle会报错。虽然你通过set newname命令已经将数据文件重命名,不会有文件名重复的问题,但是由于此项操作是异机的同路径复制,oracle会以为file1.dbf和file2.dbf仍在使用(目标库的确在使用,但oracle分不清你当前操作的已经不是同一台服务器)。于是oracle会提示报错信息,针对这种情况,你必须DUPLICATE TARGET DATABASE TO newdb NOFILENAMECHECK避免oracle的理解。
再与第2项中的第4小项结合理解,你就能完全掌握NOFILENAMECHECK的奥妙所在:)
5、创建过程中重命名临时文件
与重命名数据文件极其相似,不过如果希望通过SET NAME方式重命名临时文件路径的话,需要指明:SET NEWNAME FOR TEMPFILE,其它皆与之同,不详述。