Duplicating When Datafiles Use
Inconsistent Paths
CONNECT
TARGET /;
CONNECT
CATALOG rman/cat@catdb;
CONNECT
AUXILIARY SYS/oracle@dupdb;
# note
that a RUN command is necessary because you can only execute SET NEWNAME
#
within a RUN command
RUN
{
  # The DUPLICATE command uses an automatic sbt
channel.
  # Because the target datafiles are spread
across multiple directories, 
  # run SET NEWNAME rather than
DB_FILE_NAME_CONVERT
  SET NEWNAME FOR DATAFILE 1 TO
'/oradata1/system01.dbf'; 
  SET NEWNAME FOR DATAFILE 2 TO
'/oradata2/undotbs01.dbf'; 
  SET NEWNAME FOR DATAFILE 3 TO
'/oradata3/cwmlite01.dbf'; 
  SET NEWNAME FOR DATAFILE 4 TO
'/oradata4/drsys01'; 
  SET NEWNAME FOR DATAFILE 5 TO
'/oradata5/example01.dbf'; 
  SET NEWNAME FOR DATAFILE 6 TO
'/oradata6/indx01.dbf';
  # Do not set a newname for datafile 7,
because it is in the tools tablespace,
  # and you are excluding tools from the
duplicate database.
  SET NEWNAME FOR DATAFILE 8 TO
'/oradata7/users01.dbf'; 
  DUPLICATE TARGET DATABASE TO dupdb
    SKIP TABLESPACE tools
    LOGFILE
      GROUP 1 ('/duplogs/redo01a.log', 
               '/duplogs/redo01b.log') SIZE
200K REUSE, 
      GROUP 2 ('/duplogs/redo02a.log', 
               '/duplogs/redo02b.log') SIZE
200K REUSE;
}
RMAN DUPLICATE DATABASE
From File System to ASM: Example
This duplication example assumes the following:
- You
     are using recovery catalog database catdb.
 
- The
     target database trgt is on host1 and the database files are stored in a
     non-ASM file system.
 
- You
     want to duplicate the target to database dupdb on remote host host2.
 
- host2
     has diskgroup +DISK1.
 
- You
     want to store the datafiles for dupdb to +DISK1.
 
- You
     want to store two controlfiles in +DISK1.
 
- The
     backups and archivelogs created by host1 are accessible by host2.
 
Create an initialization parameter for auxiliary instance by copying the
target database initialization parameter file. Change the parameters as
follows:
- Set DB_NAME to the new
     database name dupdb
 
- Set CONTROL_FILES to store two
     copies of the control file in +DISK1
 
- Make
     sure DB_FILE_NAME_CONVERT and LOG_FILE_NAME_CONVERT are not set
 
- Set
     any other initialization parameters that end in _DEST, such as DB_CREATE_FILE_DEST and DB_CREATE_ONLINE_DEST_n, to reference +DISK1
 
For example:
DB_NAME=dupdb
CONTROL_FILES=+DISK1,+DISK1
Create an SPFILE from the parameter file, and start the auxiliary
instance:
SQL>
CONNECT AUXILIARY SYS/oracle@dupdb;
SQL>
CREATE SPFILE FROM PFILE=auxiliary instance pfile;
SQL>
STARTUP NOMOUNT;
Then run the following RMAN commands to duplicate the database:
RMAN>
CONNECT TARGET /;
RMAN>
CONNECT CATALOG rman/cat@catdb;
RMAN>
CONNECT AUXILIARY SYS/oracle@dupdb;
RMAN>
DUPLICATE TARGET DATABASE TO dupdb
      LOGFILE GROUP 1 ('+DISK1','+DISK1') SIZE
200K,
              GROUP 2 ('+DISK1','+DISK1') SIZE
200K;
RMAN DUPLICATE DATABASE From ASM to
ASM: Example
This duplication example assumes the following:
- You
     are using recovery catalog database catdb
 
- The
     target database trgt is on host1 and contains ASM datafiles and online
     logs in diskgroup +DISK1
 
- You
     want to duplicate the target to database dupdb on remote host host2.
 
- host2
     has diskgroup +DISK2
 
- You
     want to store the datafiles for dupdb to +DISK2
 
- You
     want to store two controlfiles in +DISK2
 
- The
     backups and archivelogs created by host1 are accessible by host2
 
Create an initialization parameter for auxiliary instance by copying the
target database initialization parameter file. Change the parameters as
follows:
- Set DB_NAME to the new
     database name dupdb
 
