viernes, 16 de febrero de 2018

Nuevas funcionalidades de Oracle Datapump 12c Release 2

Continuando con las nuevas funcionalidades de Datapump en Oracle 12c. Ahora nos toca revisar las funcionalidades nuevas para la versión Oracle 12c Release 2. 



1.    Exportación e importación de la Metadata en paralelo

Hasta la versión Oracle 12c Release 1, por más que uno define la opción PARALLEL a una operación de exportación o importación de Metadata, esta acción se realizaba de manera serial.

En la versión Oracle 12c Release 2, ya es posible realizar la exportación e importación en paralelo. 
Si la base de datos contiene información de tablas e índices particionados, la exportación de la Metadata de cada partición puede ejecutarse de manera paralela. Además, durante una importación, es posible realizar la creación de índices y constraint en forma paralela.

expdp system@ORCL DUMPFILE=METADATA_DB_%U.dmp LOGFILE=exp_meta_full.log DIRECTORY=EXP_DIR FULL=Y CONTENT=METADATA_ONLY PARALLEL=2

Export: Release 12.2.0.1.0 - Production on Sat Feb 10 21:24:01 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Password:

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "SYSTEM"."SYS_EXPORT_FULL_01":  system/********@ORCL DUMPFILE=METADATA_DB_%U.dmp LOGFILE=exp_meta_full.log DIRECTORY=EXP_DIR FULL=Y CONTENT=METADATA_ONLY PARALLEL=2

Dump file set for SYSTEM.SYS_EXPORT_FULL_01 is:
  /u01/dump/METADATA_DB_01.dmp
  /u01/dump/METADATA_DB_02.dmp
Job "SYSTEM"."SYS_EXPORT_FULL_01" successfully completed


 2.    Parfile en el log de Oracle Datapump

Cuando ejecutar el comando EXPDP o IMPDP junto al parámetro PARFILE. El contenido del archive se imprime en el log del comando ejecutado. 
Esta funcionalidad es muy útil para poder revisar la ejecución de una operación de exportación cuando no conocemos el procedimiento que se ha utilizado.

Creamos un Parfile de ejemplo

[oracle@oracle12c dump]$ cat parfileDUMP.txt
DUMPFILE=dump_SH_OE%U.dmp
LOGFILE=exp_SH_OE.log
DIRECTORY=EXP_DIR
SCHEMAS=HR,OE
PARALLEL=2

Ejecutamos el comando EXPDP y utilizamos el Parfile.

expdp system@ORCL parfile=parfileDUMP.txt

Export: Release 12.2.0.1.0 - Production on Sat Feb 10 21:43:15 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Password:

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@ORCL parfile=parfileDUMP.txt

Revisamos el log de la ejecución y observamos los parámetros del Parfile definidos.

[oracle@oracle12c dump]$ cat exp_SH_OE.log
;;;
Export: Release 12.2.0.1.0 - Production on Sat Feb 10 21:43:15 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
;;;
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
;;; **************************************************************************
;;; Parfile values:
;;;  parfile:  parallel=2
;;;  parfile:  schemas=HR,OE
;;;  parfile:  directory=EXP_DIR
;;;  parfile:  logfile=exp_SH_OE.log
;;;  parfile:  dumpfile=dump_SH_OE%U.dmp
;;; **************************************************************************
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@ORCL parfile=parfileDUMP.txt


3.    Nuevas opciones para nombrar los archivos Dump.

En versiones anteriores cuando se realiza una operación de exportación en paralelo, se debe colocar la variable %U en el nombre de los archivos Dump.  Es necesario para poder diferenciar los nombres de los diferentes archivos generados. %U utiliza una variable numérica que puede ir de 00 a 99.

En Oracle 12c Release 2 tenemos nuevas opciones para poder nombrar los archivos Dumps. Los más utilizados son:
·         %T o %t: Define la fecha en formato YYYYMMDD
·         %L o %l: Realiza la misma operación que la variable %U, pero expande su límite hasta 10 dígitos (valor límite: 2147483646)

También podemos utilizar las variables que identifican solo una porción de la fecha actual.
·         %D o %d :  Define el día en formato DD
·         %M o %m: Define el mes en formato MM
·         %Y o %y: Define el año en formato YYYY

Ejecutamos el comando EXPDP y verificamos el nombre de los archivos generados.

expdp system@ORCL DUMPFILE=FULL_DB_%T_%L.dmp LOGFILE=exp_bd_full.log DIRECTORY=EXP_DIR FULL=Y PARALLEL=4

Export: Release 12.2.0.1.0 - Production on Sun Feb 11 01:24:55 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Password:

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "SYSTEM"."SYS_EXPORT_FULL_01":  system/********@ORCL DUMPFILE=FULL_DB_%T_%L.dmp LOGFILE=exp_bd_full.log DIRECTORY=EXP_DIR FULL=Y PARALLEL=4
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_FULL_01 is:
  /u01/dump/FULL_DB_20180211_01.dmp
  /u01/dump/FULL_DB_20180211_02.dmp
  /u01/dump/FULL_DB_20180211_03.dmp
  /u01/dump/FULL_DB_20180211_04.dmp


4.    Nuevos valores para el parámetro DATA_OPTION con EXPDP

El parámetro DATA_OPTION tiene nuevas opciones tanto para EXPDP como IMPDP.
Detallemos primero las opciones para EXPDP.

4.1  GROUP_PARTITION_TABLE_DATA

Indica al Datapump que cargue la información de una tabla particionada en una sola operación, en lugar de cargar las particiones por separado.  
La definición de la tabla no se toma en cuenta al momento de hacer el importado, lo que permite realizar la tarea mucho más rápido.

Es importante aclarar que la estructura de la tabla se mantiene sin cambios. Esta opción solo permite acelerar la operación de exportación e importación.

Ejecutamos el comando EXPDP sin la opción GROUP_PARTITION_TABLE_DATA y observamos como exporta las particiones de una tabla.

expdp system@ORCL DUMPFILE=SH_SALES2.dmp LOGFILE=exp_SH_SALES2.log DIRECTORY=EXP_DIR TABLES=SH.SALES
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/BITMAP_INDEX/INDEX
. . exported "SH"."SALES":"SALES_Q4_2001"                2.258 MB   69749 rows
. . exported "SH"."SALES":"SALES_Q3_1999"                2.166 MB   67138 rows
. . exported "SH"."SALES":"SALES_Q3_2001"                2.130 MB   65769 rows
. . exported "SH"."SALES":"SALES_Q2_2001"                2.051 MB   63292 rows
. . exported "SH"."SALES":"SALES_Q1_1999"                2.071 MB   64186 rows
. . exported "SH"."SALES":"SALES_Q1_2001"                1.965 MB   60608 rows
. . exported "SH"."SALES":"SALES_Q4_1999"                2.014 MB   62388 rows
. . exported "SH"."SALES":"SALES_Q1_2000"                2.012 MB   62197 rows
. . exported "SH"."SALES":"SALES_Q3_2000"                1.910 MB   58950 rows
. . exported "SH"."SALES":"SALES_Q4_2000"                1.814 MB   55984 rows
Master table "SYSTEM"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
.
.
elapsed 0 00:00:37

Ejecutamos nuevamente el comando EXPDP, pero con la opción GROUP_PARTITION_TABLE_DATA y observamos que la tabla se exporta de una sola operación y un poco más rápido.

expdp system@ORCL DUMPFILE=SH_SALES.dmp LOGFILE=exp_SH_SALES.log DIRECTORY=EXP_DIR TABLES=SH.SALES DATA_OPTIONS=GROUP_PARTITION_TABLE_DATA
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type TABLE_EXPORT/TABLE/INDEX/BITMAP_INDEX/INDEX
. . exported "SH"."SALES"                                29.62 MB  918843 rows
Master table "SYSTEM"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
.
.
elapsed 0 00:00:35


4.2  VERIFY_STREAM_FORMAT

Valida el formato de la data antes que se escriba en los archivos Dumps.  Esto permite asegurarnos que no hay errores en los archivos Dumps generados. 
Puede ser útil para archivos Dumps que serán almacenados en discos externos o Cintas.

expdp system@ORCL DUMPFILE=HR_valid.dmp LOGFILE=exp_HR_valid.log DIRECTORY=EXP_DIR SCHEMAS=HR DATA_OPTIONS=VERIFY_STREAM_FORMAT

Export: Release 12.2.0.1.0 - Production on Sun Feb 11 03:25:56 2018

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@ORCL DUMPFILE=HR_valid.dmp LOGFILE=exp_HR_valid.log DIRECTORY=EXP_DIR SCHEMAS=HR DATA_OPTIONS=VERIFY_STREAM_FORMAT
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /u01/dump/HR_valid.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Feb 11 03:26:52 2018 elapsed 0 00:00:53


5.    Nuevos valores para el parámetro DATA_OPTION con IMPDP

Ahora veremos las opciones para IMPDP

5.1  TRUST_EXISTING_TABLE_PARTITIONS

La opción TRUST_EXISTING_TABLE_PARTITIONS le indica al Datapump que la estructura de una tabla particionada ya existe en la base de datos destino y es igual a la base de datos origen.  De tal manera, Datapump puede realizar la importación de datos en paralelo en las diferentes particiones.  
Si la estructura no es igual podría darse un error de carga.

ORA-31693: Table data object "SH"."SALES ":"SALES_Q3_2001" failed to load/unload and is being skipped due to error:
ORA-29913: error in executing ODCIEXTTABLEFETCH callout
ORA-14401: inserted partition key is outside specified partition

Para explicarlo mejor, revisamos el siguiente ejemplo. 

Cuando realizamos operaciones de exportación e importación sobre una tabla particionada, esta operación se realiza de manera serial, por más que uno le define paralelismo.  El paralelismo ayuda en diferentes tablas, pero no en particiones de una tabla.
Lo podemos observar en la siguiente tarea de exportación con la opción METRICS=Y (una tarea de importación funciona de igual manera)

expdp system@ORCL DUMPFILE=SH_SALES3_%U.dmp LOGFILE=exp_SH_SALES3.log DIRECTORY=EXP_DIR TABLES=SH.SALES METRICS=Y PARALLEL=2

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "SYSTEM"."SYS_EXPORT_TABLE_01":  system/********@ORCL DUMPFILE=SH_SALES3_%U.dmp LOGFILE=exp_SH_SALES3.log DIRECTORY=EXP_DIR TABLES=SH.SALES METRICS=Y PARALLEL=2
W-1 Startup took 0 seconds
W-2 Startup took 1 seconds
W-1 . . exported "SH"."SALES":"SALES_Q4_2001"                2.258 MB   69749 rows in 0 seconds using direct_path
W-1 . . exported "SH"."SALES":"SALES_Q3_1999"                2.166 MB   67138 rows in 0 seconds using direct_path
W-1 . . exported "SH"."SALES":"SALES_Q3_2001"                2.130 MB   65769 rows in 1 seconds using direct_path
W-1 . . exported "SH"."SALES":"SALES_Q2_2001"                2.051 MB   63292 rows in 0 seconds using direct_path
W-1 . . exported "SH"."SALES":"SALES_Q1_1999"                2.071 MB   64186 rows in 0 seconds using direct_path
W-1 . . exported "SH"."SALES":"SALES_Q1_2001"                1.965 MB   60608 rows in 0 seconds using direct_path
W-1 . . exported "SH"."SALES":"SALES_Q4_1999"                2.014 MB   62388 rows in 0 seconds using direct_path

Ahora, volvemos a ejecutar la importación en la base de datos, pero con la opción TRUST_EXISTING_TABLE_PARTITIONS, además utilizamos la opción TABLE_EXISTS_ACTION = TRUNCATE.
Vamos a observar que tanto el proceso W-1 y W-2 realizan la cargar los datos en cada partición.

impdp system@PRD DUMPFILE=SH_SALES3_%U.dmp LOGFILE=imp_SH_SALES3.log DIRECTORY=IMP_DIR TABLES=SH.SALES METRICS=Y PARALLEL=2 TABLE_EXISTS_ACTION = TRUNCATE DATA_OPTIONS=TRUST_EXISTING_TABLE_PARTITIONS

Import: Release 12.2.0.1.0 - Production on Sun Feb 11 03:56:03 2018

W-1 Startup took 0 seconds
W-1 Master table "SYSTEM"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_TABLE_01":  system/********@PRD DUMPFILE=SH_SALES3_%U.dmp LOGFILE=imp_SH_SALES3.log DIRECTORY=IMP_DIR TABLES=SH.SALES METRICS=Y PARALLEL=2 TABLE_EXISTS_ACTION=TRUNCATE DATA_OPTIONS=TRUST_EXISTING_TABLE_PARTITIONS
W-1 Processing object type TABLE_EXPORT/TABLE/TABLE
W-1 Table "SH"."SALES" exists and has been truncated. Data will be loaded but all dependent metadata will be skipped due to table_exists_action of truncate
W-1      Completed 1 TABLE objects in 4 seconds
W-1      Completed by worker 1 1 TABLE objects in 4 seconds
W-1 Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
W-2 Startup took 6 seconds
W-1 . . imported "SH"."SALES":"SALES_Q4_2001"                2.258 MB   69749 rows in 5 seconds using external_table
W-2 . . imported "SH"."SALES":"SALES_Q1_1999"                2.071 MB   64186 rows in 4 seconds using external_table
W-2 . . imported "SH"."SALES":"SALES_Q1_2001"                1.965 MB   60608 rows in 3 seconds using external_table
W-1 . . imported "SH"."SALES":"SALES_Q3_1999"                2.166 MB   67138 rows in 5 seconds using external_table
W-2 . . imported "SH"."SALES":"SALES_Q4_1999"                2.014 MB   62388 rows in 4 seconds using external_table
W-1 . . imported "SH"."SALES":"SALES_Q3_2001"                2.130 MB   65769 rows in 3 seconds using external_table
W-2 . . imported "SH"."SALES":"SALES_Q1_2000"                2.012 MB   62197 rows in 2 seconds using external_table
W-2 . . imported "SH"."SALES":"SALES_Q3_2000"                1.910 MB   58950 rows in 3 seconds using external_table
W-1 . . imported "SH"."SALES":"SALES_Q2_2001"                2.051 MB   63292 rows in 5 seconds using external_table
W-2 . . imported "SH"."SALES":"SALES_Q4_2000"                1.814 MB  


5.2   VALIDATE_TABLE_DATA

Durante las tareas de importación; Datapump valida los campos de Numero y Fecha de una tabla antes de realizar la carga de datos.  Ante algún error podría devolver un mensaje de error.

ORA-02374: conversion error loading table "HR"."EMPLOYEES"
ORA-12899: value too large for column C1 (actual: 500, maximum: 498)
ORA-02372: data for row: C8 : '

Esta opción podría servir de mucho cuando estamos haciendo migraciones de base de datos con diferente CHARACTER SET.

impdp system@PRD DUMPFILE=HR_schema.dmp LOGFILE=imp_HR1.log DIRECTORY=IMP_DIR SCHEMAS=HR DATA_OPTIONS=VALIDATE_TABLE_DATA

Import: Release 12.2.0.1.0 - Production on Sun Feb 11 08:31:57 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.


6.    Nuevas opciones para NETWORK_LINK

El parámetro NETWORK_LINK es un parámetro bastante utilizado porque nos permite realizar operaciones de importación sin necesidad de archivos Dumps.  Lastimosamente, tiene sus limitaciones.   En Oracle 12c reléase 2 algunas de esas limitaciones han sido superadas.
Entre ellas tenemos

·         Soporte de Tipos de datos LONG. Una tabla con este tipo de dato, no utiliza el procedimiento común de INSERT AS SELECT sino el procedimiento OCIDirPathUnload.
 ·         El parámetro ACCESS_METHOD ya puede ser utilizado junto con NETWORK_LINK
 ·         Compresión de datos por la red con los parámetros DATA_OPTIONS = ENABLE_NETWORK_COMPRESSION y ACCESS_METHOD = DIRECT_PATH. La compresión se realiza en la base de datos origen y luego se envía por la red. 
Finalmente, la data se descomprime al llegar a la base de datos destino.

impdp system@PRD LOGFILE=imp_SH.log SCHEMAS=SH NETWORK_LINK=orcl DATA_OPTIONS=ENABLE_NETWORK_COMPRESSION ACCESS_METHOD=DIRECT_PATH

Import: Release 12.2.0.1.0 - Production on Sun Feb 11 08:31:57 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.


7.    Cambio de nombre de directorio para datafiles

Cuando deseamos cambiar el nombre a un Datafile durante una importación, utilizamos la opción REMAP_DATAFILE, pero si es una gran cantidad de archivos, es difícil realizar el cambio de nombre uno a uno. 
En Oracle 12c reléase 2 podemos utilizar la opción REMAP_DIRECTORY para poder cambiar el nombre de todo un grupo de datafiles que se encuentran en un directorio especifico. Los parámetros REMAP_DATAFILE y REMAP_DIRECTORY no pueden ser definidos en un mismo comando IMPDP.

Ejecutamos una exportación del tablespace USERS

expdp system@ORCL DUMPFILE=USER_tbs.dmp LOGFILE=exp_USER_tbs.log DIRECTORY=EXP_DIR TABLESPACES=USERS


Realizamos la importación en la base de datos destino con las opciones
·         REMAP_TABLESPACE para cambiar el nombre al tablespace
·         REMAP_DIRECTORY para crear los datafiles en otro directorio.

impdp system@PRD DUMPFILE=USER_tbs.dmp LOGFILE=imp_USER_tbs.log DIRECTORY=IMP_DIR REMAP_TABLESPACE=USERS:USERS2 REMAP_DIRECTORY="'+DG_DATA':'+DG_FRA'"




Espero les pueda servir de ayuda.

No hay comentarios.:

Publicar un comentario