Implement Data Pump Export and Import Jobs for Data Transfer

1. Documentación en Tahiti -> Masters Book List -> Utilities -> 2 Data Pump Export

Documentación en Tahiti -> Masters Book List -> Utilities -> 3 Data Pump Import

2. El objetivo que se nos plantea es saber utilizar las herramientas Export/Import utilizando Data Pump. Para ello debemos conocer las utilidades expdp (export) y impdp (import) con los posibles argumentos de entrada que tienen.

Las prácticas las vamos a realizar sobre el DIRECTORY DATA_PUMP_DIR.

-- Consultamos la ruta a la que apunta el DIRECTORY DATA_PUMP_DIR
SELECT DIRECTORY_PATH FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME='DATA_PUMP_DIR';

 

# Para mostrar la ayuda de los argumentos que tiene cualquier de los dos comandos
expdp help=y
impdp help=y

# Exportamos con un ejemplo sencillo, exportando un sólo esquema (HR)
# Es una práctica común indicar en el nombre del export de qué se trata y fecha
# Otra práctica común es utilizar el mismo nombre para el log
#   SCHEMAS => Indicamos sobre qué esquemos queremos realizar el Export
#   DIRECTORY => Por defecto es DATA_PUMP_DIR, luego en nuestro es opcional incluirlo
# Podríamos utilizar directamente el usuario HR y no necesitaríamos especificar el argumento SCHEMAS
# Cuando el usuario sea distinto a SYS/SYSTEM => Conceder permisos READ/WRITE al usuario en el DIRECTORY
expdp system SCHEMAS=HR DIRECTORY=DATA_PUMP_DIR DUMPFILE=exp_hr_20130613.dmp LOGFILE=exp_hr_20130613.log

# Podemos hacer un backup completo (FULL) y comprimido
#   USERID => Usuario con el que se realiza el export
#   FULL=Y => Se exportan TODOS los DATOS y METADATOs
#   COMPRESSION=ALL => Se comprimen DATOS y METADATOS
expdp USERID=\"/ as sysdba\" FULL=Y DIRECTORY=DATA_PUMP_DIR COMPRESSION=ALL DUMPFILE=exp_full_20130613.dmp

 

-- En mi caso se ha pausado porque el TBS temporal estaba lleno
-- Una vez ampliado la operación continua rapidamente
ALTER DATABASE TEMPFILE '/u01/app/oracle/oradata/OCM/temp01.dbf' RESIZE 100M;

 

# Veamos como podemos utilizar un fichero para todos los parámetros del Export
vi /u01/stage/expdp_parfile.par

# Añadimos las siguientes lineas
CONTENT=METADATA_ONLY
TABLES=HR.EMPLOYEES,HR.DEPARTMENTS
EXCLUDE=STATISTICS
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=exp_employees_20130613.dmp
LOFILE=exp_employees_20130613.log

# Ejecutamos el export con el fichero de parámetros de entrada
#   CONTENT=METADATA => Sólo exportamos los metadatos (Definiciones de las tablas)
#   EXCLUDE=STATISTICS => Decidimos que no queremos exportar las estadísticas de estos objetos
expdp system PARFILE=/u01/stage/expdp_parfile.par

3. Si tenemos que hacer un Export de un conjunto grande de datos nos puede interesar paralelizar la operación y generar varios archivos en ubicaciones distintas. Veamos un ejemplo.

-- Creamos un DIRECTORY de una ubicación alternativa
CREATE DIRECTORY TEMP_DIR AS '/u01/stage';

 

# Lanzamos un Export del esquema SH en 6 procesos paralelos
# Vemos que nos genera los siguientes ficheros
#   /u01/app/oracle/admin/OCM/dpdump/exp_sales_01_20130613.dmp
#   /u01/stage/exp_sales_01_20130613.dmp
#   /u01/app/oracle/admin/OCM/dpdump/exp_sales_02_20130613.dmp
#   /u01/stage/exp_sales_02_20130613.dmp
#   /u01/app/oracle/admin/OCM/dpdump/exp_sales_03_20130613.dmp
#   /u01/stage/exp_sales_03_20130613.dmp
#   /u01/app/oracle/admin/OCM/dpdump/exp_sales_04_20130613.dmp
expdp system PARALLEL=8 SCHEMAS=SH \
  DUMPFILE=DATA_PUMP_DIR:exp_sales_%U_20130613.dmp,TEMP_DIR:exp_sales_%U_20130613.dmp \
  LOGFILE=DATA_PUMP_DIR:exp_sales_20130613.dmp