- Set CONTROL_FILES to store two
     copies of the control file in +DISK2
 
- Set DB_FILE_NAME_CONVERT and LOG_FILE_NAME_CONVERT to convert the
     datafile and online log file names from +DISK1 to +DISK2
 
- Set
     any other initialization parameters that end in _DEST, such as DB_CREATE_FILE_DEST and DB_CREATE_ONLINE_DEST_n, to reference +DISK2
 
For example:
DB_NAME=dupdb
CONTROL_FILES=+DISK2,+DISK2
DB_FILE_NAME_CONVERT=+DISK1,+DISK2
LOG_FILE_NAME_CONVERT=+DISK1,DISK2
Create an SPFILE from the parameter file, and start the auxiliary
instance:
SQL>
CONNECT AUXILIARY SYS/oracle@dupdb;
SQL>
CREATE SPFILE FROM PFILE=auxiliary instance pfile;
SQL>
STARTUP NOMOUNT;
Then run the following RMAN commands to duplicate the database:
RMAN>
CONNECT TARGET /;
RMAN>
CONNECT CATALOG rman/cat@catdb;
RMAN>
CONNECT AUXILIARY SYS/oracle@dupdb;
RMAN>
DUPLICATE TARGET DATABASE TO dupdb;
Steps
To Migrate a Database From Non-ASM to ASM
You can use these steps to migrate a NON-ASM database to ASM database in Oracle
11gR2.
Prerequisite - ASM instance should be created and up and running. Please
refer my previous article to create a ASM instance
1) Check the database version and status
   SQL> select INSTANCE_NAME,VERSION,DATABASE_STATUS from
v$instance;
    INSTANCE_NAME    VERSION        
  DATABASE_STATUS
    ---------------- ----------------- -----------------
    learndb          11.2.0.3.0  
     ACTIVE
2) We should be able to check the ASM disk available from the instance which we
created earlier
   SQL> select NAME,STATE,TOTAL_MB,PATH from v$asm_disk;
   NAME                
          STATE      TOTAL_MB PATH
   ------------------------------ -------- ---------- ----------
   DISK1                
         NORMAL         4777
ORCL:DISK1
Migrating the SPFILE from Non-asm to ASM
1) If you are using a spfile, take a backup of spfile using rman to restore it
to ASM disk
   RMAN>BACKUP AS BACKUPSET SPFILE;
2) Now shutdown the database and start it in Mount stage
   SQL> Shutdown immediate
   SQL> STARTUP MOUNT;
3) Now restore the spfile from the backup to ASM disk as below
  RMAN>RESTORE SPFILE TO '+DATA/spfilelearndb.ora';
4) You can see, still the parameter "spfile" is pointing to file
system instead of ASM disk
   SQL> show parameter spfile
    NAME                
                TYPE    
   VALUE
    ------------------------------------ -----------
------------------------------
    spfile                
              string    
 /opt/oracle/product/11.2.0/dbh
                     
                     
            ome_1/dbs/spfilelearndb.ora
5) Shutdowm the instance
    SQL> shutdown immediate
6) Delete "spfile.ora and init.ora from the
$ORACLE_HOME/dbs directory and create a new init.ora with the
following line of content and start the instance,
    vi initlearndb.ora
   SPFILE='+DATA/spfilelearndb.ora'
   SQL> Startup (  first it will search for spfile.ora
which we deleted and next it will look for    
 init.ora which we have moified with the above content  )
   SQL> show parameter spfile
    NAME                
                TYPE    
   VALUE
   ------------------------------------ -----------
------------------------------
   spfile                
              string    
 +DATA/spfilelearndb.ora
Migrating Control files from Non-ASM to ASM
1) These are the current control files in non-asm
SQL>show parameter contol_files
         control_files        
               string    
 /u01/data/learndb/control01.ctl,
                     
                     
                   
 /u01/data/learndb/control02.ctl
2) Start the instance in nomount state
SQL> startup nomount
3) You can move these control files to ASM using
RMAN
    [oracle@coltdb04 ~]$ rman target /
    Recovery Manager: Release 11.2.0.3.0 - Production on Fri Jun 29
03:04:39 2012
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All
rights reserved.
    connected to target database: LEARNDB (not mounted)
    RMAN>restore controlfile to '+DATA' from
'/u01/data/learndb/control01.ctl';
4) You can check whether the control file are created
   ASMCMD> find -t CONTROLFILE +DATA *
   WARNING:option 't' is deprecated for 'find'
   please use 'type'
   +DATA/LEARNDB/CONTROLFILE/current.256.787200593
