The Ora DBAPractical Oracle Database Administration Knowledge & Solutions

Friday, May 29, 2026

Relocate Oracle Database Datafiles from Filesystem to ASM Using RMAN

Relocate Oracle Database Datafiles from Filesystem to ASM Using RMAN
Oracle Database 19c19.28.0.0.0CDB / PDBRMANASM

This article demonstrates how to relocate Oracle Database 19c CDB and PDB datafiles from a filesystem to ASM using RMAN. The original datafiles were located under /u01/app/oracle/oradata/PROD and its PDB directories. The destination was the ASM disk group +DATA.

Prerequisites

  • Take a valid backup of the database and verify that the backup is usable before starting the migration.
  • Ensure the target ASM disk group +DATA is created, mounted, and has sufficient free space to accommodate all datafiles and tempfiles being relocated.
  • Verify that the Oracle user has the required operating-system, SQL*Plus, RMAN, and ASM access.
  • Plan for database downtime. The database must be shut down and started in MOUNT mode before the permanent datafiles are switched to their ASM copies.
  • Expected Downtime: The database will be unavailable during the shutdown, mount, datafile switch, validation, and database-open activities. The actual downtime depends primarily on the number and size of datafiles and the time required for validation.
  • For this procedure, schedule an appropriate maintenance window and ensure application users are disconnected before shutting down the database.
  • After the migration, validate the database, PDB status, permanent datafiles, tempfiles, and ASM space before removing the old filesystem files.

1. Check CDB and PDB Status

Check all containers

SET LINESIZE 250
SET PAGESIZE 100
SET TAB OFF
SET TRIMSPOOL ON

SELECT con_id,
       name,
       open_mode
FROM v$containers
ORDER BY con_id;
Expected / Actual Output
CON_ID NAME          OPEN_MODE
------ ------------ -----------
1      CDB$ROOT     READ WRITE
2      PDB$SEED     READ ONLY
3      PRODPDB      READ WRITE

2. Identify Datafiles on the Filesystem

Before starting the relocation, list the CDB datafiles that are currently under /u01.

List filesystem datafiles

COLUMN CON_ID           FORMAT 999
COLUMN CONTAINER_NAME   FORMAT A20
COLUMN FILE_ID          FORMAT 9999
COLUMN TABLESPACE_NAME  FORMAT A20
COLUMN FILE_NAME        FORMAT A70
COLUMN SIZE_MB          FORMAT 999,999,990.00
COLUMN STATUS            FORMAT A10
COLUMN AUTOEXTENSIBLE    FORMAT A15

SELECT c.con_id,
       c.name AS container_name,
       d.file_id,
       d.tablespace_name,
       d.file_name,
       ROUND(d.bytes/1024/1024,2) AS size_mb,
       d.status,
       d.autoextensible
FROM cdb_data_files d
JOIN v$containers c
  ON c.con_id = d.con_id
WHERE d.file_name LIKE '/u01/%'
ORDER BY c.con_id, d.file_id;
Expected / Actual Output
CON_ID CONTAINER_NAME       FILE_ID TABLESPACE_NAME      FILE_NAME                                                                      SIZE_MB STATUS     AUTOEXTENSIBLE
1      CDB$ROOT            1       SYSTEM               /u01/app/oracle/oradata/PROD/system01.dbf                                     1,160.00 AVAILABLE  YES
1      CDB$ROOT            3       SYSAUX               /u01/app/oracle/oradata/PROD/sysaux01.dbf                                     1,010.00 AVAILABLE  YES
1      CDB$ROOT            4       UNDOTBS1             /u01/app/oracle/oradata/PROD/undotbs01.dbf                                      820.00 AVAILABLE  YES
1      CDB$ROOT            7       USERS                /u01/app/oracle/oradata/PROD/users01.dbf                                          5.00 AVAILABLE  YES
3      PRODPDB             9       SYSTEM               /u01/app/oracle/oradata/PROD/PRODPDB/system01.dbf                               500.00 AVAILABLE  YES
3      PRODPDB            10       SYSAUX               /u01/app/oracle/oradata/PROD/PRODPDB/sysaux01.dbf                               530.00 AVAILABLE  YES
3      PRODPDB            11       UNDOTBS1             /u01/app/oracle/oradata/PROD/PRODPDB/undotbs01.dbf                              270.00 AVAILABLE  YES
3      PRODPDB            12       USERS                /u01/app/oracle/oradata/PROD/PRODPDB/users01.dbf                                  5.00 AVAILABLE  YES

