Como mover un datafile en Oracle 12c R1

Aquí les voy a pasar un tip rapido de como en Oracle 12c R1 podemos mover un datafile sin tener que bajar la base de datos o poner el tablespace al que pertenecía el datafile en modo offline.

Para este ejemplo, voy a usar OMF (Oracle Managed Files), pero también lo puedes hacer sin OMF.Lo primero que voy a hacer, es verificar que el db_create_file_dest tenga el valor a donde quiero que se creen mis datafiles.

oracle@localhost.localdomain [CDB2] /home/oracle
oracle $ sqlplus
SQL*Plus: Release 12.1.0.2.0 Production on Wed Apr 1 00:46:27 2015
Copyright (c) 1982, 2014, Oracle.All rights reserved.
Enter user-name: /as sysdba
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> show parameter db_create_file_dest
NAME TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
db_create_file_dest string
/u01/app/oracle/oradata/cdb2

Ahora vamos a verificar el estado de la BD y las PDBs y los datafiles que tenemos en nuestra BD

SQL> select open_mode from v$database;
OPEN_MODE
------------------------------------------------------------
READ WRITE
SQL> </span>SELECT PDB_ID, PDB_NAME, STATUS FROM CDB_PDBS ORDER BY PDB_ID;
PDB_ID PDB_NAME STATUS
---------- --------------- ---------------------------
 2 PDB$SEED NORMAL
 3 PDB1NORMAL
SQL> SELECT file_id, file_name FROM cdb_data_files ORDER BY file_id;
FILE_ID FILE_NAME
---------- ----------------------------------------------------------------------
 1 /oradata/CDB2/system01.dbf
 3 /oradata/CDB2/sysaux01.dbf
 5 /oradata/CDB2/undotbs01.dbf
 6 /u01/app/oracle/oradata/cdb2/CDB2/datafile/o1_mf_users_bk1wg0z4_.dbf
 7 /oradata/UPGR/system01.dbf
 8 /oradata/UPGR/sysaux01.dbf
 9 /oradata/UPGR/users01.dbf
 10 /tmp/aq01.dbf
 12 /u01/app/oracle/product/12.1.0.2/dbs/rene.dat
9 rows selected.

Y ahora vamos a usar el comando ALTER DATABASE MOVE DATAFILE dentro de la CDB y nos va a marcar un error de que el datafile no existe

SQL> ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/product/12.1.0.2/dbs/rene.dat';
ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/product/12.1.0.2/dbs/rene.dat'
*
ERROR at line 1:
ORA-01516: nonexistent log file, data file, or temporary file "12"

El detalle es que en 12cR1, no nos permite mover un datafile que le pertenece a un PDB desde el CDB, si nos cambiamos a la PDB llamada PDB1, ahi si vamos a poder hacerlo

SQL> ALTER SESSION SET container =PDB1;
Session altered.
SQL> ALTER DATABASE MOVE DATAFILE '/u01/app/oracle/product/12.1.0.2/dbs/rene.dat';
Database altered.

Me voy a regresar el CDB para verificar todos los datafiles de nuestra BD y vas a ver que ahora el datafile 12 se encuentra dentro de la ruta del db_create_file_dest

SQL> ALTER SESSION SET container = cdb$root;
Session altered.
SQL>
SQL> SELECT file_id, file_name FROM cdb_data_files ORDER BY file_id;
FILE_ID FILE_NAME
---------- ----------------------------------------------------------------------
 1 /oradata/CDB2/system01.dbf
 3 /oradata/CDB2/sysaux01.dbf
 5 /oradata/CDB2/undotbs01.dbf
 6 /u01/app/oracle/oradata/cdb2/CDB2/datafile/o1_mf_users_bk1wg0z4_.dbf
 7 /oradata/UPGR/system01.dbf
 8 /oradata/UPGR/sysaux01.dbf
 9 /oradata/UPGR/users01.dbf
 10 /tmp/aq01.dbf
 12 /u01/app/oracle/oradata/cdb2/CDB2/datafile/o1_mf_rene_bkpj4t2x_.dbf
9 rows selected.
SQL> SELECT PDB_ID, PDB_NAME, STATUS FROM CDB_PDBS ORDER BY PDB_ID;
PDB_ID PDB_NAME STATUS
---------- --------------- ---------------------------
 2 PDB$SEED NORMAL
 3 PDB1NORMAL

Conclusión
Como puedes ver ahora es un proceso mucho mas sencillo para poder cambiar un datafile, así que espero que te ayude en un futuro este pequeño tip.

Leave a Reply

Your email address will not be published. Required fields are marked *