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.