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.
[pgsql]
SQL> show parameter db_create_file_dest
NAME TYPE
———————————— ———————————
VALUE
——————————
db_create_file_dest string
/u01/app/oracle/oradata/cdb2
[/pgsql]
Ahora vamos a verificar el estado de la BD y las PDBs y los datafiles que tenemos en nuestra BD
[pgsql]
SQL> select open_mode from v$database;
OPEN_MODE
————————————————————
READ WRITE
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
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.
[/pgsql]
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
[pgsql]
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»
[/pgsql]
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
[pgsql]
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.
[/pgsql]
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
[pgsql]
SQL> ALTER SESSION SET container = cdb$root;
Session altered.
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
[/pgsql]
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.