万变不离其宗 duplicate database 也是一个备份与恢复的过程。网上有
RAMN用于迁移数据库也是这个道理。duplicate database有一个优点,它为duplicated
database生成了新的DBID。

metalink`ID 388431`.`1`给出了duplicate database的大致步骤:
 1. Backup of the primary database.
 2. Determine how much disk space will be required.
 3. Ensuring you have enough space on your target server.
 4. Making the backup available for the duplicate process.
 5. Creating the init.ora & administration directories for the duplicate database.
 6. Ensuring SQL*NET connections to primary database and RMAN catalog are working.
 7. Prepare RMAN duplicate script.
 8. Execute the RMAN script.

 1. 因为duplicate database 是一个备份与恢复的过程,备份是必须的。当然也要备份归档日志.
    简单脚本如下:
   run {
        allocate channel dup type disk;
        backup format '/opt/guo/backup/df_t%t_s%s_p%p' database;
        sql 'alter system archive log current';
        backup format '/opt/guo/backup/al_t%t_s%s_p%p' archivelog all;
        release channel dup;
   }
  在primary database上执行:
  Rman target / cmdfile=/opt/guo/dup.rmv
  生成了数据文悠件备份,controlfile+spfile备份(这个不需要,因为我们备份了datafile 1,
  所以RMAN自动备份了controlfile+spfile),归档日志备份.
 
 2,3 两步是确认the duplicate database数据库的空间是否足够. 脚本类似如下:
 
   select DF.TOTAL/1048576 "DataFile Size Mb",
            LOG.TOTAL/1048576 "Redo Log Size Mb",
            CONTROL.TOTAL/1048576 "Control File Size Mb",
            (DF.TOTAL + LOG.TOTAL + CONTROL.TOTAL)/1048576 "Total Size Mb"
     from dual,
    (select sum(a.bytes) TOTAL from dba_data_files a) DF,
    (select sum(b.bytes) TOTAL from v$log b) LOG,
    (select sum((cffsz+1)*cfbsz) TOTAL from x$kcccf c) CONTROL

4. Making the backup available for the duplicate process,the duplicate process
   我们要把数据备份,包括归档备份拷到新主机的相同目录上,使得duplicate process进程
   可以访问得到. 我想过用catalog命令修改备份集的路径,但duplicate数据库此时还没有
   控制文件, 所以行不通,只能拷贝到相同路径上。
   如:scp -r root@192.168.0.106:/opt/guo/backup /opt/guo/backup

5. 为duplicate数据库创建init.ora文件,以及相应的目录.启动duplicate数据库到nomout状态。
   duplicate命令需要duplicate数据库处于nomount状态。
   SQL>create spfile from pfile='init.ora'
   SQL>startup nomount

6. 确认两台主机SQL.net是畅通的. duplicate  target database 可以任何一台可以SQL.net到
   目标主机与新主机的主机上执行。
   D:>sqlplus sys/system@primary

7. 创建duplicate script如下:
   duplicate target database to guoprima nofilenamecheck;
   因为target数据库与duplicate数据库的目录结构是一样的,虽然他们位于不同的主机. 所以
   加nofilenamecheck参数,去除Data文件检查,否则会报ora-050001错误。我们也可以用init.ora文件中添加
   db_file_name_convert,log_file_name_convert参数更改duplicate数据库的目录结构.oracle
   document 有详细的描述

8. 执行复制.
   D:>rman target sys/system@primary;
   rman> connect auxiliary /
   rman>duplicate target database to guoprima nofilenamecheck;
   即完成了数据库的复制。