Table of Contents

Overview

The migration from ASM ↔ FS is usually easy process if you know how to do it :), what is important to be moved are:

Mandatory files:

Optional Files (but good to migrate as well):

Although, the optional files you can always migrate, without restarting/shutting down the server.

Datafiles

Datafiles migration can be done very easily using the “Backup as copy” feature of RMAN as follows:

P.S. That can be done both in Open(Assuming you are in Archivelog mode) and Mount state

[oracle@Servername datafiles]$ rman target /

Recovery Manager: Release 12.2.0.1.0 - Production on Mon Jul 16 13:33:05 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

connected to target database: RCAT (DBID=DBIDNUM, not open)

RMAN> RUN
{
ALLOCATE CHANNEL disk1 DEVICE TYPE DISK FORMAT '/app/data/RCAT/datafiles/%U';
BACKUP AS COPY DATABASE;
release channel disk1;
} 2> 3> 4> 5> 6>

released channel: ORA_DISK_1
allocated channel: disk1
channel disk1: SID=18 device type=DISK

Starting backup at 16-JUL-18
channel disk1: starting datafile copy
input datafile file number=00005 name=+RCATDATA/RCAT/DATAFILE/rman_data.266.952702327
output file name=/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-RMAN_DATA_FNO-5_7jt8581f tag=TAG20180716T133335 RECID=7 STAMP=981639222
channel disk1: datafile copy complete, elapsed time: 00:00:15
channel disk1: starting datafile copy
input datafile file number=00003 name=+RCATDATA/RCAT/DATAFILE/sysaux.257.952360417
output file name=/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-3_7kt8581u tag=TAG20180716T133335 RECID=8 STAMP=981639238
channel disk1: datafile copy complete, elapsed time: 00:00:15
channel disk1: starting datafile copy
input datafile file number=00001 name=+RCATDATA/RCAT/DATAFILE/system.256.952360373
output file name=/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSTEM_FNO-1_7lt8582d tag=TAG20180716T133335 RECID=9 STAMP=981639252
channel disk1: datafile copy complete, elapsed time: 00:00:07
channel disk1: starting datafile copy
input datafile file number=00002 name=/app/data/rcat/datafiles/sysaux_dbf02.dbf
output file name=/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-2_7mt8582k tag=TAG20180716T133335 RECID=10 STAMP=981639254
channel disk1: datafile copy complete, elapsed time: 00:00:03
channel disk1: starting datafile copy
input datafile file number=00004 name=+RCATDATA/RCAT/DATAFILE/undotbs1.258.952360443
output file name=/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-UNDOTBS1_FNO-4_7nt8582n tag=TAG20180716T133335 RECID=11 STAMP=981639256
channel disk1: datafile copy complete, elapsed time: 00:00:01
channel disk1: starting datafile copy
input datafile file number=00007 name=+RCATDATA/RCAT/DATAFILE/users.259.952360445
output file name=/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-USERS_FNO-7_7ot8582p tag=TAG20180716T133335 RECID=12 STAMP=981639257
channel disk1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 16-JUL-18

Starting Control File and SPFILE Autobackup at 16-JUL-18
piece handle=+RCATFRA/RCAT/AUTOBACKUP/2018_07_16/s_981639073.262.981639259 comment=NONE
Finished Control File and SPFILE Autobackup at 16-JUL-18

released channel: disk1

Once the backup of the database files has been done, we can switch to copy (that should be done in Mount)

RMAN> switch database to copy;

datafile 1 switched to datafile copy "/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSTEM_FNO-1_7lt8582d"
datafile 2 switched to datafile copy "/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-2_7mt8582k"
datafile 3 switched to datafile copy "/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-3_7kt8581u"
datafile 4 switched to datafile copy "/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-UNDOTBS1_FNO-4_7nt8582n"
datafile 5 switched to datafile copy "/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-RMAN_DATA_FNO-5_7jt8581f"
datafile 7 switched to datafile copy "/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-USERS_FNO-7_7ot8582p"

