jueves, 24 de octubre de 2013

Renombrar/Realocar datafiles online

En 12c se puede renombrar o realocar datafiles sin necesidad de pasarlos a offline ni tener que hacerlo con la base montada. Esta nueva posibilidad es muy interesante ya que no tenemos que esperar a realizar este tipo de tareas, que suelen ser bastante frecuentes, fuera de horario ni en ventanas de mantenimiento.

Algunas consideraciones a tener en cuenta:
    • Se puede realocar desde y hacia distintos tipos tipos de storage (por ejemplo desde ASM hacia FS o visceversa)
    • En arquitecturas con Bases Standby se deber realizar el realocado/renombrado en forma separado en primaria y standby.
    • La realocación en entornos Windows, deja el datafile original y deber ser borrado explicatamente luego de completada la operación
    • No aplica a temporary files
    • En CDB  (Container DB) no se pueden mover datafiles que pertenecen a PDC (Pluggable DB)
Comparto un ejemplo para mostrarles el nuevo feature en acción:
Primero voy a intentar mover un datafile en 11g:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oradata/rop/users01.dbf
/u01/app/oradata/rop/undotbs01.dbf
/u01/app/oradata/rop/sysaux01.dbf
/u01/app/oradata/rop/system01.dbf
SQL> alter tablespace users rename datafile '/u01/app/oradata/rop/users01.dbf'
2 to '/u01/app/oradata/users01.dbf';
alter tablespace users rename datafile '/u01/app/oradata/rop/users01.dbf'
*
ERROR at line 1:
ORA-01525: error in renaming data files
ORA-01121: cannot rename database file 4 - file is in use or recovery
ORA-01110: data file 4: '/u01/app/oradata/rop/users01.dbf'
Como se observa no se puede renombrar un datafile que esta ONLINE
Veamos que pasa en 12c:
Lo primero que uno prueba si solo escuchó que en 12c, y no se tomó el tiempo para leer el manual,  se puede renombrar datafiles online,  es usar la sintaxis que se usa para renombrar datafiles offline en versiones 11g e inferiores:
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE 12.1.0.1.0 Production
TNS for Linux: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production

SQL> alter tablespace users rename datafile '/u01/app/oradata/rop/users01.dbf'
2 to '/u01/app/oradata/users01.dbf';
alter tablespace users rename datafile '/u01/app/oradata/rop/users01.dbf'
*
ERROR at line 1:
ORA-01525: error in renaming data files
ORA-01121: cannot rename database file 4 - file is in use or recovery
ORA-01110: data file 4: '/u01/app/oradata/rop/users01.dbf'
El error es el mismo. El tema es que para realocar datafiles se agregó una nueva sintaxis:
ALTER DATABASE MOVE DATAFILE ( 'filename' | 'ASM_filename' | file_number )
 [ TO ( 'filename' | 'ASM_filename' ) ]
 [ REUSE ] [ KEEP ]
Ahora probemos de renombrar usando la nueva sintaxis:
SQL> alter database move datafile '/u01/app/oradata/ropusers01.dbf'
2 to '/u01/app/oradata/ropusers02.dbf';

Database altered.

SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oradata/rop/users02dbf
/u01/app/oradata/rop/undotbs01.dbf
/u01/app/oradata/rop/sysaux01.dbf
/u01/app/oradata/rop/system01.dbf

El datafile se renombró online !!!

1 comentario: