Buscar este blog

lunes, 26 de septiembre de 2016

RE-CREAR TBS UNDOTBS ORACLE RAC

COMO RE-CREAR TABLESPACE UNDOTBS EN ORACLE RAC de 4 nodos:

EL UNDO UNDOTBS4 esta mal construido, se debe re crear con los valores correctos,
este undo pertenece a la instancia 4 del RAC, para esto se debe trabajar en el nodo
4.

AUTOEXTENT de 1024M
MAXSIZE    de 20480M
SIZE       de 1024M

1.- Creamos un UNDO de PASO:
Nos conectamos al nodo 4 del RAC.

CREATE UNDO TABLESPACE UNDOTBS5 DATAFILE '+CROSS_DATA' SIZE 1024M
REUSE AUTOEXTEND ON NEXT 1024M MAXSIZE 20480M;

ALTER system SET undo_tablespace=UNDOTBS5 sid='cross4';


2.- Revisamos si tenemos segmentos de UNDO:

 SELECT a.name,b.status , d.username , d.sid , d.serial#
   FROM v$rollname a,v$rollstat b, v$transaction c , v$session d
   WHERE a.usn = b.usn
   AND a.usn = c.xidusn
   AND c.ses_addr = d.saddr
   AND a.name IN (
   SELECT segment_name
   FROM dba_segments
   WHERE tablespace_name = 'UNDOTBS4'
   );


select owner, segment_name, tablespace_name, status from dba_rollback_segs where tablespace_name='UNDOTBS4' and status='ONLINE';

 alter rollback segment "_SYSSMU31_2521593980$" offline;
 alter rollback segment "_SYSSMU32_1804532818$" offline;       
 alter rollback segment "_SYSSMU33_3611631434$" offline;                      
 alter rollback segment "_SYSSMU34_1975830645$" offline;                      
 alter rollback segment "_SYSSMU35_1514068533$" offline;                      
 alter rollback segment "_SYSSMU36_412588268$ " offline;                      
 alter rollback segment "_SYSSMU37_1727375658$" offline;                      
 alter rollback segment "_SYSSMU38_4056056697$" offline;                      
 alter rollback segment "_SYSSMU39_1922814765$" offline;                      
 alter rollback segment "_SYSSMU40_1873340872$" offline;


REFERENCIA: http://neeraj-dba.blogspot.cl/2011/05/how-to-drop-undo-tablespace.html


3.- Borramos el UNDOTBS4 de paso:

DROP tablespace UNDOTBS4 including contents and datafiles;


4.- Ahora podemos re crear el UNDOTBS4 con la correccion de estructura:


CREATE UNDO TABLESPACE UNDOTBS4 DATAFILE '+CROSS_DATA' SIZE 1024M
REUSE AUTOEXTEND ON NEXT 1024M MAXSIZE 20480M;

ALTER system SET undo_tablespace=UNDOTBS4 sid='cross4';



5.- Ahora borramos el UNDO de PASO. UNDOTBS5


DROP tablespace UNDOTBS5 including contents and datafiles;



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;