8 rows selected.

3. Check Tempfiles on the Filesystem

List CDB tempfiles

COLUMN CON_ID           FORMAT 999
COLUMN TABLESPACE_NAME  FORMAT A20
COLUMN FILE_ID          FORMAT 9999
COLUMN FILE_NAME        FORMAT A70
COLUMN SIZE_MB          FORMAT 999,999,990.00
COLUMN AUTOEXTENSIBLE   FORMAT A15

SELECT con_id,
       tablespace_name,
       file_id,
       file_name,
       ROUND(bytes/1024/1024,2) AS size_mb,
       autoextensible
FROM cdb_temp_files
WHERE file_name LIKE '/u01/%'
ORDER BY con_id, file_id;
Expected / Actual Output
CON_ID TABLESPACE_NAME FILE_ID FILE_NAME
1      TEMP            1       /u01/app/oracle/oradata/PROD/temp01.dbf                         221.00 YES
3      TEMP            3       /u01/app/oracle/oradata/PROD/PRODPDB/temp012026-08-09_17-02-37-037-PM.dbf 211.00 YES

4. Verify ASM Destination Capacity

Check +DATA capacity

COLUMN NAME      FORMAT A15
COLUMN STATE     FORMAT A10
COLUMN TYPE      FORMAT A10
COLUMN TOTAL_MB  FORMAT 999,999,990
COLUMN FREE_MB   FORMAT 999,999,990
COLUMN USED_PCT  FORMAT 990.00

SELECT name,
       state,
       type,
       total_mb,
       free_mb,
       ROUND((total_mb-free_mb)/total_mb*100,2) AS used_pct
FROM v$asm_diskgroup
WHERE name = 'DATA';
Expected / Actual Output
NAME  STATE      TYPE     TOTAL_MB FREE_MB USED_PCT
DATA  CONNECTED  EXTERN   40,960   34,760  15.14

5. Generate RMAN Commands for the Datafiles

Instead of manually typing every file name, generate the RMAN copy commands directly from CDB_DATA_FILES.

Generate BACKUP AS COPY commands

SET LINESIZE 250
SET PAGESIZE 100

COLUMN RMAN_COMMAND FORMAT A250

