Mostrando entradas con la etiqueta 12c New Features. Mostrar todas las entradas
Mostrando entradas con la etiqueta 12c New Features. Mostrar todas las entradas

jueves, 2 de octubre de 2014

In-Database Archiving en 12c


         Este nuevo feature llamó mi atención por la simplicidad de implementación y la utilidad que tiene cuando necesitamos eliminar filas de una tabla en forma lógica, es decir, sin eliminar la fila en forma física o permanente.  

         Si bien el procedimiento para "ocultar" filas se puede realizar agregando una columna extra de visibilidad como flag, esta nueva columna es parte del modelado y de alguna forma "ensucia" el modelo lógico, aunque a partir de 11g se puede ser mas prolijo y agregar la columna de marca de borrado como oculta. Luego que la columna se agrega o se puede programar en la aplicación para que considere siempre las filas que cumplen por ej:  BORRADA = 'N' o en forma mas transparente usando políticas de seguridad (ej: VPD)

         En esta nota voy a mostrar con un simple ejemplo como usar el archiving interno a nivel de tabla para implementar borrados lógicos:

Voy a crear un tabla T con dos columnas:

SQL> create table t (x int, y varchar2(10));
Table created.

Habilito el archiving en la tabla recién creada:

SQL> alter table t row archival;
Table altered.

Inserto 100 filas:

SQL> insert into t 
  2  select rownum,dbms_random.string('a',10)
  3  from dual
  4  connect by rownum <= 100;
100 rows created.
                 
SQL> commit;
Commit complete.

Cuento la cantidad de filas insertadas:

SQL> select count(1) from t;

  COUNT(1)
----------
       100

Realizo el borrado lógico de 10 filas cualquiera:

SQL> update t set ora_archive_state = '1' where rownum <= 10;
10 rows updated.
             
SQL> commit;
Commit complete.

Verifico que no estén visibles la filas borradas enteriormente:



SQL> select count(1) from t;
         
 COUNT(1)
----------
        90

Si se quiere tener visibilidad de todas las filas, incluidas las eliminadas, hay que setear el siguiente parámetro a nivel sesión:

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;
Session altered.
         
SQL> select count(1) from t;
  COUNT(1)
----------
       100

Como se observa con el count(*) se suman también las filas ocultas.

Para volver a hacer invisibles las filas:

ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;

Si, por ejemplo, se eliminaron mas filas que las necesarias, simplemente hay que realizar un update sobre la pseudocolumna  ora_archive_state en 0, que es el valor default.

Para desactivar el row archiving:

SQL> alter table t no row archival;
Table altered.







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 !!!