Buscar este blog

jueves, 8 de septiembre de 2016

MIGRACION BLOB


MIGRACION BLOB

Uso de Redefinition:

How to Re-Organize a Table Online (Doc ID 177407.1)

PROPOSITO:

Se deben mover segmentos LOBs desde un DISKGROUP (+MRO_DATA) conformado por discos de 40k,
a un nuevo diskgroup (+MRO_BLOB) con discos SATA VMAX 20k, este diskgroup por 5 discos de 200GB.


La tabla comprometida COR_BLOB_DATA con su campo de tipo BLOB (BLOB_DATA), esta contiene 700GB aprox en segmentos 
de tipo LOB (), esta prueba se realiza en el ambiente MRO rac stress, servidores lstrmrobd01 y lstrmrobd02.



Restrictions
------------
The table to be re-organized:
  * Must have a primary key (restriction should have been lifted in 9.2.0.5. 
    It is possible that there is still a problem with this.)
  * Cannot have User-defined data types
  * Cannot have FILE or LONG columns
  * Cannot be clustered
  * Cannot be in the SYS or SYSTEM schema
  * Cannot have materialized view logs and/or 
                materialized views defined on them
  * Cannot be an horizontal subsetting of data
  * Must be re-organized within the same schema
  * Looses its snapshot logs
  * Can get new columns as part of the re-organization, but the
    new columns must be declared NULL until the re-organization 
    is complete

Proceso
-------

   ------ ------ 5' Table COR_BLOB_DATA_ITERIM se convierte en COR_BLOB_DATA  
   |                       y vice-versa      |
    
   1                                            2
 Source Table           3              Create interim Table 
COR_BLOB_DATA     ---> Start redefinition --->      COR_BLOB_DATA_ITERIM 
               3' data Source to Target   ^      ^          
   ^                                     /       |
   |                                    /        |
   |                                   /         4
   |                                  /    Create constraints 
                                     /     Create indexes
   3''                              /      Create triggers
DML on source table                /
updates/deletes/inserts         5 /Finish redefinition
stored into MLOG$_COR_BLOB_DATA      ------



Step 1: Verificar que la tabla puede ser redefinida online.

Step 2: Crear una tabla de paso vacia con la estructura de la tabla original, aqui
        se puede modificar alguna caracterista en su estructura, por ejemplo advance compress.

Step 3: Comienzo del proceso para redefinir la tabla: 
        dbms_redefinition_start

        Cuando comienza el proceso de redefiniton automaticamente hace esto: 
         
         -> inserts all rows from the source table into the 
            interim table 

         -> crea una tabla snapshot MLOG$_XXX y snapshot log
            almacena los cambios DML temporalmente desde el comienzo al final
            del proceso de redefiniton.


Step 4: Se crean las dependencias de la tabla (constraint, trigger,etc)

Step 5: Fin del proceso de redefinition de la tabla
        dbms_redefinition_finish

        Al terminar el proceso finish_redef_table automaticamente hace esto: 

         -> Aplica todos los cambios DML almacenados en la tabla snapshot dentro de la tabla de paso.

         -> intercambio de nombes entre las 2 tablas, la tabla de paso se
            convierte en la de origen y viceversa.

        NOTA: Hay que tener en cuenta los nombres de constraint e indices no tienen el mismo nombre que antes

Step 6: Borramos la tabla de paso.

Step 7: Para RDBMS version 9.2 hacia delante, las constraints e indices puede ser 
        renombrados con ALTER TABLE ... RENAME CONSTRAINT ... 
   

Para esta actividad:
---------------------------
--> La estructura de la tabla:

    SQL> desc EXMRO.COR_BLOB_DATA
    Name                                  Null?    Type
    ------------------------------------- -------- ---------------
     BLOB_DB_ID                                                    NOT NULL NUMBER(10)
     BLOB_ID                                                           NOT NULL NUMBER(10)
     BLOB_DATA                                                      BLOB
     RSTAT_CD                                                         NUMBER(3)
     CREATION_DT                                                  DATE
     REVISION_DT                                                   DATE
     REVISION_DB_ID                                             NUMBER(10)
     REVISION_USER                                              VARCHAR2(30)
     ORIG_CREATION_DT                                       DATE

--> la tabla contiene 1.031.453 filas antes de la re-organization:

    SQL> select count(*) from EXMRO.COR_BLOB_DATA;

      COUNT(*)
    ----------
        1.031.453
   ----------------------------------------------------------------------------------
