jueves, 17 de octubre de 2019

Nuevas funcionalidades de Oracle Datapump 12c Release 1 y 2

Nuevas funcionalidades de Oracle Datapump 12c Release 1 y 2

Por Jorge Zorrilla
Publicado en Marzo 2018

Revisado por Francisco Riccio



Una de las funcionalidades mas usadas en la base de datos Oracle es Oracle Datapump.  La utilizamos para migrar bases de datos, mover bases de datos a diferentes tipos de servidores, desfragmentar tablas con mucha operación, realizar Transport Tablespace e inclusive para realizar Backups de la base de datos; aunque este último no es una práctica recomendada.

Datapump es una herramienta muy útil para los DBAs y, con la nueva versión Oracle 12c, no podía quedarse sin tener mejoras que nos podrían ayudar en diferentes tareas.

A continuación, voy a detallar las mejoras para Oracle 12c Release 1 y reléase 2 por separado.


Oracle 12c Release 1



1. Deshabilitar el Logging en el IMPDP
¿Cuántas veces hemos ejecutado una importación de un esquema grande y nuestro Flash Recovery Area se llena por generación Archivelogs?  En muchas ocasiones debemos poner la base de datos en modo NO ARCHIVE para poder realizar la importación de manera rápida y sin problemas.

En Oracle 12c se utiliza el parámetro TRANSFORM junto a la opción DISABLE_ARCHIVE_LOGGING para deshabilitar la generación de Logging sobre tablas e índices durante la ejecución de una importación.  Muy útil para cargas de gran volumen de datos y de manera más rápida.

Realizamos el exportado de un esquema completo en la base de datos origen.

expdp system@ORCL DUMPFILE=SH_user.dmp LOGFILE=exp_SH.log
DIRECTORY=EXP_DIR SCHEMAS=SH


Realizamos la importación del esquema en la base de datos destino con la opcion de generación de Logging deshabilitada.

impdp system@PRD DUMPFILE=SH_user.dmp LOGFILE=imp_SH.log
DIRECTORY=IMP_DIR SCHEMAS=SH TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y




2. Compresión de tablas durante el IMPDP
Usamos la opción TRANSFORM junto con el parámetro TABLE_COMPRESSION_CLAUSE para definir el tipo de compresión que se le aplica a una tabla durante la ejecución de IMPDP sobre la base de datos destino.

Revisamos el tamaño de una tabla en el origen y luego realizamos una exportación de la misma

SQL> select owner, segment_name, bytes/1024/1204 MBytes  from dba_segments where segment_name='CUSTOMERS' and owner='SH';

OWNER         SEGMENT_NAME                    MBYTES
------------- ------------------------------ ----------
SH            CUSTOMERS                       10.73

[oracle@oracle12c dump]$ expdp system@ORCL DUMPFILE=customer.dmp LOGFILE=exp_customer.log DIRECTORY=EXP_DIR TABLES=SH.CUSTOMERS


Realizamos la importación con la opción de compresión en la base de datos destino. Las opciones para el parámetro TABLE_COMPRESSION_CLAUSE son:
  • NONE
  • NOCOMPRESS
  • COMPRESS 
  • ROW STORE COMPRESS BASIC
  • ROW STORE COMPRESS ADVANCED
  • COLUMN STORE COMPRESS FOR QUERY
  • COLUMN STORE COMPRESS FOR ARCHIVE

Prestar atención a como se define las compresiones con espacios en blanco.

impdp system@PRD DUMPFILE=customer.dmp LOGFILE=imp_customer.log
DIRECTORY=IMP_DIR TRANSFORM=TABLE_COMPRESSION_CLAUSE:\"ROW STORE COMPRESS
ADVANCED\"

Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SH"."CUSTOMERS"                      10.27 MB   55500 rows
Processing object type TABLE_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT


Finalmente verificamos si la tabla fue importada con la compresión activada.

SQL> select OWNER, TABLE_NAME, COMPRESSION, COMPRESS_FOR from dba_tables where owner='SH' and table_name='CUSTOMERS';

OWNER    TABLE_NAME      COMPRESS COMPRESS_FOR
-------- --------------- -------- --------------
SH       CUSTOMERS       ENABLED  ADVANCED