4. Tenemos la posibilidad de realizar un EXPORT consistente en el tiempo, ya sea en el momento actual o en el pasado. Para ello tenemos dos parámetros: FLASHBACK_SCN y FLASHBACK_TIME. Con el primero de ellos podemos decidir sobre que SCN queremos realizar el EXPORT. Con el segundo, escogemos la fecha y hora sobre la que queremos tener la consistencia. Cuando indicamos uno de estos dos parámetros (son excluyentes), todos los datos serán consistentes entre sí en un momento dado. Para ello la BD, utiliza la caracterísica de Flashback de la BD (como es de suponer).

# Activamos el parámetro FLASHBACK_TIME para realizar un EXPORT
# Para poder hacer este EXPORT hay que dar permisos de READ,WRITE al usuario HR
#   GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO HR;
expdp hr FLASHBACK_TIME=SYSTIMESTAMP CONTENT=DATA_ONLY \
  DIRECTORY=DATA_PUMP_DIR DUMPFILE=exp_hr_fbk_20130613.dmp LOGFILE=exp_hr_fbk_20130613.log

# Volvemos a lanzar el EXPORT pero utilizando una fecha del pasado
# Hemos tenido que escapar muchos símbolos, pero en un fichero de parámetros no es necesario
expdp hr FLASHBACK_TIME=\"TO_TIMESTAMP\(\'13-06-2013 16:00:00\', \'DD-MM-YYYY HH24:MI:SS\'\)\" \
  CONTENT=DATA_ONLY DIRECTORY=DATA_PUMP_DIR DUMPFILE=exp_hr_past_20130613.dmp \
  LOGFILE=exp_hr_past_20130613.log

5. Vamos a realizar probar con el comando de Import «impdp».

# Realizamos el Import de la tabla SH.SALES
#   EXCLUDE => Podemos excluir del Import los objetos que deseemos (Ej. INDEX,CONSTRAINT)
#   REMAP_TABLE => Se renombra la tabla al hacer el Import
impdp system PARALLEL=8 \
  DIRECTORY=DATA_PUMP_DIR \
  TABLES=SH.SALES \
  EXCLUDE=INDEX,CONSTRAINT \
  REMAP_TABLE=SH.SALES:SALES_TEMP \
  DUMPFILE=DATA_PUMP_DIR:exp_sales_%U_20130613.dmp,TEMP_DIR:exp_sales_%U_20130613.dmp \
  LOGFILE=DATA_PUMP_DIR:imp_sales_20130613.dmp

6. Se pueden hacer muchas combinaciones con los distintos parámetros que tienen los comandos «expdp» y «impdp». No podemos hacerlos todos, pero según vaya realizando distintas prácticas con ellos, las iré añadiendo a este objetivo. Una consideración a tener en cuenta sobre Data Pump con respecto a la utilidad anterior para realizar estas tareas («imp» y «exp»), es que el trabajo se realiza en el servidor donde establezcamos la conexión.

Merece la pena también echar un vistazo a los comandos que se pueden ejecutar en interactivo. Tenéis la lista completa en la Documentación Oficial.

7. Una diferencia muy significativa entre las antiguas herramientas de Export/Import (exp/imp) con respecto a Data Pump, es que este último realiza todo el trabajo en el servidor donde está ubicado la BD. Tenemos la ventaja de que podemos atarnos a un trabajo que este en ejecución por otro usuario y podemos pararlo, resumir la operación o modificar algunos parámetros del mismo.

# Lanzamos un export completo de la BD en una seción
expdp userid=\"/ as sysdba\" DIRECTORY=DATA_PUMP_DIR FULL=Y DUMPFILE=full.dmp LOGFILE=full.log

 

-- En otra sesión localizamos la información del trabajo en ejecución
COL OPERATION FORMAT A20;
SELECT OWNER_NAME, JOB_NAME, STATE, OPERATION, DEGREE FROM DBA_DATAPUMP_JOBS;

 

# En la segundo sesión nos conectamos a dicho trabajo con la clausula ATTACH de expdp
expdp userid=\"/ as sysdba\" ATTACH=SYS.SYS_EXPORT_FULL_01

# Podemos cambiar el grado de paralelización
PARALLEL=4

# Podemos pausar el trabajo
STOP_JOB

# Nos conectamos de nuevo para reanudar el trabajo
expdp userid=\"/ as sysdba\" ATTACH=SYS.SYS_EXPORT_FULL_01

# Reanudamos el trabajo (esto reanuda el trabajo en nuestra sesión)
CONTINUE_CLIENT

# Podemos matar el trabajo (pero antes debemos lanzar CONTROL+C)
KILL_JOB

8. Limpiamos el entorno.

-- Borramos el DIRECTORY temporal que hemos creado para las pruebas
REVOKE READ,WRITE ON DIRECTORY DATA_PUMP_DIR FROM HR;
DROP TABLE SALES_TEMP;
DROP DIRECTORY TEMP_DIR;