5) Update the spfile with new control file location
   SQL> alter system set
control_files='+DATA/LEARNDB/CONTROLFILE/current.256.787200593' scope=spfile;
6) Now shutdown the instance and startup in mount stage and check for the
control file location
   SQL> shutdown immediate
   SQL> startup mount
   SQL> show parameter control_files
       NAME            
                    TYPE
       VALUE
     ------------------------------------ -----------
------------------------------
     control_files            
           string    
 +DATA/learndb/controlfile/curr
                     
                     
          ent.256.787200593
Migrating the Datafiles from Non-ASM to ASM
1) Keep the database is in mount stage
2) Use RMAN "BACKUP AS COPY" method to migrate the datafiles from
filesystem to ASM
   [oracle@coltdb04 ~]$ rman target /
   Recovery Manager: Release 11.2.0.3.0 - Production on Fri Jun 29
03:00:40 2012
   Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All
rights reserved.
   connected to target database: LEARNDB (DBID=3704858930, not open)
                     
                   
   RMAN> BACKUP AS COPY DATABASE FORMAT '+DATA';
3)  Switch the database to the copy created using the following RMAN
command
   RMAN> SWITCH DATABASE TO COPY;
   datafile 1 switched to datafile copy
"+DATA/learndb/datafile/system.258.787201633"
   datafile 2 switched to datafile copy "+DATA/learndb/datafile/sysaux.257.787201553"
   datafile 3 switched to datafile copy
"+DATA/learndb/datafile/undotbs1.259.787201713"
   datafile 4 switched to datafile copy
"+DATA/learndb/datafile/users.261.787201725"
4) Migrate the tempfile to ASM using RMAN
   RMAN> run
   2> {
   3> set newname for tempfile '/u01/data/learndb/temp01.dbf'
to '+DATA';
   4> switch tempfile all;
   5> }
   executing command: SET NEWNAME
   using target database control file instead of recovery catalog
   renamed tempfile 1 to +DATA in control file
5) Now open the Database
   RMAN> ALTER DATABASE OPEN;
   database opened
6) You can now check the datafiles created in ASM
   SQL> select FILE_NAME from dba_data_files;
   FILE_NAME
   --------------------------------------------------------------------------------
   +DATA/learndb/datafile/users.261.787201725
   +DATA/learndb/datafile/undotbs1.259.787201713
   +DATA/learndb/datafile/sysaux.257.787201553
   +DATA/learndb/datafile/system.258.787201633
Migrating the Redo log files from Non-ASM to ASM
1) Identify the currently available redo log
files using the following command
   SQL> SELECT a.group#, b.member, a.status FROM v$log a,
v$logfile b WHERE a.group#=b.group#;
    GROUP#           MEMBER    
           STATUS
   ----------       ---------      
       -----------
        3    /u01/data/learndb/redo03.log
INACTIVE
        2    /u01/data/learndb/redo02.log CURRENT
        1    /u01/data/learndb/redo01.log
INACTIVE
2) Add the new logfiles to ASM using following command
   ALTER DATABASE ADD LOGFILE MEMBER '+DATA' TO GROUP 1; 
   ALTER DATABASE ADD LOGFILE MEMBER '+DATA' TO GROUP 2;
   ALTER DATABASE ADD LOGFILE MEMBER '+DATA' TO GROUP 3;
3) Now drop the old logfiles, A redo log member can only be dropped after being
archived and being in INACTIVE mode. If needed, switch logfile multiple times
until the logfile is ready for dropping.
   ALTER DATABASE DROP LOGFILE MEMBER '/u01/data/learndb/redo01.log';
   ALTER SYSTEM SWITCH LOGFILE;
   ALTER DATABASE DROP LOGFILE MEMBER '/u01/data/learndb/redo02.log';
   ALTER SYSTEM SWITCH LOGFILE;
   ALTER DATABASE DROP LOGFILE MEMBER '/u01/data/learndb/redo03.log';
4) You can check the logfiles created now in ASM
     GROUP#           MEMBER  
             STATUS
   ----------       ---------      
       -----------
         1  
 +DATA/learndb/onlinelog/group_1.264.787205393   CURRENT
         2  
 +DATA/learndb/onlinelog/group_2.265.787205405   INACTIVE
         3  
 +DATA/learndb/onlinelog/group_3.266.787205417   INACTIVE