SQL> select owner,segment_name, bytes/1024/1204 MBytes  from dba_segments where segment_name='CUSTOMERS' and owner='SH';

OWNER         SEGMENT_NAME       MBYTES
------------- -------------- ----------
SH            CUSTOMERS            5.95




3. Convertir Vistas en Tablas
Mediante la opción VIEWS_AS_TABLES podemos exportar una vista como si fuera una tabla. 
Datapump guarda la definición de la nueva tabla y los objetos dependientes de la vista original. Los permisos asociados a la vista son replicados en la nueva tabla. 
Muy útil para mover información de diferentes tablas relacionadas hacia tablas consolidadas y para importar a tablas Des-normalizadas.

Creamos una vista simple y verificamos el objeto.

SQL> create view hr.EMP_VIEW as select e.EMPLOYEE_ID, e.FIRST_NAME||' '||e.LAST_NAME "NOMBRE",
e.HIRE_DATE, j.JOB_TITLE, d.DEPARTMENT_NAME from hr.EMPLOYEES e, hr.DEPARTMENTS d, hr.JOBS
j where e.JOB_ID = j.JOB_ID and e.DEPARTMENT_ID = d.DEPARTMENT_ID order by e.EMPLOYEE_ID;

View created.

SQL> select OWNER, OBJECT_NAME, OBJECT_TYPE, CREATED, STATUS from dba_objects where OBJECT_NAME='EMP_VIEW';

OWNER      OBJECT_NAME      OBJECT_TYPE   CREATED   STATUS
---------- ---------------- ------------- --------- -------
HR         EMP_VIEW         VIEW          10-FEB-18 VALID



Realizamos la transformación desde la ejecución EXPDP.

expdp system@ORCL DUMPFILE=vista_tabla.dmp LOGFILE=exp_vista.log
DIRECTORY=EXP_DIR VIEWS_AS_TABLES=HR.EMP_VIEW

impdp system@PRD DUMPFILE=vista_tabla.dmp LOGFILE=imp_tabla.log
DIRECTORY=IMP_DIR REMAP_TABLE=EMP_VIEW:EMP_TBL



Verificamos que la vista se ha convertido en tabla y con un nuevo nombre EMP_TBL en la base de datos destino.

SQL> select OWNER, OBJECT_NAME, OBJECT_TYPE, CREATED, STATUS from dba_objects where OBJECT_NAME='EMP_TBL';

OWNER    OBJECT_NAME        OBJECT_TYPE   CREATED   STATUS
-------- ------------------ ------------- --------- -------
HR       EMP_TBL            TABLE         10-FEB-18 VALID




4. Mostrar el tiempo en las ejecuciones Datapump
Usamos la opción LOGTIME durante la exportación o importación para mostrar la fecha y hora de cada registro del Log.  Es una funcionalidad simple, pero nos podría ayudar en toma de tiempos de ejecución.  Los valores que permite esta opción son: NONE, STATUS, LOGFILE, ALL

Ejecutamos el EXPDP y observamos el log.

expdp system@ORCL DUMPFILE=HR_OE.dmp LOGFILE=exp_HR_OE.log
DIRECTORY=EXP_DIR SCHEMAS=HR,OE LOGTIME=ALL