1. Vemos si la tabla puede ser redefinida online re-organization 
   -----------------------------------------------------------------------------------
   SQL> connect sys/xxx as sysdba
   Connected.

   SQL> grant execute on dbms_redefinition to test;
   Grant succeeded.

   SQL> connect test/test
   Connected.

   SQL> execute DBMS_REDEFINITION.CAN_REDEF_TABLE('EXMRO','COR_BLOB_DATA_ITERIM');
   PL/SQL procedure successfully completed.


   ------------------------------------------------------------
2. Creamos la tabla de paso con su nueva estructura, apuntando 
   al nuevo tablespace del nuevo diskgroup
   ------------------------------------------------------------
  
   CREATE TABLE EXMRO.COR_BLOB_DATA_ITERIM
   (
     BLOB_DB_ID        NUMBER(10)                  NOT NULL,
     BLOB_ID           NUMBER(10)                  NOT NULL,
     BLOB_DATA         BLOB,
     RSTAT_CD          NUMBER(3),
     CREATION_DT       DATE,
     REVISION_DT       DATE,
     REVISION_DB_ID    NUMBER(10),
     REVISION_USER     VARCHAR2(30 BYTE),
     ORIG_CREATION_DT  DATE                        DEFAULT SYSDATE
   )
   LOB (BLOB_DATA) STORE AS (
     TABLESPACE  EXMRO_BLOB_TEST
     ENABLE      STORAGE IN ROW
     CHUNK       8192
     RETENTION
     NOCACHE
     LOGGING
         STORAGE    (
                     INITIAL          256K
                     NEXT             256K
                     MINEXTENTS       1
                     MAXEXTENTS       UNLIMITED
                     PCTINCREASE      0
                     BUFFER_POOL      DEFAULT
                     FLASH_CACHE      DEFAULT
                     CELL_FLASH_CACHE DEFAULT
                    ))
   TABLESPACE EXMRO
   RESULT_CACHE (MODE DEFAULT)
   PCTUSED    0
   PCTFREE    10
   INITRANS   1
   MAXTRANS   255
   STORAGE    (
               INITIAL          256K
               NEXT             256K
               MAXSIZE          UNLIMITED
               MINEXTENTS       1
               MAXEXTENTS       UNLIMITED
               PCTINCREASE      0
               BUFFER_POOL      DEFAULT
               FLASH_CACHE      DEFAULT
               CELL_FLASH_CACHE DEFAULT
              )
   LOGGING 
   NOCOMPRESS 
   NOCACHE
   NOPARALLEL
   MONITORING;

   ----------------------------------------------------
3. Comienzo proceso de re-organization 
   ----------------------------------------------------

cd /home/oracle/dbacore/bca/lob

nohup ./3.start.sh &

[oracle@lstrmrobd01 lob]$ more 3.start.sh
#!/bin/sh
sqlplus / as sysdba << EOF > ./output.log
set timi on
spool redef.log

BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE
 (uname=>'EXMRO',
 orig_table=>'COR_BLOB_DATA',
 int_table=>'COR_BLOB_DATA_ITERIM',
 options_flag=>DBMS_REDEFINITION.CONS_USE_ROWID);
end;
/
EOF

Si se realiza con un usuario creado para la actividad debe tener los siguientes GRANT:

     * CREATE ANY TABLE 
     * ALTER ANY TABLE 
     * DROP ANY TABLE 
     * LOCK ANY TABLE 
     * SELECT ANY TABLE
     * CREATE ANY INDEX
     * CREATE ANY TRIGGER 


   SQL> select sql_text from v$sqlarea where sql_text like '%ITERIM%';


 Esto hace el redefinition cuando se ejecuta el start_redefinition:


INSERT /*+ BYPASS_RECURSIVE_CHECK APPEND SKIP_UNQ_UNUSABLE_IDX */ INTO "EXMRO"."COR_BLOB_DATA_ITERIM"(M_ROW$$,"BLOB_DB_ID","BLOB_ID","BLOB_DATA","RSTAT_CD","CREATION_DT","REVISION_DT","REVISION_DB_ID","REVISION_USER",
"ORIG_CREATION_DT") SELECT "COR_BLOB_DATA"."ROWID","COR_BLOB_DATA"."BLOB_DB_ID","COR_BLOB_DATA"."BLOB_ID","COR_BLOB_DATA".
"BLOB_DATA","COR_BLOB_DATA"."RSTAT_CD","COR_BLOB_DATA"."CREATION_DT","COR_BLOB_DATA"."REVISION_DT","COR_BLOB_DATA"."
REVISION_DB_ID","COR_BLOB_DATA"."REVISION_USER","COR_BLOB_DATA"."ORIG_CREATION_DT" FROM "EXMRO".
"COR_BLOB_DATA" "COR_BLOB_DATA"


