martes, 19 de julio de 2016

Migración LOB BasicFile a SecureFile

En este post se presenta un ejemplo sencillo del proceso de migración de BasicFile a SecureFile.

1.       Creación de la tabla destino y definición de los objetos a trabajar en este ejemplo guía

a.       Definición de la Tabla Origen BasicFile

CREATE TABLE BASICFILE_TAB (
  ID         NUMBER PRIMARY KEY,
  CLOB_DATA  CLOB
)
LOB(CLOB_DATA) STORE AS BASICFILE BASICFILE_LOB;

b.      Creación de la Tabla destino SecureFile

CREATE TABLE SECUREFILE_TAB (
  ID         NUMBER NOT NULL,
  CLOB_DATA  CLOB
)
LOB(CLOB_DATA) STORE AS SECUREFILE SECUREFILE_LOB (
  DEDUPLICATE COMPRESS MEDIUM
);


c.       A continuación, se presenta la definición resumen de las dos tablas:

SELECT OWNER, TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, TABLESPACE_NAME, COMPRESSION, DEDUPLICATION, SECUREFILE
FROM ALL_LOBS WHERE TABLE_NAME IN ('SECUREFILE_TAB','BASICFILE_TAB');



d.      Se insertan datos en la tabla origen:

DECLARE
  l_clob CLOB := RPAD('X', 10000, 'X');
BEGIN
  FOR i IN 1 .. 1000 LOOP
    INSERT INTO BASICFILE_TAB VALUES (i, l_clob);
  END LOOP;
  COMMIT;
END;

e.      Revisamos el tamaño de las tablas en KB:

SELECT SEGMENT_NAME, BYTES/1024
FROM   USER_SEGMENTS
WHERE  SEGMENT_NAME IN ('BASICFILE_LOB','SECUREFILE_LOB');


2.       Se inicia la redefinición de tablas, donde se mapean los campos de las tablas:

BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE ('JMENDOZA', 'BASICFILE_TAB', 'SECUREFILE_TAB', 'ID ID, CLOB_DATA CLOB_DATA');
END;

Revisamos el tamaño de las tablas en KB, luego de la redefinición, que se observa que se hizo la copia de los datos de la tabla origen (BASICFILE) a la tabla destino (SECUREFILE), se redujo significativamente el espacio gracias a las propiedades definidas Deduplicate y Compression:

SELECT SEGMENT_NAME, BYTES/1024
FROM   USER_SEGMENTS
WHERE  SEGMENT_NAME IN ('BASICFILE_LOB','SECUREFILE_LOB');


3.       El siguiente paso es copiar las dependencias de la tabla origen:

DECLARE
ERROR_COUNT INTEGER := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ('JMENDOZA', 'BASICFILE_TAB', 'SECUREFILE_TAB', 1, TRUE, TRUE, TRUE, FALSE, ERROR_COUNT);
END;

4.       Fin de la redefinición, se intercambian los nombres de las tablas, luego de este paso la tabla BASICFILE_TAB estará migrada, tendrá los datos y la definición de SecureFile:

EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE ('JMENDOZA', 'BASICFILE_TAB', 'SECUREFILE_TAB');

SELECT OWNER, TABLE_NAME, COLUMN_NAME, SEGMENT_NAME, TABLESPACE_NAME, COMPRESSION, DEDUPLICATION, SECUREFILE
FROM ALL_LOBS WHERE TABLE_NAME IN ('SECUREFILE_TAB','BASICFILE_TAB');


5.       Teniendo ya migrada nuestra tabla, podemos eliminar la tabla auxiliar:

DROP TABLE SECUREFILE_TAB;


No hay comentarios:

Publicar un comentario