需求:
在生产环境中,我们可能需要导入相同的多份数据库,如果每次都DBCA建完库后,再IMP将之前EXP的DUMP文件导入,数据量小还好,数据量大的话,会很浪费时间。
STREAMS也是一种方式,但是我们现在的这个库是“静态”的,意思就是说是直接将“冷”的DUMP文件导入,其间并没有新的用户数据的插入,STREAMS的实时的更新数据就没有用到,我们只是为了导库这件事而已。
还有一种方法是,DBCA完并导完数据后,SHUTDOWNIMMEDIATE,将一份冷备的数据库文件(还有日志文件)复制到另一个地方,WINDOWS的话先注册一下“服务”,用之前备份的控制文件脚本重新创建新库的控制文件,改名字,最后开库时RESETLOGS。
现在介绍一下,RMAN DUPLICATE方法,挺有意思的。仅仅是写出来,用我的语言,网上的,官方的文档有很多,本篇仅供参考。
1. 因为数据库处于NOARCHIVELOG(导库前一般都是置为此模式,因为导库时会产生大量的日志,会占空间,要开归档的话,一般是导完再开),而DUPLICATE需要有一份有效的备份,而NOARCHIVELOG是无法热备的,所以启动到MOUNT状态,所谓的RMAN的“冷备”。
SQL> startupmount
ORACLE 例程已经启动。
Total SystemGlobal Area 131145280 bytes
Fixed Size 454208 bytes
Variable Size 104857600 bytes
DatabaseBuffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
C:\Documents andSettings\Administrator>set ORACLE_SID=orcl
C:\Documents andSettings\Administrator>rman target /
RMAN> backupdatabase;
启动 backup 于 04-5月 -11
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件 fno=00002name=C:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件 fno=00005name=C:\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF
输入数据文件 fno=00010name=C:\ORACLE\ORADATA\ORCL\XDB01.DBF
输入数据文件 fno=00006name=C:\ORACLE\ORADATA\ORCL\INDX01.DBF
输入数据文件 fno=00009 name=C:\ORACLE\ORADATA\ORCL\USERS01.DBF
输入数据文件 fno=00003name=C:\ORACLE\ORADATA\ORCL\CWMLITE01.DBF
输入数据文件 fno=00004name=C:\ORACLE\ORADATA\ORCL\DRSYS01.DBF
输入数据文件 fno=00007name=C:\ORACLE\ORADATA\ORCL\ODM01.DBF
输入数据文件 fno=00008 name=C:\ORACLE\ORADATA\ORCL\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 04-5月 -11
2. 创建PFILE文件,作为DUPLICATE库的PFILE文件,当然,要做相应的修改。
SQL> createpfile='C:\oracle\pfileorcl.ora' from spfile;
文件已创建。
修改的参数如下:(相应的目录要事先创建出来)
*.background_dump_dest='C:\oracle\admin\orcl\bdump'
*.control_files='C:\oracle\oradata\orcldup\CONTROL01.CTL','C:\oracle\oradata\orcldup\CONTROL02.CTL','C:\oracle\oradata\orcldup\CONTROL03.CTL'
*.core_dump_dest='C:\oracle\admin\orcldup\cdump'
*.instance_name='orcldup'
*.db_name='orcldup'
*.user_dump_dest='C:\oracle\admin\orcldup\udump'
*.log_file_name_convert=(‘C:\oracle\oradata\orcl’,’C:\oracle\oradata\orcldup’)
*.db_file_name_convert=(‘C:\oracle\oradata\orcl’,’C:\oracle\oradata\orcldup’)
3. 创建密码参数文件
C:\Documents andSettings\Administrator>cd C:\oracle\ora92\database
C:\oracle\ora92\database>orapwdfile=PWDorcldup.ora password=oracle entries=3
4. 然后,接下来这一步,WINDOWS会稍微复杂点,需要注册“服务”,将orcldup这个我们想用的实例名注册进去。
C:\oracle\ora92\database>oradim-new -sid orcldup -startmode manual
C:\oracle\ora92\database>oradim-edit -sid orcldup -startmode auto -pfile 'C:\oracle\pfileorcldup.ora'
C:\oracle\ora92\database>setORACLE_SID=orcldup
C:\oracle\ora92\database>sqlplus/nolog
SQL*Plus: Release9.2.0.8.0 - Production on 星期三 5月 423:26:21 2011
Copyright (c)1982, 2002, Oracle Corporation. Allrights reserved.
SQL> conn /assysdba
已连接到空闲例程。
SQL> startupnomount pfile='C:\oracle\pfileorcldup.ora'
ORACLE 例程已经启动。
Total SystemGlobal Area 131145280 bytes
Fixed Size 454208 bytes
Variable Size 104857600 bytes
DatabaseBuffers 25165824 bytes
Redo Buffers 667648 bytes
5. 确认可以连接到DUPLICATE的数据库。NETMGR那要配置一下,不然就自己TNSNAMES.ORA那自己写一个。
ORCLDUP =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =epgis-wx8qtt0jz)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcldup)
)
)
在LISTENER.ORA中的SID_LIST_LISTENER
加入下面这一行
(SID_DESC =
(GLOBAL_DBNAME = orcldup)
(ORACLE_HOME = C:\oracle\ora92)
(SID_NAME = orcldup)
)
也就是把它注册进监听程序中
6. 开始DUPLICATE,需要设置好环境变量
很神奇的地方,WINDOWS设置这个变量不用加“‘”
C:\Documents andSettings\Administrator>set ORACLE_SID=orcl
C:\Documents andSettings\Administrator>set NLS_DATE_FORMAT=yyyy-mm-dd:hh24:mi:ss
7. 连接本地控制文件与远程的AUXILIARY库(也就是DUPLICATE的库)
C:\Documents andSettings\Administrator>rman target / auxiliary system/oracle@or
cldup
恢复管理器: 版本9.2.0.8.0- Production
Copyright (c)1995, 2002, Oracle Corporation. Allrights reserved.
连接到目标数据库: ORCL (DBID=1270884215)
已连接到备用数据库: orcldup (未安装)
RMAN> listbackup;
正在使用目标数据库控制文件替代恢复目录
备份集列表
===================
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- ------------ ----------- ------------ -------------------
1 Full 7G DISK 00:08:25 2011-05-04:22:46:50
BP 关键字: 1 状态: AVAILABLE 标记:TAG20110504T223825
段名:C:\ORACLE\ORA92\DATABASE\02MBH3N1_1_1
包含的 SPFILE:修改时间: 2011-04-01:14:57:52
备份集 1 中的数据文件列表
文件 LV 类型 Ckp SCN Ckp 时间 名称
---- -- ---- ---------- -----------------------
1 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\SYSTEM01.DB
F
2 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\UNDOTBS01.D
BF
3 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\CWMLITE01.D
BF
4 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\DRSYS01.DBF
5 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\EXAMPLE01.D
BF
6 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\INDX01.DBF
7 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\ODM01.DBF
8 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\TOOLS01.DBF
9 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\USERS01.DBF
10 Full 2702759 2011-05-04:22:33:19 C:\ORACLE\ORADATA\ORCL\XDB01.DBF
RMAN> run {
2> set untiltime '2011-05-04:22:33:19';
3> duplicatetarget database to orcldup;
4> }
正在执行命令: SET until clause
启动 Duplicate Db 于 2011-05-05:00:18:22
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: sid=14 devtype=DISK
RMAN-00571:===========================================================
RMAN-00569:=============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571:===========================================================
RMAN-03002:failure of Duplicate Db command at 05/05/2011 00:18:22
RMAN-05501:aborting duplication of target database
RMAN-05001:auxiliary filename C:\ORACLE\ORADATA\ORCL\XDB01.DBF conflicts with a
file used by the target database
RMAN-05001:auxiliary filename C:\ORACLE\ORADATA\ORCL\USERS01.DBF conflicts with
a file used by the target database
报错了
改为如下
RMAN> run {
2> set untiltime '2011-05-04:22:33:19';
3>allocate auxiliarychannel c1 device type disk;
4> duplicatetarget database to orcldup nofilenamecheck;
5> }
正在执行命令: SET until clause
启动 Duplicate Db 于 2011-05-05:00:23:02
使用通道 ORA_AUX_DISK_1
正在打印存储的脚本: Memory Script
….(开始执行了,感觉DUPLICATE这个功能很强大,感觉强大之余,其实它的本质也不过是重建控制文件,拷回数据文件,再RESETLOGS打开数据库而已)
Make sure to use auxiliary type of channel so RMANrestore take place at auxiliary database.
nofilenamecheckclause instructs rman not to check whether target database file names share thesame name as auxiliary database
(友情提示:在LOG_FILE_NAME_CONVERT与DB_FILE_NAME_CONVERT上要注意标点符号,“‘”要写,不然后面再DUPLICATE时会不成功)
这样才是成功的
启动 restore 于2011-05-05:00:42:27
通道 c1: 正在开始恢复数据文件备份集
通道 c1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到C:\ORACLE\ORADATA\ORCLDUP\SYSTEM01.DBF
正将数据文件00002恢复到C:\ORACLE\ORADATA\ORCLDUP\UNDOTBS01.DBF
正将数据文件00003恢复到C:\ORACLE\ORADATA\ORCLDUP\CWMLITE01.DBF
正将数据文件00004恢复到C:\ORACLE\ORADATA\ORCLDUP\DRSYS01.DBF
正将数据文件00005恢复到C:\ORACLE\ORADATA\ORCLDUP\EXAMPLE01.DBF
正将数据文件00006恢复到C:\ORACLE\ORADATA\ORCLDUP\INDX01.DBF
正将数据文件00007恢复到C:\ORACLE\ORADATA\ORCLDUP\ODM01.DBF
正将数据文件00008恢复到C:\ORACLE\ORADATA\ORCLDUP\TOOLS01.DBF
正将数据文件00009恢复到C:\ORACLE\ORADATA\ORCLDUP\USERS01.DBF
正将数据文件00010恢复到C:\ORACLE\ORADATA\ORCLDUP\XDB01.DBF
(你看它的整个恢复的过程,其实就是类似常规的备份恢复)
但是,报错了
正在执行脚本: Memory Script
RMAN-00571:===========================================================
RMAN-00569:=============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571:===========================================================
RMAN-03002:failure of Duplicate Db command at 05/05/2011 02:02:43
RMAN-03015: erroroccurred in stored script Memory Script
RMAN-06136: ORACLEerror from auxiliary database: ORA-01013: 用户请求取消当前的
操作
查了一下ALERT日志 发现后台大量的
Restarting deadbackground process QMN0
QMN0 started withpid=15, OS id=2128
上网搜了一下
我做出了如下的修改,改动PFILEORCLDUP.ORA
*.aq_tm_processes=0
这个主要是与STREAMS的队列相关的参数,也许是BUG,谁知道呢,反正我们做的不是STREAMS,把它禁掉也没问题。
重新从STARTUP NOMOUNT PFILE=’c:\oracle\pfileorcldup.ora’开始执行。
后来,发现还是出现了上面的错误,本来觉得实验失败了,准备关掉虚拟机了,但是好奇心使我尝试看了一下,我做了下面的事情:
C:\Documents andSettings\Administrator>set ORACLE_SID=orcldup
C:\Documents andSettings\Administrator>sqlplus /nolog
Copyright (c)1982, 2002, Oracle Corporation. Allrights reserved.
SQL> conn /assysdba
已连接。
SQL> selectopen_mode from v$database;
OPEN_MODE
----------
MOUNTED
看来MOUNTED是成功了,控制文件已经起来了,不甘心,还是想尝试RESETLOS一下,我会这么想不是我仅仅是想尝试,而是看截图:
控制文件是被DUPLICATE重建的,DATAFILE与REDOFILE是拷过来的,它们时间戳是22:40分,是因为我正是在那时RESETLOGS的。
SQL> alterdatabase open resetlogs;
数据库已更改。
SQL> showparameter ins
NAME TYPE VALUE
----------------------------------------------- ----------------------------
active_instance_count integer
cluster_database_instances integer 1
instance_groups string
instance_name string orcldup
instance_number integer 0
open_links_per_instance integer 4
parallel_instance_group string
parallel_server_instances integer 1
SQL> selectopen_mode from v$database;
OPEN_MODE
----------
READ WRITE
OK了,我不知道是BUG还是什么的原因,DUPLICATE它没有帮我RESETLOGS成功,而是靠我的手工,也许是需要较大的内存而我做实验是在虚拟机中,它自己崩掉了,也许是BUG,总之手工RESETLOGS后DUPLICATE实验也算是成功了。这个实验,我曾经一度想放弃了,因为我查了METALINK,查了文档,没觉得实验有什么不对的地方,也许这就是大师们所说的差一点点吧。