El proceso de redefinition utiliza HINT no documentado (BYPASS_RECURSIVE_CHECK) para forzar el uso del CBO de un EXPLAIN_PLAN correcto, 
que no admita otro camino para el proceso de INSERT y SKIP_UNQ_UNUSABLE_IDX (le dice al optimizador que se salte los indices inutilizables)


   SQL> select master,log_table from dba_mview_logs;

   MASTER                         LOG_TABLE
   ------------------------------ ------------------------------
   COR_BLOB_DATA                  MLOG$_COR_BLOB_DATA


   SQL> select mview_name,container_name, build_mode from dba_mviews;

 MVIEW_NAME                     CONTAINER_NAME                 BUILD_MOD
 ------------------------------ ------------------------------ ---------

 COR_BLOB_DATA_ITERIM           COR_BLOB_DATA_ITERIM           PREBUILT


   -----------------------------------------------------
4. Create constraints on the interim table
   -----------------------------------------------------

   Este punto no aplica.

   ------------------------------------------------------------
5. Simulamos actividad DML en la tabla origen
   -------------------------------------------------------------

   No Aplica

   --------------------------------------------------------------------------------
6. Se puede sincronizar la tabla con las nuevas transacciones
   --------------------------------------------------------------------------------

   BEGIN
   DBMS_REDEFINITION.SYNC_ITERIM_TABLE ('EXMRO, 'COR_BLOB_DATA', 'COR_BLOB_DATA_ITERIM');
   end;
   /

   PL/SQL procedure successfully completed.

   

   --------------------------------------------------------------
7. Previlegios necesarios para la tabla de paso.
   -----------------------------------------------------------------

   SQL> select * from USER_TAB_PRIVS_MADE;


   SQL> grant select, update on COR_BLOB_DATA_ITERIM to test;
   Grant succeeded.

   ---------------------------------------------------
8. Finalizamos porceso de re-organization
   ---------------------------------------------------



    PL/SQL procedure successfully completed.


   ----------------------------------
9. Limpiamos la tabla de paso
   ----------------------------------

    SQL> drop table COR_BLOB_DATA_ITERIM ;
    Table dropped.


    ----------------------------------
10. Renombramos las constraints
    ----------------------------------
Para las versiones RDBMS version 9.2, se puede renombrar las constraints:

Ejemplo:

    SQL> alter table emp rename constraint INT_EMP_PK to EMP_PK ;                        
    Table altered.



Nota
----

En ocasiones es necesario interrumpir el proceso de redefinition, para esto
se usa lo siguiente:


SQL>  execute dbms_redefinition.abort_redef_table('EXMRO','COR_BLOB_DATA','COR_BLOB_DATA_ITERIM');
PL/SQL procedure successfully completed.


11. Para monitorear el proceso de redefinition, consultamos lo siguiente:

[oracle@lstrmrobd01 lob]$ more longops.sql
set linesize 120
col opname format a20
col target format a15
col units format a10
col time_remaining format 99999990 heading Remaining[s]
col bps format 9990.99 heading [Units/s]
col fertig format 90.99 heading "complete[%]"
select sid,
       opname,
       target,
       sofar,
       totalwork,
       units,
       (totalwork-sofar)/time_remaining bps,
       time_remaining,
       sofar/totalwork*100 fertig
from   v$session_longops
where  time_remaining > 0
order by 9
/


SQL> @longops

       SID OPNAME               TARGET               SOFAR  TOTALWORK UNITS      [Units/s] Remaining[s] complete[%]
---------- -------------------- --------------- --------- ---------- ---------- --------- ------------ -----------
      3978 Table Scan           EXMRO.COR_BLOB_DATA  19423      21125 Blocks          0.20         8396       91.94
                                

12. Para optimizar el proceso de redefinition


Unos de los parametros del spfile, PARALLEL_THREADS_PER_CPU = 1
que esta seteado, para poder subir este parametro y ejecutar parallel query, se realizara una prueba
aparte , ademas se investiga este parametro y otros que pudiesen afectar el rendimiento de este proceso.

ALTER SESSION FORCE PARALLEL QUERY;
ALTER SESSION FORCE PARALLEL DML PARALLEL 8;
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8;


 

No hay comentarios.: