viernes, 17 de agosto de 2012

Migración a Oracle SecureFiles - Caso de Prueba


   Resumen

La prueba consiste en la migración de la tabla TABLA1 cuyo LOB es de tipo BasicFiles (BF) al tipo SecureFiles (SF). La idea es realizar la migración simple, luego con deduplicación solamente y por último deduplicación con compresión, para poder realizar un análisis comparativo del uso del espacio.


  Datos:
Plataforma
Linux
Oracle
11.2.0.1
Base
PROD
Tabla a migrar
TABLA1
Esquema
SMD

   
     Relevamiento:

Lo primero que hacemos es relevar la tabla con la columna LOB a migrar para l cual obtenemos el DDL de la tabla TABLA1, revisamos la cantidad de filas que tiene, el tamaño de ocupación de la misma y del campo LOB que reside en un tablespace separado. El tamaño de ocupación del LOB lo necesitamos, pues vamos a crear un tablespace separado para almacenar los LOB en formato SecureFiles.
 CREATE TABLE TABLA1  
    (empcod                        NUMBER(2,0) NOT NULL,
    ramcod                         NUMBER(2,0) NOT NULL,
    solnro                         NUMBER(8,0) NOT NULL,
    soldisins                      NUMBER(4,0) NOT NULL,
    sol12txtcod                    NUMBER(15,0) NOT NULL,
    sol12texto                     CLOB NOT NULL)
  PCTFREE     10
  INITRANS    1
  MAXTRANS    255
  TABLESPACE  tb1_00_SMD
  STORAGE   (
    INITIAL     65536
    NEXT        1048576
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
  NOCACHE
  MONITORING
  LOB ("SOL12TEXTO") STORE AS SYS_LOB0000100698C00006$$
  (
  TABLESPACE  tb50_00_SMD_lob
  STORAGE   (
    INITIAL     65536
    NEXT        52428800
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
   NOCACHE LOGGING
   CHUNK 8192
  )
  NOPARALLEL
  LOGGING
/

 -- Constraints for TABLA1
ALTER TABLE TABLA1
ADD PRIMARY KEY (empcod, ramcod, solnro, soldisins, sol12txtcod)
USING INDEX
  PCTFREE     5
  INITRANS    2
  MAXTRANS    255
  TABLESPACE  ib1_00_SMD
  STORAGE   (
    INITIAL     65536
    NEXT        1048576
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
/

          // Reviso cuantas filas tiene la tabla

select count(*) from SMD.TABLA1
1093636
// Reviso cuanto pesa la tabla

select bytes/1024/1024 "mb" from dba_segments where segment_name like 'TABLA1' and owner='SMD'
728 MB

// Reviso si tiene particiones

SELECT * FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER='SMD'
no

// Veo cuanto espacio requiero a nivel de lob:


select a.owner, a.table_name, a.column_name, a.segment_name , b.bytes/1024/1024 MB
from dba_lobs a, dba_segments b
where a.segment_name = b.segment_name
and a.owner = b.owner
and a.owner= 'SMD'
and a.table_name='TABLA1'
order by b.bytes/1024/1024
SOL12TEXTO: SYS_LOB00000100698C00006$$=16GB 
   
   Prueba de migración BF -> SF simple

A continuación se arman los scripts y se realiza la prueba la migración de BasicFiles a SecureFiles simple (sin compresión ni deduplicación)

1.  Creación de tablespace
Script: /home/oracle/scripts/1.CreaTS.sql 

::::::::::::::
1.CreaTS.sql
::::::::::::::
CREATE SMALLFILE TABLESPACE "TB_SF" DATAFILE '/opt/oracle/oradata/prod/tb_sf01.dbf'
SIZE 1000M AUTOEXTEND ON NEXT 100M MAXSIZE 2000M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;

   2.  Creación de table auxiliar 

Script: /home/oracle/scripts/2.CreaTablaAux.sql

::::::::::::::
2.CreaTablaAux.sql
::::::::::::::
DROP TABLE SMD.AUXTABLA1;
CREATE TABLE SMD.AUXTABLA1
    (empcod                         NUMBER(2,0) NOT NULL,
    ramcod                         NUMBER(2,0) NOT NULL,
    solnro                         NUMBER(8,0) NOT NULL,
    soldisins                      NUMBER(4,0) NOT NULL,
    sol12txtcod                    NUMBER(15,0) NOT NULL,
    sol12texto                     CLOB NOT NULL)
  PCTFREE     10
  INITRANS    1
  MAXTRANS    255
  TABLESPACE  tb1_00_SMD
  STORAGE   (
    INITIAL     65536
    NEXT        1048576
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
  NOCACHE
  MONITORING
  LOB ("SOL12TEXTO") STORE AS SecureFile
  (
  TABLESPACE  tb_sf
  STORAGE   (
    INITIAL     65536
    NEXT        52428800
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
   NOCACHE LOGGING
   CHUNK 8192
  )
  NOPARALLEL
  LOGGING
/

3.  Redefinición de la tabla
Script: /home/oracle/scripts/3.Redef.sql

::::::::::::::
3.Redef.sql
::::::::::::::
set timi on
spool logs/redef.log
exec dbms_redefinition.start_redef_table('SMD', 'TABLA1', 'AUXTABLA1','EMPCOD EMPCOD, RAMCOD RAMCOD, SOLNRO SOLNRO, SOLDISINS SOLDISINS, SOL12TXTCOD SOL12TXTCOD,SOL12TEXTO SOL12TEXTO');
exit
4.  Copia de objetos dependientes
Script: /home/oracle/scripts/4.Depend.sql

::::::::::::::
4.Depend.sql
::::::::::::::
set timi on
spool on logs/depend.log
dbms_redefinition.copy_table_dependents('SMD', 'TABLA1', 'AUXTABLA1', 1, true, true, true, false, error_count);
exit

 Nos da el siguiente error, pero se puede ignorar según nota de Metalink:

The "problem" is, that you already defined the NOT NULL constraints on some columns, hence the message
ORA-01442: column to be modified to NOT NULL is already NOT NULL
when Oracle tried to copy the table dependent constraints.
As you already noticed, the remaining dependent objects have been copied. So you shouldn't worry about the ORA- message.

5.      Finalización: intercambio de los nombres de las tablas
Script: /home/oracle/scripts/5.Finish.sql

::::::::::::::
5.Finish.sql
::::::::::::::
set timi on
spool logs/finish.log
dbms_redefinition.finish_redef_table('SMD','TABLA1', 'AUXTABLA1');
exit

6.      Revisión de los objetos dependientes de las tablas AUXTABLA1 (que ahora es la original) y la tabla TABLA1T (que es la tabla migrada)
Vemos que no se creò la constraint de primary key aunque sì se creo el unique index.

 Se creó la constraint de primary  key faltante:

ALTER TABLE SMD.TABLA1
ADD PRIMARY KEY (empcod, ramcod, solnro, soldisins, sol12txtcod)


7.      Revisión del registro en la dba_lobs:

select owner,table_name,column_name,securefile from dba_lobs where column_name='SOL12TEXTO';
SQL> select owner,table_name,securefile from dba_lobs where column_name='SOL12TEXTO';
OWNER                          TABLE_NAME                     SEC
------------------------------ ------------------------------ ---
SMD                            TABLA1                         YES
SMD                            AUXTABLA1                      NO
Prueba de migración BF -> SF con compresión y deduplicación
1.      Borrado de la tabla TABLA1 migrada  

2.      Borrado del log de la vista materializada de la tabla AUXTABLA1 (sino da: ERROR at line 1: ORA-26563: renaming this table is not allowed)
           
       DROP MATERIALIZED VIEW LOG ON SDM.MLOG$_TABLA1

3.      Renombramos la tabla AUXTABLA1 como TABLA1

     ALTER TABLE AUXTABLA1 RENAME TO TABLA1

4.      Copiamos el script 2 y le agregamos el alter table compress y deduplicate

ALTER TABLE SMD.AUXTABLA1 MODIFY LOB ("SOL12TEXTO") ( COMPRESS HIGH DEDUPLICATE )
select OWNER,TABLE_NAME, TABLESPACE_NAME,COMPRESSION,DEDUPLICATION from dba_lobs where column_name='SOL12TEXTO'

5.      Revisamos la tabla en la vista dba_lobs:

  OWNER
TABLE_NAME
TABLESPACE_NAME
COMPRESSION
DEDUPLICATION
  SMD
TABLA1
TB50_00_SMD_LOB
NONE
NONE
  SMD
AUXTABLA1
TB_SF
HIGH
LOB

6.      Luego se corre el script :

nohup ./3.Redef.sh & (Tiempo del proceso 2.08 hs)

Se puede observar al monitorar que el tablespace se está llenando y el proceso está corriendo normalmente. 

7.      Ejecución del script que migra las dependencias

 ./4.Depend.sh

8.      Ejecución del script que intercambia los nombres de las tablas

 ./5.Finish.sh

9.      Ejecución del script que agrega la PK

 ./6.AddPk.sql


10.  Ejecución del script para revisar el espacio:

SQL> @7.RevisaEspacio.sql
Segment Name=SYS_LOB0000103121C00006$$
segment_size_blocks       => 368656
segment_size_bytes        => 3020029952
used_blocks               => 346336
used_bytes                => 2837184512
expired_blocks            => 21737
expired_bytes             => 178069504
unexpired_blocks          => 0
unexpired_bytes           => 0

   Prueba de migración BF -> SF con deduplicación solamente

1.      Borrado de la tabla TABLA1 migrada :

DROP TABLE SMD.TABLA1;

2.      Renombre de la tabla AUXTABLA1 como TABLA1

ALTER TABLE SMD.AUXTABLA1 RENAME TO TABLA1;

3.      Copia del script 2.CreaTablaAuxCompress.sql como 2.CreaTablaAuxDeduplicate.sql y borrado del compress del alter table dejando sólo deduplicate;

4.      Ejecución del script 2.CreaTablaAuxDeduplicate.sql

SQL>@2.CreaTablaAuxDeduplicate.sql
5.      Ejecución del script que realiza la redefinición. 

 nohup ./3.Redef.sh & (Tiempo del proceso 2.24 hs)

6.      Ejecución del script que migra las dependencias 

 ./4.Depend.sh
7.      Ejecución del script que intercambia los nombres de las tablas 

 ./5.Finish.sh
8.      Ejecución del script que agrega la PK 

 ./6.AddPk.sql
9.      Corremos 7.RevisaEspacio.sql 

SQL> @7.RevisaEspacio.sql
Segment Name=SYS_LOB0000103630C00006$$
segment_size_blocks       => 1.035.792
segment_size_bytes        => 8.485.208.064
used_blocks               => 979520
used_bytes                => 8024227840
expired_blocks            => 55034
expired_bytes             => 450838528
unexpired_blocks          => 0
unexpired_bytes           => 0
10.  Revisamos la tabla en la dba_lobs: 

OWNER          TABLE_NAME                TABLESPACE_NAME           COMPRE DEDUPLICATION
------------------------------ ------------------------------ ----------------------
SMD            TABLA1                         TB_SF                NO     LOB
SMD            AUXTABLA1                      TB50_00_SMD_LOB      NONE   NONE
Resultados
A continuación se muestran los resultados de la migración:

Prueba 1: Migración de Tabla TABLA1
Comparativo LOB
MB LOB
BF
16.510
SF simple
16.510
SF con deduplicación
8.092
SF con compresión y deduplicación
2.880



Conclusiones:
Se puede observar que hay una disminución de un 50% del espacio utilizado al migrar el lob al formato Securefiles solamente con la deduplicación. Como la deduplicación calcula el hash del lob, podría deducirse que la mayor parte de los lobs están duplicados.
El análisis de compresión y deduplicación realizado para la tabla TABLA1 muestra una reducción de aproximadamente 5 veces el tamaño ocupado con respecto a los datos sin comprimir.
No se observaron cambios en el uso del espacio por migrar a SF simple.
Estos valores pueden variar según el contenido de las tablas, por lo cual no siempre se obtendrán estas tasas de reducción.
En este caso se utilizó una tabla con datos reales, y a partir de estos resultados el cliente optó por realizar la migración en ambientes de desarrollo y testing primero, para luego de un período de prueba, realizar la migración en producción.

Para más información consultar el post previo: Migración a SecureFiles.



No hay comentarios:

Publicar un comentario