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.