SELECT
'BACKUP AS COPY DATAFILE ''' ||
file_name ||
''' FORMAT ''+DATA'';'
AS rman_command
FROM cdb_data_files
WHERE file_name LIKE '/u01/%'
ORDER BY con_id, file_id;
Expected / Actual Output
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/system01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/sysaux01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/undotbs01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/users01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/system01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/sysaux01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/undotbs01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/users01.dbf' FORMAT '+DATA';

8 rows selected.

Generate SWITCH commands

SELECT
'SWITCH DATAFILE ''' ||
file_name ||
''' TO COPY;'
AS rman_command
FROM cdb_data_files
WHERE file_name LIKE '/u01/%'
ORDER BY con_id, file_id;
Expected / Actual Output
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/system01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/sysaux01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/undotbs01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/users01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/system01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/sysaux01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/undotbs01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/users01.dbf' TO COPY;

8 rows selected.

6. Shutdown the Database and Start in MOUNT Mode

Shutdown

SHUT IMMEDIATE;
Expected / Actual Output
Database closed.
Database dismounted.
ORACLE instance shut down.

Start in MOUNT mode

STARTUP MOUNT
Expected / Actual Output
ORACLE instance started.

Total System Global Area 1694498312 bytes
Fixed Size                  9178632 bytes
Variable Size             436207616 bytes
Database Buffers         1241513984 bytes
Redo Buffers                7598080 bytes
Database mounted.

7. Connect to RMAN

Connect with RMAN

rman target /
Expected / Actual Output
Recovery Manager: Release 19.0.0.0.0 - Production
Version 19.28.0.0.0

connected to target database: PROD (DBID=652689500, not open)

RMAN>

8. Create ASM Copies of the CDB and PRODPDB Datafiles

Create ASM copies of all CDB root and PRODPDB datafiles in a single RMAN run block.

RUN
{
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/system01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/sysaux01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/undotbs01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/users01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/system01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/sysaux01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/undotbs01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/users01.dbf' FORMAT '+DATA';
}
Starting backup at 20-AUG-26
using channel ORA_DISK_1

channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/PROD/system01.dbf
output file name=+DATA/PROD/DATAFILE/system.275.1241826175 tag=TAG20260820T234254 RECID=4 STAMP=1241826177
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 20-AUG-26

Starting backup at 20-AUG-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/PROD/sysaux01.dbf
output file name=+DATA/PROD/DATAFILE/sysaux.288.1241826187 tag=TAG20260820T234307 RECID=5 STAMP=1241826189
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 20-AUG-26

Starting backup at 20-AUG-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/PROD/undotbs01.dbf
output file name=+DATA/PROD/DATAFILE/undotbs1.283.1241826229 tag=TAG20260820T234348 RECID=6 STAMP=1241826229
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 20-AUG-26

Starting backup at 20-AUG-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00007 name=/u01/app/oracle/oradata/PROD/users01.dbf
output file name=+DATA/PROD/DATAFILE/users.279.1241826231 tag=TAG20260820T234351 RECID=7 STAMP=1241826231
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 20-AUG-26

Starting backup at 20-AUG-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00009 name=/u01/app/oracle/oradata/PROD/PRODPDB/system01.dbf
output file name=+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/system.292.1241826233 tag=TAG20260820T234352 RECID=8 STAMP=1241826233
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 20-AUG-26

Starting backup at 20-AUG-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00010 name=/u01/app/oracle/oradata/PROD/PRODPDB/sysaux01.dbf
output file name=+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/sysaux.290.1241826235 tag=TAG20260820T234355 RECID=9 STAMP=1241826236
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 20-AUG-26

Starting backup at 20-AUG-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00011 name=/u01/app/oracle/oradata/PROD/PRODPDB/undotbs01.dbf
output file name=+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/undotbs1.291.1241826239 tag=TAG20260820T234358 RECID=10 STAMP=1241826240
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
Finished backup at 20-AUG-26

Starting backup at 20-AUG-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00012 name=/u01/app/oracle/oradata/PROD/PRODPDB/users01.dbf
output file name=+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/users.289.1241826241 tag=TAG20260820T234401 RECID=11 STAMP=1241826241
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 20-AUG-26

Starting Control File and SPFILE Autobackup at 20-AUG-26
Finished Control File and SPFILE Autobackup at 20-AUG-26

10. Switch the Datafiles to the ASM Copies

After creating the datafile copies, switch the database datafiles to their ASM copies.

Switch CDB Root and PRODPDB datafiles

RUN
{
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/system01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/sysaux01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/undotbs01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/users01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/system01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/sysaux01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/undotbs01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/PRODPDB/users01.dbf' TO COPY;
}
datafile 1 switched to datafile copy "+DATA/PROD/DATAFILE/system.275.1241826175"
datafile 3 switched to datafile copy "+DATA/PROD/DATAFILE/sysaux.288.1241826187"
datafile 4 switched to datafile copy "+DATA/PROD/DATAFILE/undotbs1.283.1241826229"
datafile 7 switched to datafile copy "+DATA/PROD/DATAFILE/users.279.1241826231"
datafile 9 switched to datafile copy "+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/system.292.1241826233"
datafile 10 switched to datafile copy "+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/sysaux.290.1241826235"
datafile 11 switched to datafile copy "+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/undotbs1.291.1241826239"
datafile 12 switched to datafile copy "+DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/users.289.1241826241"

11. Verify the Permanent Datafiles Before Tempfile Relocation

RMAN REPORT SCHEMA

REPORT SCHEMA;
Expected / Actual Output
File Size(MB) Tablespace           Datafile Name
---- -------- ------------------ ------------------------------------------------------------
1    1160     SYSTEM             +DATA/PROD/DATAFILE/system.275.1241826175
3    1010     SYSAUX             +DATA/PROD/DATAFILE/sysaux.288.1241826187
4    820      UNDOTBS1           +DATA/PROD/DATAFILE/undotbs1.283.1241826229
5    490      PDB$SEED:SYSTEM    /u01/app/oracle/oradata/PROD/pdbseed/system01.dbf
6    450      PDB$SEED:SYSAUX    /u01/app/oracle/oradata/PROD/pdbseed/sysaux01.dbf
7    5        USERS              +DATA/PROD/DATAFILE/users.279.1241826231
8    270      PDB$SEED:UNDOTBS1  /u01/app/oracle/oradata/PROD/pdbseed/undotbs01.dbf
9    500      PRODPDB:SYSTEM     +DATA/PROD/.../DATAFILE/system.292.1241826233
10   530      PRODPDB:SYSAUX     +DATA/PROD/.../DATAFILE/sysaux.290.1241826235
11   270      PRODPDB:UNDOTBS1   +DATA/PROD/.../DATAFILE/undotbs1.291.1241826239
12   5        PRODPDB:USERS      +DATA/PROD/.../DATAFILE/users.289.1241826241
13   1024     PRODPDB:AUDIT_DATA  +DATA/PROD/.../DATAFILE/audit_data.284.1240862891

12. Relocate PDB$SEED Datafiles

Copy PDB$SEED datafiles

RUN
{
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/pdbseed/system01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/pdbseed/sysaux01.dbf' FORMAT '+DATA';
BACKUP AS COPY DATAFILE '/u01/app/oracle/oradata/PROD/pdbseed/undotbs01.dbf' FORMAT '+DATA';
}
Expected / Actual Output
input datafile file number=00005 name=/u01/app/oracle/oradata/PROD/pdbseed/system01.dbf
output file name=+DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/system.278.1241826465

input datafile file number=00006 name=/u01/app/oracle/oradata/PROD/pdbseed/sysaux01.dbf
output file name=+DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/sysaux.277.1241826467

input datafile file number=00008 name=/u01/app/oracle/oradata/PROD/pdbseed/undotbs01.dbf
output file name=+DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/undotbs1.276.1241826469

Switch PDB$SEED datafiles individually

SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/pdbseed/sysaux01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/pdbseed/undotbs01.dbf' TO COPY;
SWITCH DATAFILE '/u01/app/oracle/oradata/PROD/pdbseed/system01.dbf' TO COPY;
Expected / Actual Output
datafile 6 switched to datafile copy "+DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/sysaux.277.1241826467"
datafile 8 switched to datafile copy "+DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/undotbs1.276.1241826469"
datafile 5 switched to datafile copy "+DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/system.278.1241826465"

13. Relocate Temporary Files to ASM

Tempfiles are handled separately from permanent datafiles. Use RMAN to set new names for all three tempfiles and then switch them.

Move all tempfiles to +DATA

RUN
{
SET NEWNAME FOR TEMPFILE 1 TO '+DATA';
SET NEWNAME FOR TEMPFILE 2 TO '+DATA';
SET NEWNAME FOR TEMPFILE 3 TO '+DATA';

SWITCH TEMPFILE ALL;
}
Expected / Actual Output
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME

renamed tempfile 1 to +DATA in control file
renamed tempfile 2 to +DATA in control file
renamed tempfile 3 to +DATA in control file

14. Verify the Complete ASM Layout

REPORT SCHEMA after tempfile switch

REPORT SCHEMA;
Expected / Actual Output
# List of Permanent Datafiles

1    1160  SYSTEM              +DATA/PROD/DATAFILE/system.275.1241826175
3    1010  SYSAUX              +DATA/PROD/DATAFILE/sysaux.288.1241826187
4    820   UNDOTBS1            +DATA/PROD/DATAFILE/undotbs1.283.1241826229
5    490   PDB$SEED:SYSTEM     +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/system.278.1241826465
6    450   PDB$SEED:SYSAUX     +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/sysaux.277.1241826467
7    5     USERS               +DATA/PROD/DATAFILE/users.279.1241826231
8    270   PDB$SEED:UNDOTBS1   +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/undotbs1.276.1241826469
9    500   PRODPDB:SYSTEM      +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/system.292.1241826233
10   530   PRODPDB:SYSAUX      +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/sysaux.290.1241826235
11   270   PRODPDB:UNDOTBS1    +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/undotbs1.291.1241826239
12   5     PRODPDB:USERS       +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/users.289.1241826241
13   1024  PRODPDB:AUDIT_DATA   +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/audit_data.284.1240862891

# List of Temporary Files

1    221  TEMP             +DATA
2    211  PDB$SEED:TEMP    +DATA
3    211  PRODPDB:TEMP     +DATA

15. Open the Database

Open database

ALTER DATABASE OPEN;
Expected / Actual Output
Statement processed

Final RMAN REPORT SCHEMA

REPORT SCHEMA;
Expected / Actual Output
# List of Permanent Datafiles

1    1160  SYSTEM             YES  +DATA/PROD/DATAFILE/system.275.1241826175
3    1010  SYSAUX             NO   +DATA/PROD/DATAFILE/sysaux.288.1241826187
4    820   UNDOTBS1           YES  +DATA/PROD/DATAFILE/undotbs1.283.1241826229
5    490   PDB$SEED:SYSTEM    NO   +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/system.278.1241826465
6    450   PDB$SEED:SYSAUX    NO   +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/sysaux.277.1241826467
7    5     USERS              NO   +DATA/PROD/DATAFILE/users.279.1241826231
8    270   PDB$SEED:UNDOTBS1  NO   +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/undotbs1.276.1241826469
9    500   PRODPDB:SYSTEM     YES  +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/system.292.1241826233
10   530   PRODPDB:SYSAUX     NO   +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/sysaux.290.1241826235
11   270   PRODPDB:UNDOTBS1   YES  +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/undotbs1.291.1241826239
12   5     PRODPDB:USERS      NO   +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/users.289.1241826241
13   1024  PRODPDB:AUDIT_DATA  NO   +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/audit_data.284.1240862891

# List of Temporary Files

1    221  TEMP             +DATA/PROD/TEMPFILE/temp.285.1241826705
2    211  PDB$SEED:TEMP    +DATA/PROD/589C98355962EE4FE0636538A8C03676/TEMPFILE/temp.286.1241826707
3    211  PRODPDB:TEMP     +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/TEMPFILE/temp.287.1241826707

16. Validate the Database from SQL*Plus

Check PDB status

SHOW PDBS
Expected / Actual Output
CON_ID CON_NAME   OPEN MODE  RESTRICTED
2      PDB$SEED   READ ONLY  NO
3      PRODPDB    READ WRITE NO

Check tempfiles

SELECT con_id,
       tablespace_name,
       file_id,
       file_name,
       status
FROM cdb_temp_files
ORDER BY con_id, file_id;
Expected / Actual Output
CON_ID TABLESPACE_NAME FILE_ID FILE_NAME                                                     STATUS
1      TEMP            1       +DATA/PROD/TEMPFILE/temp.285.1241826705                  ONLINE
3      TEMP            3       +DATA/PROD/.../TEMPFILE/temp.287.1241826707              ONLINE

Check database role and open mode

SELECT name,
       open_mode,
       database_role,
       db_unique_name
FROM v$database;
Expected / Actual Output
NAME  OPEN_MODE   DATABASE_ROLE  DB_UNIQUE_NAME
PROD  READ WRITE  PRIMARY        PROD

Check all CDB datafiles

SELECT c.con_id,
       c.name AS container_name,
       d.file_id,
       d.tablespace_name,
       d.file_name,
       ROUND(d.bytes/1024/1024,2) AS size_mb,
       d.status
FROM cdb_data_files d
JOIN v$containers c
  ON c.con_id = d.con_id
ORDER BY c.con_id, d.file_id;
Expected / Actual Output
1 CDB$ROOT  1  SYSTEM      +DATA/PROD/DATAFILE/system.275.1241826175
1 CDB$ROOT  3  SYSAUX      +DATA/PROD/DATAFILE/sysaux.288.1241826187
1 CDB$ROOT  4  UNDOTBS1    +DATA/PROD/DATAFILE/undotbs1.283.1241826229
1 CDB$ROOT  7  USERS       +DATA/PROD/DATAFILE/users.279.1241826231
3 PRODPDB   9  SYSTEM      +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/system.292.1241826233
3 PRODPDB   10 SYSAUX      +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/sysaux.290.1241826235
3 PRODPDB   11 UNDOTBS1    +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/undotbs1.291.1241826239
3 PRODPDB   12 USERS       +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/users.289.1241826241
3 PRODPDB   13 AUDIT_DATA  +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/audit_data.284.1240862891

Check V$DATAFILE

SELECT file#,
       name,
       status,
       enabled
FROM v$datafile
ORDER BY file#;
Expected / Actual Output
1  +DATA/PROD/DATAFILE/system.275.1241826175                                      SYSTEM  READ WRITE
3  +DATA/PROD/DATAFILE/sysaux.288.1241826187                                      ONLINE   READ WRITE
4  +DATA/PROD/DATAFILE/undotbs1.283.1241826229                                    ONLINE   READ WRITE
5  +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/system.278.1241826465     SYSTEM  READ WRITE
6  +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/sysaux.277.1241826467     ONLINE   READ WRITE
7  +DATA/PROD/DATAFILE/users.279.1241826231                                       ONLINE   READ WRITE
8  +DATA/PROD/589C98355962EE4FE0636538A8C03676/DATAFILE/undotbs1.276.1241826469   ONLINE   READ WRITE
9  +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/system.292.1241826233     SYSTEM  READ WRITE
10 +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/sysaux.290.1241826235     ONLINE   READ WRITE
11 +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/undotbs1.291.1241826239 ONLINE   READ WRITE
12 +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/users.289.1241826241    ONLINE   READ WRITE
13 +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/DATAFILE/audit_data.284.1240862891 ONLINE READ WRITE

Check datafile headers

SELECT file#,
       status,
       error,
       recover
FROM v$datafile_header
ORDER BY file#;
Expected / Actual Output
1 ONLINE  NO
3 ONLINE  NO
4 ONLINE  NO
5 ONLINE
6 ONLINE
7 ONLINE  NO
8 ONLINE
9 ONLINE  NO
10 ONLINE NO
11 ONLINE NO
12 ONLINE NO
13 ONLINE NO

12 rows selected.

Check tempfiles and maximum size

SELECT con_id,
       tablespace_name,
       file_id,
       file_name,
       ROUND(bytes/1024/1024,2) AS size_mb,
       ROUND(maxbytes/1024/1024,2) AS maxsize_mb,
       status
FROM cdb_temp_files
ORDER BY con_id, file_id;
Expected / Actual Output
1 TEMP 1 +DATA/PROD/TEMPFILE/temp.285.1241826705 221.00 32,767.98 ONLINE
3 TEMP 3 +DATA/PROD/589D6350A5B241DAE0636538A8C021C3/TEMPFILE/temp.287.1241826707 211.00 32,767.98 ONLINE

Check temporary tablespaces

SELECT con_id,
       tablespace_name AS name,
       status,
       contents
FROM cdb_tablespaces
WHERE contents = 'TEMPORARY'
ORDER BY con_id;
Expected / Actual Output
CON_ID NAME STATUS CONTENTS
1      TEMP ONLINE TEMPORARY
3      TEMP ONLINE TEMPORARY

Check ASM capacity after migration

SELECT name,
       state,
       type,
       total_mb,
       free_mb,
       ROUND((total_mb-free_mb)/total_mb*100,2) AS used_pct
FROM v$asm_diskgroup
WHERE name = 'DATA';
Expected / Actual Output
NAME  STATE      TYPE    TOTAL_MB FREE_MB USED_PCT
DATA  CONNECTED  EXTERN  40,960   28,536  30.33

17. Clean Up the Old Datafile Copies

After validating the database from ASM, remove the old filesystem datafile copies from RMAN.

Delete old datafile copies

RUN
{
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/system01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/sysaux01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/undotbs01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/users01.dbf';

DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/PRODPDB/system01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/PRODPDB/sysaux01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/PRODPDB/undotbs01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/PRODPDB/users01.dbf';

DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/pdbseed/system01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/pdbseed/sysaux01.dbf';
DELETE DATAFILECOPY '/u01/app/oracle/oradata/PROD/pdbseed/undotbs01.dbf';
}
Expected / Actual Output
List of Datafile Copies
=======================
Name: /u01/app/oracle/oradata/PROD/system01.dbf

Do you really want to delete the above objects (enter YES or NO)? yes
deleted datafile copy
Deleted 1 objects

The same successful deletion pattern was repeated for the remaining old CDB, PRODPDB and PDB$SEED datafile copies.

18. Remove the Old Tempfile Files

After validating the tempfiles on ASM, remove the old filesystem tempfile files at the operating-system level.

Remove old tempfiles

rm -f /u01/app/oracle/oradata/PROD/temp01.dbf
rm -f /u01/app/oracle/oradata/PROD/pdbseed/temp012026-08-09_17-02-37-037-PM.dbf
rm -f /u01/app/oracle/oradata/PROD/PRODPDB/temp012026-08-09_17-02-37-037-PM.dbf

Final Result

Migration completed successfully. The final validation showed the CDB root, PDB$SEED, PRODPDB and PRODPDB AUDIT_DATA permanent datafiles on +DATA. The active tempfiles were also on +DATA, the database was READ WRITE with role PRIMARY, and all checked datafiles were online/read-write.

Environment used in this execution: Oracle Database 19c Enterprise Edition, version 19.28.0.0.0, database PROD, CDB with PRODPDB, ASM disk group +DATA.