jueves, 15 de septiembre de 2011

Datapump y el error ORA-06502

El otro dia tuvimos un requerimiento de exportar mas de 2000 tablas con un opcion de QUERY. Una vez que construimos nuestro archivo de parametros que contenia mas de 4000 caracteres y lo lanzamos y nos aparece el siguiente error

 ORA-06502 PL/SQL: numeric or value error: character string buffer too small

Lo que sucedio fue que Oracle tiene un bug interno, que por lo visto en 11.2.0.2 todavia no esta resuelto, en donde un buffer interno es excedido por los parametros INCLUDE or TABLES, falla con el error mencionado arriba. Lo que hicimos para corregir este error fue lo siguiente 1.- Creamos una tabla que tenga tres columnas, owner,object_name y object_type, y una vez creada, insertamos los valores de las tablas que queremos exportar.


DBATEST >CREATE TABLE expdp_tab (owner VARCHAR2(30), object_name VARCHAR2(128), object_type VARCHAR2(19));

Table created.

DBATEST >INSERT INTO expdp_tab VALUES ('HR','TEST_TABLE_1','TABLE');

1 row created.

DBATEST >INSERT INTO expdp_tab VALUES ('HR','TEST_TABLE_2','TABLE');

1 row created.

.
.
.

DBATEST >INSERT INTO expdp_tab VALUES ('HR','TEST_TABLE_N','TABLE');

1 row created.

DBATEST >commit;

Commit complete.

2.-Ya que finalizamos de insertar las tablas que queremos exportar a la tabla expdp_tab, vamos a crear un archivo de parametros para el export de datapump.


DIRECTORY=DATA_PUMP_DIR  
SCHEMAS=SYSADM
DUMPFILE=DUMP_FILE_NAME.dmp 
CONTENT=DATA_ONLY 
QUERY= "WHERE LOCATION='TEST'"
INCLUDE=TABLE:"IN (SELECT object_name FROM expdp_tab where owner='HR')"

3.-Correr el job de datapump expdp hr/hr_pass@DBATEST parfile=parameter_file_name.par


;;; 
Export: Release 11.2.0.2.0 - Production on Wed Sep 14 20:45:40 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
;;; 
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the OLAP, Data Mining and Real Application Testing options
Starting "HR"."SYS_EXPORT_SCHEMA_01":  HR/******** parfile=parameter_file_name.par 
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 230.1 MB
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/INDEX/FUNCTIONAL_AND_BITMAP/INDEX
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_AND_BITMAP/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exported "HR"."TEST_TABLE"                13.59 MB   64509 rows
.
.
. . exported "HR"."TEST_TABLE_N"                    10.96 KB      20 rows
Master table "SYSADM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSADM.SYS_EXPORT_SCHEMA_01 is:
  /mount/export01/DBATEST/DUMP_FILE_NAME.dmp
Job "SYSADM"."SYS_EXPORT_SCHEMA_01" successfully completed at 21:15:13

4.-Una vez finalizado el export, tiramos la tabla que creamos al principio

DBATEST >drop table expdp_tab;

Table dropped.

Conclusion
Aunque Oracle en MOS indica que este bug interno ya se encuentra arreglado, nosotros no lo topamos en la version 11.2.0.2.3, asi que si te lo llegas a topar, aqui esta la manera de como trabajar alrededor de el.