Oracle Live

02/06/2016

DBMS_REDEFINITION – Ejemplo de uso

Filed under: Database,Laboratorios — mogukiller @ 2:12 pm

Con el paquete DBMS_REDEFINITION permite modificar las opciones de storage de una tabla. Permite como en este caso pasar de una tabla no particionada a una tabla particionada. Manteniendo todos los objetos dependientes de esa tabla.

'Comprobamos si es posible la refefinicion'

BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE (
   uname => 'MOGU',
   tname => 'UE_USUARIO_TO');
END;
/
'nota: Si no se pudiese daria un error'

'Creamos una tabla temporal con los atributos deseados para la tabla'

/*
SQL>CREATE TABLE "MOGU"."INT_UE_USUARIO_TO"
(       "CO_USUARIO" VARCHAR2(15) NOT NULL ENABLE,
.
.
PARTITION BY RANGE (FX_ALTA) 
  INTERVAL(NUMTOYMINTERVAL(1, 'YEAR'))
    ( PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-1998', 'DD-MM-YYYY')))
TABLESPACE "UE001GDE"; 
*/

'Copiamos los datos de una tabla a otra'

BEGIN
DBMS_REDEFINITION.start_redef_table(
uname => 'MOGU',
orig_table => 'UE_USUARIO_TO',
int_table => 'INT_UE_USUARIO_TO');
END;
/

/*
	Start: 14:28:50
	End	 : 14:30:41
*/

'nota: Copiamos todos los grant que tiene la tabla a la nueva'

/*
OWNER                TABLE_NAME                     LAST_ANALYZED          NUM_ROWS ESTIMATE_SIZE(MB)   SIZE(MB) PAR
-------------------- ------------------------------ -------------------- ---------- ----------------- ---------- ---
MOGU                 INT_UE_USUARIO_TO              2016/06/02 14:30:41    17027117           3406,53       2903 YES
MOGU                 MLOG$_UE_USUARIO_TO                                                                      16 NO
MOGU                 UE_USUARIO_TO                  2016/06/01 22:03:51    17027115           3363,32       2877 NO
*/

'NOTA: la tabla temporal no tiene definido ningun indice'

'Generamos los objetos dependientes' 

DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
	uname	=>'MOGU',
	orig_table 	=>'UE_USUARIO_TO',
	int_table	=>'INT_UE_USUARIO_TO',
	copy_indexes	=> DBMS_REDEFINITION.CONS_ORIG_PARAMS,
	copy_triggers	=> TRUE,
	copy_constraints	=> TRUE,
	copy_privileges		=> TRUE,
	ignore_errors		=> TRUE,
	num_errors			=> num_errors);
	
dbms_output.put_line(num_errors);
END;
/

/* SALIDA:
	0
*/

/*
	Start: 14:42:16
	End	 : 14:48:46
*/


'Comprobamos si se ha producido algun error'

SQL> SELECT OBJECT_NAME, BASE_TABLE_NAME, DDL_TXT,ERR_TXT FROM DBA_REDEFINITION_ERRORS;

'Sincronizamos las dos tablas ya que al ser una operativa online se han producido transacciones'

/*
ORIGEN:		  DESTINO:
CO_USUARIO    CO_USUARIO
-----------   ---------------
0000000E      0000000E
0000000I      0000000I
0000000P      0000000P
0000000Q      0000000Q
00000000      00000000
00000002      
00000003

*/

BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
	UNAME => 'MOGU',
	ORIG_TABLE => 'UE_USUARIO_TO',
	INT_TABLE => 'INT_UE_USUARIO_TO');
END;
/

'Las tablas quedan niveladas'

BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE(
	UNAME => 'MOGU',
	ORIG_TABLE => 'UE_USUARIO_TO',
	INT_TABLE => 'INT_UE_USUARIO_TO');
END;
/

/*
TABLE_NAME           LAST_ANALYZED          NUM_ROWS ESTIMATE_SIZE(MB)   SIZE(MB) PAR
-------------------- -------------------- ---------- ----------------- ---------- ---
INT_UE_USUARIO_TO    2016/06/01 22:03:51    17027115           3363,32       2877 NO
UE_USUARIO_TO        2016/06/02 14:30:41    17027117           3406,53       2903 YES	<<< La tabla productiva es la que esta particionada.
*/

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: