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.:
Publicar un comentario