RMAN>

Recovery Manager complete.

Once we are switched, we can startup our DB.

P.S. If you have done the backup in Open mode you have to recover the copy.

[oracle@servername datafiles]$
[oracle@servername datafiles]$ sqlplus

SQL*Plus: Release 12.2.0.1.0 Production on Mon Jul 16 13:34:37 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> SET        LINES   132
COL     name                                                                                                    FORM    a60
COL     status                                                                                  FORM    A8
COL     file#                                                                                           FORM    9999
COL     control_file_SCN        FORM    999999999999999
COL     datafile_SCN                                    FORM    999999999999999
SELECT
a.name
,a.status
,a.file#
,a.checkpoint_change#   control_file_SCN
,b.checkpoint_change#   datafile_SCN
,CASE
                WHEN    ((a.checkpoint_change#  -       b.checkpoint_change#)   =       0)      THEN 'Startup   Normal'
                WHEN    ((b.checkpoint_change#) =       0)      THEN 'File      Missing?'
                WHEN    ((a.checkpoint_change#  -       b.checkpoint_change#)   >       0)      THEN 'Media     Rec.    Req.'
                WHEN    ((a.checkpoint_change#  -       b.checkpoint_change#)   <       0)      THEN 'Old Control       File' ELSE      'what   the     ?'
        END     datafile_status
FROM    v$datafile a    --      control file    SCN     for     datafile
                ,v$datafile_header      b       --      datafile        header  SCN
WHERE   a.file# =       b.file#
ORDER   BY      a.file#;SQL> SQL> SQL> SQL> SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16

NAME                                                         STATUS   FILE# CONTROL_FILE_SCN     DATAFILE_SCN DATAFILE_STATUS
------------------------------------------------------------ -------- ----- ---------------- ---------------- ----------------
/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSTEM_F SYSTEM       1         39317158         39317158 Startup   Normal
NO-1_7lt8582d

/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_F ONLINE       2         39317158         39317158 Startup   Normal
NO-2_7mt8582k

/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_F ONLINE       3         39317158         39317158 Startup   Normal
NO-3_7kt8581u

/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-UNDOTBS1 ONLINE       4         39317158         39317158 Startup   Normal
_FNO-4_7nt8582n

NAME                                                         STATUS   FILE# CONTROL_FILE_SCN     DATAFILE_SCN DATAFILE_STATUS
------------------------------------------------------------ -------- ----- ---------------- ---------------- ----------------

/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-RMAN_DAT ONLINE       5         39317158         39317158 Startup   Normal
A_FNO-5_7jt8581f

/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-USERS_FN ONLINE       7         39317158         39317158 Startup   Normal
O-7_7ot8582p


6 rows selected.


SQL> alter database open;

Database altered.

SQL> alter tablespace TEMP add tempfile '/app/data/RCAT/datafiles/temp01.dbf' size 100M;
Tablespace altered.
SQL>

After that, we can continue with the redo log files :)

Redo log files

Unlike the database files, the relocation of the redolog files, we can do completely online :) as follows:

First it is important to get two things:

Then it is just adding new group and dropping a group, remember we can drop only INACTIVE groups :)

SQL> /

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         1          1       6556  209715200        512          2 YES INACTIVE              39311679 16-JUL-18     39314368 16-JUL-18          0
         2          1       6557  209715200        512          2 NO  CURRENT               39314368 16-JUL-18   1.8447E+19                    0
         3          1       6555  209715200        512          2 YES INACTIVE              39309094 16-JUL-18     39311679 16-JUL-18          0

SQL> select bytes/1024/1024 from v$log;

BYTES/1024/1024
---------------
            200
            200
            200

SQL> alter database add logfile group 4 ('/app/data/RCAT/archivelogs/log4a.rdo','/app/data/RCAT/archivelogs/log4b') size 200M;^C

SQL>
SQL> alter database add logfile group 4 ('/app/data/RCAT/redologs/log4a.rdo','/app/data/RCAT/redologs/log4b') size 200M;
alter database add logfile group 5 ('/app/data/RCAT/redologs/log5a.rdo','/app/data/RCAT/redologs/log5b') size 200M;
alter database add logfile group 6 ('/app/data/RCAT/redologs/log6a.rdo','/app/data/RCAT/redologs/log6b') size 200M;

Database altered.

SQL>




Database altered.

SQL>




Database altered.

SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL>
SQL>
SQL>
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         1          1       6556  209715200        512          2 YES INACTIVE              39311679 16-JUL-18     39314368 16-JUL-18          0
         2          1       6557  209715200        512          2 NO  CURRENT               39314368 16-JUL-18   1.8447E+19                    0
         3          1       6555  209715200        512          2 YES INACTIVE              39309094 16-JUL-18     39311679 16-JUL-18          0
         4          1          0  209715200        512          2 YES UNUSED                       0                      0                    0
         5          1          0  209715200        512          2 YES UNUSED                       0                      0                    0
         6          1          0  209715200        512          2 YES UNUSED                       0                      0                    0

6 rows selected.

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL>  select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         1          1       6556  209715200        512          2 YES INACTIVE              39311679 16-JUL-18     39314368 16-JUL-18          0
         2          1       6557  209715200        512          2 YES ACTIVE                39314368 16-JUL-18     39318488 16-JUL-18          0
         3          1       6555  209715200        512          2 YES INACTIVE              39309094 16-JUL-18     39311679 16-JUL-18          0
         4          1       6558  209715200        512          2 YES ACTIVE                39318488 16-JUL-18     39318491 16-JUL-18          0
         5          1       6559  209715200        512          2 NO  CURRENT               39318491 16-JUL-18   1.8447E+19                    0
         6          1          0  209715200        512          2 YES UNUSED                       0                      0                    0

6 rows selected.

SQL> alter database drop logfile group 1;

Database altered.

SQL>  select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         2          1       6557  209715200        512          2 YES ACTIVE                39314368 16-JUL-18     39318488 16-JUL-18          0
         3          1       6555  209715200        512          2 YES INACTIVE              39309094 16-JUL-18     39311679 16-JUL-18          0
         4          1       6558  209715200        512          2 YES ACTIVE                39318488 16-JUL-18     39318491 16-JUL-18          0
         5          1       6559  209715200        512          2 NO  CURRENT               39318491 16-JUL-18   1.8447E+19                    0
         6          1          0  209715200        512          2 YES UNUSED                       0                      0                    0

SQL> alter database drop logfile group 3;

Database altered.

SQL>  alter system switch logfile;

System altered.

SQL>  select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         2          1       6557  209715200        512          2 YES ACTIVE                39314368 16-JUL-18     39318488 16-JUL-18          0
         4          1       6558  209715200        512          2 YES ACTIVE                39318488 16-JUL-18     39318491 16-JUL-18          0
         5          1       6559  209715200        512          2 YES ACTIVE                39318491 16-JUL-18     39318536 16-JUL-18          0
         6          1       6560  209715200        512          2 NO  CURRENT               39318536 16-JUL-18   1.8447E+19                    0

SQL>  alter system switch logfile;

System altered.

SQL>   select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         2          1       6561  209715200        512          2 NO  CURRENT               39318543 16-JUL-18   1.8447E+19                    0
         4          1       6558  209715200        512          2 YES INACTIVE              39318488 16-JUL-18     39318491 16-JUL-18          0
         5          1       6559  209715200        512          2 YES ACTIVE                39318491 16-JUL-18     39318536 16-JUL-18          0
         6          1       6560  209715200        512          2 YES ACTIVE                39318536 16-JUL-18     39318543 16-JUL-18          0

SQL>  alter system switch logfile;

System altered.

SQL>  select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         2          1       6561  209715200        512          2 YES ACTIVE                39318543 16-JUL-18     39318550 16-JUL-18          0
         4          1       6562  209715200        512          2 NO  CURRENT               39318550 16-JUL-18   1.8447E+19                    0
         5          1       6559  209715200        512          2 YES ACTIVE                39318491 16-JUL-18     39318536 16-JUL-18          0
         6          1       6560  209715200        512          2 YES ACTIVE                39318536 16-JUL-18     39318543 16-JUL-18          0

SQL>  alter system switch logfile;

System altered.

SQL>  select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         2          1       6561  209715200        512          2 YES INACTIVE              39318543 16-JUL-18     39318550 16-JUL-18          0
         4          1       6562  209715200        512          2 YES INACTIVE              39318550 16-JUL-18     39318554 16-JUL-18          0
         5          1       6563  209715200        512          2 NO  CURRENT               39318554 16-JUL-18   1.8447E+19                    0
         6          1       6560  209715200        512          2 YES INACTIVE              39318536 16-JUL-18     39318543 16-JUL-18          0

SQL>  alter database drop logfile group 2;

Database altered.

SQL>   select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         4          1       6562  209715200        512          2 YES INACTIVE              39318550 16-JUL-18     39318554 16-JUL-18          0
         5          1       6563  209715200        512          2 NO  CURRENT               39318554 16-JUL-18   1.8447E+19                    0
         6          1       6560  209715200        512          2 YES INACTIVE              39318536 16-JUL-18     39318543 16-JUL-18          0

SQL>

Controlfiles

Finally we have to re-create the controlfiles, we need to restart the database in order to do that. First we have to do a text backup of the controlfile:

[oracle@Naos controlfiles]$ sqlplus

SQL*Plus: Release 12.2.0.1.0 Production on Mon Jul 16 14:40:08 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> alter database backup controlfile to trace as '/app/data/RCAT/controlfiles/bkpctrl.sh' ;

Database altered.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

We have to edit the controlfile after that, in order to use only the part which we need: Your controlfile should have ONLY the entries which you need.

[oracle@Naos controlfiles]$ cat bkpctrl.sh

CREATE CONTROLFILE REUSE DATABASE "RCAT" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 4 (
    '/app/data/RCAT/redologs/log4a.rdo',
    '/app/data/RCAT/redologs/log4b'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 5 (
    '/app/data/RCAT/redologs/log5a.rdo',
    '/app/data/RCAT/redologs/log5b'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 6 (
    '/app/data/RCAT/redologs/log6a.rdo',
    '/app/data/RCAT/redologs/log6b'
  ) SIZE 200M BLOCKSIZE 512
DATAFILE
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSTEM_FNO-1_7lt8582d',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-2_7mt8582k',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-3_7kt8581u',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-UNDOTBS1_FNO-4_7nt8582n',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-RMAN_DATA_FNO-5_7jt8581f',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-USERS_FNO-7_7ot8582p'
CHARACTER SET AL32UTF8
;

After that, we have to modify the pfile, to point to location OUTSIDE of the ASM.

*.control_files='/app/data/RCAT/controlfiles/control01.ctl','/u01/app/oracle/product/12.2.0/rcat_home/dbs/control02.ctl'

After we modify the pfile, start the instance into a mount state and re-create the controlfile as follows:

[oracle@Naos controlfiles]$ cat bkpctrl.sh
CREATE CONTROLFILE REUSE DATABASE "RCAT" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 4 (
    '/app/data/RCAT/redologs/log4a.rdo',
    '/app/data/RCAT/redologs/log4b'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 5 (
    '/app/data/RCAT/redologs/log5a.rdo',
    '/app/data/RCAT/redologs/log5b'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 6 (
    '/app/data/RCAT/redologs/log6a.rdo',
    '/app/data/RCAT/redologs/log6b'
  ) SIZE 200M BLOCKSIZE 512
DATAFILE
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSTEM_FNO-1_7lt8582d',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-2_7mt8582k',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-SYSAUX_FNO-3_7kt8581u',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-UNDOTBS1_FNO-4_7nt8582n',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-RMAN_DATA_FNO-5_7jt8581f',
  '/app/data/RCAT/datafiles/data_D-RCAT_I-724510117_TS-USERS_FNO-7_7ot8582p'
CHARACTER SET AL32UTF8
;
[oracle@Naos controlfiles]$ vi bkpctrl.sh
[oracle@Naos controlfiles]$ sqlplus

SQL*Plus: Release 12.2.0.1.0 Production on Mon Jul 16 15:09:14 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> !ls -lart
total 12
drwxr-xr-x 6 oracle oinstall 4096 Jul 16 13:07 ..
-rw-r--r-- 1 oracle dba      1042 Jul 16 15:09 bkpctrl.sh
drwxr-xr-x 2 oracle oinstall 4096 Jul 16 15:09 .

SQL> @bkpctrl.sh

Control File created.

SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Feel free to open the database at this point :)

SQL> alter database open;

Database altered.

SQL>


Appendix

You can use the following procedure to generate all commands if you are lazy:

SET serveroutput ON;
DECLARE
  vcount  NUMBER:=0;
  vfname VARCHAR2(1024);
  CURSOR df
  IS
    SELECT file#,
      rtrim(REPLACE(name,'+DG_DATA/drop/datafile/','/u01/app/oracle/oradata/drop/'),'.0123456789') AS name
    FROM v$datafile;
  CURSOR tp
  IS
    SELECT file#,
      rtrim(REPLACE(name,'+DG_DATA/drop/tempfile/','/u01/app/oracle/oradata/drop/'),'.0123456789') AS name
    FROM v$tempfile;
BEGIN
  dbms_output.put_line('CONFIGURE CONTROLFILE AUTOBACKUP ON;');
  FOR dfrec IN df
  LOOP
    IF dfrec.name  != vfname THEN
      vcount      :=1;
      vfname     := dfrec.name;
    ELSE
      vcount := vcount+1;
      vfname:= dfrec.name;
    END IF;
    dbms_output.put_line('backup as copy datafile ' || dfrec.file# ||' format  "'||dfrec.name ||vcount||'.dbf";');
  END LOOP;
  dbms_output.put_line('run');
  dbms_output.put_line('{');
  FOR dfrec IN df
  LOOP
    IF dfrec.name  != vfname THEN
      vcount      :=1;
      vfname     := dfrec.name;
    ELSE
      vcount := vcount+1;
      vfname:= dfrec.name;
    END IF;
    dbms_output.put_line('set newname for datafile ' || dfrec.file# ||'  to  '''||dfrec.name ||vcount||'.dbf'' ;');
  END LOOP;
  FOR tprec IN tp
  LOOP
    IF tprec.name  !=  vfname THEN
      vcount      :=1;
      vfname     := tprec.name;
    ELSE
      vcount := vcount+1;
      vfname:= tprec.name;
    END IF;
    dbms_output.put_line('set newname for tempfile ' || tprec.file# ||'  to  '''||tprec.name ||vcount||'.dbf'' ;');
    END LOOP;
    dbms_output.put_line('switch tempfile all;');
    dbms_output.put_line('switch datafile all;');
    dbms_output.put_line('restore database;');
    dbms_output.put_line('recover database;');
    dbms_output.put_line('}');
    dbms_output.put_line('alter database open;');
    dbms_output.put_line('exit');
END;
/

Incremental backup recovery of database copy

As complex as it sound, you can create incrementally updated copies of tha database:

RUN {
ALLOCATE CHANNEL disk1 DEVICE TYPE DISK FORMAT '/app/data/orcltest/datafiles/%U';
RECOVER COPY OF DATABASE WITH TAG 'mydb_incr_backup' UNTIL TIME 'SYSDATE - 7';
BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG 'mydb_incr_backup' DATABASE;
}

This script will either do a recover a copy OR create a backup.