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;