Export: Release 12.2.0.1.0 - Production on Sat Feb 10 17:49:20 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
10-FEB-18 17:49:36.337: Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01": 
system/********@ORCL DUMPFILE=HR_OE.dmp LOGFILE=exp_HR_OE.log DIRECTORY=EXP_DIR
SCHEMAS=HR,OE LOGTIME=ALL
10-FEB-18 17:49:45.080: Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
10-FEB-18 17:49:46.289: Processing object type
SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
10-FEB-18 17:49:46.471: Processing object type
SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICS
10-FEB-18 17:49:46.868: Processing object type
SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
10-FEB-18 17:49:55.992: Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
10-FEB-18 17:49:56.866: Processing object type SCHEMA_EXPORT/USER
10-FEB-18 17:49:57.110: Processing object type SCHEMA_EXPORT/SYSTEM_GRANT 10-FEB-18 17:49:57.251: Processing object type SCHEMA_EXPORT/ROLE_GRANT
10-FEB-18 17:49:57.286: Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
10-FEB-18 17:49:57.405: Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
10-FEB-18 17:49:58.273: Processing object type
SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
10-FEB-18 17:49:58.658: Processing object type SCHEMA_EXPORT/SYNONYM/SYNONYM
10-FEB-18 17:49:58.842: Processing object type SCHEMA_EXPORT/TYPE/INC_TYPE
10-FEB-18 17:49:59.663: Processing object type SCHEMA_EXPORT/TYPE/TYPE_SPEC
10-FEB-18 17:50:00.559: Processing object type
SCHEMA_EXPORT/TYPE/GRANT/OWNER_GRANT/OBJECT_GRANT
10-FEB-18 17:50:01.795: Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
10-FEB-18 17:50:07.960: Processing object type SCHEMA_EXPORT/XMLSCHEMA/XMLSCHEMA
10-FEB-18 17:50:16.997: Processing object type SCHEMA_EXPORT/TABLE/TABLE
10-FEB-18 17:50:27.397: Processing object type 
10-FEB-18 17:50:54.307: Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX





5. Encriptación de password
Para poder encriptar los archivos Dump de una operación EXPDP, podemos utilizar la opción de encriptación con password.  Lamentablemente en versiones anteriores es necesario colocar el password como parámetro del comando EXPDP e IMPDP.  

Para evitar colocar el password como parámetro se define el parámetro
ENCRYPTION_PWD_PROMPT.  De esta manera el password se solicita mediante un Prompt de manera más segura.

expdp system@ORCL DUMPFILE=encrypt_SH.dmp LOGFILE=exp_SH_encryp.log
DIRECTORY=EXP_DIR SCHEMAS=SH ENCRYPTION_PWD_PROMPT=Y

Export: Release 12.2.0.1.0 - Production on Sat Feb 10 19:03:17 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

Encryption Password:
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/********@ORCL
DUMPFILE=encrypt_SH.dmp LOGFILE=exp_SH_encryp.log DIRECTORY=EXP_DIR
SCHEMAS=SH ENCRYPTION_PWD_PROMPT=Y





6. Compresión de archivos Dump
Podemos elegir el parámetro COMPRESSION_ALGORITHM para comprimir los archivos Dumps generados por el comando EXPDP. Con la opción de base de datos Advanced Compression podemos seleccionar diferentes niveles de compresión.
  • BASIC
  • LOW
  • MEDIUM
  • HIGH
La opción de compresión es muy efectiva cuando la base de datos es muy grande y no se tiene mucha capacidad para almacenar archivos Dumps.  
Mientras mayor sea la compresión, la inversión de recursos de CPU aumenta.

expdp system@ORCL DUMPFILE=FULL_DB.dmp LOGFILE=exp_full.log
DIRECTORY=EXP_DIR FULL=Y COMPRESSION=ALL COMPRESSION_ALGORITHM=HIGH

Export: Release 12.2.0.1.0 - Production on Sat Feb 10 19:34:02 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
Starting "SYSTEM"."SYS_EXPORT_FULL_01":  system/********@ORCL
DUMPFILE=FULL_DB.dmp LOGFILE=exp_full.log DIRECTORY=EXP_DIR FULL=Y
COMPRESSION=ALL COMPRESSION_ALGORITHM=HIGH





7. Datapump en Pluggable Database
Con la nueva arquitectura Oracle 12c Multitenant podemos contar con bases de datos Pluggable. El procedimiento para realizar exportaciones e importaciones, con Datapump, no es diferente del procedimiento tradicional.   

Por lo que es posible mover información:
  • Desde una base de datos Non-CDB hacia un Pluggable, o viceversa.
  • Desde una base de datos Pluggable hacia otro Pluggable.






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 
Processing object type SCHEMA_EXPORT/USER 
Processing object type 
SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS 
Processing object type 
SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICS 
...





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 el Dump, 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" rows   2.258 MB  69749 
. . exported "SH"."SALES":"SALES_Q3_1999" rows   2.166 MB  67138 
. . 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 y importación sobre una tabla particionada, esta operación se realiza de manera serial, por mas 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 opcion 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 la 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 Datapump

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'" 

No hay comentarios: