miércoles, 8 de julio de 2009

Expdp e Impdp

Datapump dejó por el camino, a partir de Oracle 10, a las viejas utilidades de exp e imp ya conocidas. Con las características de direct path y ejecuciones en paralelo datapump es mucho más veloz que sus antecesores.
Los tradicionales exp e imp corren del lado del cliente (client-side) mientras que expdp e impdp lo hacen del lado del servidor (server-side), lo que hace que sea más manejable.

Procesos involucrados en los trabajos de datapump:

Client process: este proceso es iniciado por la utilidad del cliente, llamando a la API datapump. Una vez que se inicia el datapump, este proceso no es necesario para el resto del trabajo.

Shadow process: cuando el cliente se loguea en la BD, se crea el proceso foreground que atiende las solicitudes de la API. Este proceso crea la master table y las colas utilizadas para la comunicación. Una vez que el proceso del cliente termina, shadow process también.

Master control process: este proceso controla la ejecución de los trabajos de datapump. Existe un MCP por cada trabajo de datapump. MCP divide el trabajo de datapump en varios sub-trabajos de carga y descarga de metadatos y los transfiere a los worker processes.

Worker process: MCP crea los worker process basado en el valor del parámetro PARALLEL. El worker process realiza la tarea solicitada por el MCP.

Ventajas de datapump:

* Podemos exportar en paralelo, escribiendo en múltiples archivos en diferentes discos. Por ejemplo, especificando el parámetro PARALLEL=2 y dos directorios con los nombres de archivos destino, DUMPFILE=dir1:/file1.dp, dir2:/file2.dp.

* Posibilidad de realizar attach y dettach del trabajo, monitoreando el trabajo remotamente.

* Más opciones para filtrado de metadatos (parámetros EXCLUDE e INCLUDE).

* Podemos estimar los requerimientos de espacio en disco con el parámetro ESTIMATE_ONLY, antes de ejecutar la tarea.

* Los datos pueden ser exportados desde una BD remota utilizando un DB link.

* Puede especificarse la versión de la BD y exportar solo los objetos compatibles con dicha versión.

* Durante la tarea de impdp podemos cambiar el destino de los datafiles, esquemas y tablespaces (REMAP_DATAFILES, REMAP_SCHEMA, REMAP_TABLESPACE).

* Nos permite filtrar los datos durante la ejecución de impdp.

* Puede importarse desde una BD hacia otra sin escribir a un archivo de dump, especificando el parámetro NETWORK_LINK.

* El status de los trabajos pueden ser consultados directamente desde el data dictionary. Por ejemplo, dba_datapump_jobs, dba_datapump_sessions, etc.

Ejemplos de sintaxis:
En estos ejemplos se utilizan parfiles (archivos plano de texto) para especificar los parámetros a utilizar en el expdp e impdp. Para ejecutar un expdp o impdp utilizando un parfile: expdp parfile=archivo_parfile.txt o impdp parfile=archivo_parfile.txt.

En los diferentes escenarios se muestra el contenido de cada parfile en particular.
El parámetro directory, especifica donde quedará el dmp exportado, o de donde se toma el dmp de origen para realizar una importación. La ubicación data_pump_dir, en una instalación por default, apunta a la ubicación $ORACLE_BASE/admin/dpdump.

Escenario 1:
Exportar la base ORCL completa.

userid=system/password@ORCL
dumpfile=completadp.dmp
logfile=completadp.log
full=y
directory=data_pump_dir

Escenario 2:
Exportar schema SCOTT de la base ORCL.

userid=system/password@ORCL
dumpfile=scottdp.dmp
logfile=scottdp.log
schemas=SCOTT
directory=data_pump_dir

Escenario 3:
Exportar las tablas PAISES y CIUDADES del esquema SCOTT.

userid=system/password@ORCL
dumpfile=scott_paisyciuddp.dmp
logfile=scott_paisyciuddp.log
tables=(SCOTT.PAISES,SCOTT.CIUDADES)
directory=data_pump_dir

Escenario 4:
Exportar la tabla EMPLEADOS del schema SCOTT de la base ORCL e importarla sobre la base ORCL_NEW.

*expdp parfile
userid=system/password@ORCL
dumpfile=scott_empdp.dmp
logfile=scott_empdp.log
tables=SCOTT.EMPLEADOS
directory=data_pump_dir

*impdp parfile
userid=system/password@ORCL_NEW
dumpfile=scott_empdp.dmp -- se utiliza el dmp creado en el paso anterior --
logfile=imp_scott_empdp.log
directory=data_pump_dir
table_exists_action=replace -- en caso de que la tabla exista en el destino, se reemplazará --

Escenario 5:
Exportar solamente la estructura, sin incluir datos, del esquema SCOTT.

userid=system/password@ORCL
dumpfile=scott_metadata.dmp
logfile=scott_metadata.log
content=metadata_only -- solamente la estructura --
schemas=SCOTT
directory=data_pump_dir

Escenario 6:
Exportar del esquema SCOTT, los registros de las tablas PAISES y CIUDADES cuyo nombre comience con letra A.

userid=system/password@ORCL
dumpfile=scott_soloA.dmp
logfile=scott_soloA.log
content=data_only
schemas=SCOTT
include=table:"in('PAISES','CIUDADES')"
query="where nombre like 'A%'"
directory=data_pump_dir

27 comentarios:

  1. como es la sintaxis para ejecutar un expdp y un impdp??

    ResponderEliminar
  2. En caso de que estes queriendo hacer un expdp desde tu base local la sintaxis sería:

    expdp user/pass dumpfile=nombrearchivodestino.dp directory=data_pump_dir logfile=archivolog.log schemas=nombreesquemaexportar

    En este expdp particular estamos haciendo la exportación de un schema puntual; podrías querer hacer de toda la BD u otras modalidades.

    impdp user/pass dumpfile=nombrearchivoorigen.dp directory=data_pump_dir logfile=archivolog.log
    remap_schema=schemaorigen:schemadestino

    En este impdp particular estamos haciendo la importación desde un archivo .dp ya exportado desde otro origen (schema@base) y lo estamos importando desde el schema origen hacia un schema destino.

    El impdp más básico donde no utilizamos remap_schema sería:

    impdp user/pass dumpfile=nombrearchivoorigen.dp directory=data_pump_dir logfile=archivolog.log

    ResponderEliminar
  3. Hola, tengo un gran problema, al tener en mi parfile el remap_schema=schemaorigen:schemadestino. Me genera el siguiente error: LRM-00101: unknown parameter name 'remap_schemas'.
    Llevo medio día leyendo pero nada que doy con la solución ... Gracias por la respuesta !! :(

    ResponderEliminar
    Respuestas
    1. Se ve que esta bien escrito, tal vez se quedo alguna letra pegada y seria cosa de escribir nuevamente el comando con la línea completa en el archivo parfile o ejecutar esta en una sola línea para probar

      Eliminar
  4. Dani, estás seguro que estás utilizando el parámetro remap_schema? Por lo que puedo ver el error hace referencia al parámetro remap_schemas (con letra s al final)... quizás por eso te esté reportando el error.
    Gracias.

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. al hacer un impdp hay alguna forma de que reinicie la secuencia?

    ResponderEliminar
    Respuestas
    1. Más vale tarde que nunca...
      Por lo que he visto no hay forma automática para reiniciar la secuencia en el import. Lo que sí puedes hacer es por ejemplo hacer un impdp de las secuencias a un archivo.sql...
      $impdp user/pass dumpfile=test.dmp directory=DIR include=SEQUENCE sqlfile=archivo.sql
      Si abres ese archivo.sql tendrás todas las sentencias de creación de las secuencias, de este tipo...
      CREATE SEQUENCE "USER"."SEQ_NAME" MINVALUE 1 MAXVALUE 99999999 INCREMENT BY 1 START WITH 2587 CACHE 20 ORDER CYCLE ;
      Lo que te queda es usar buscar y reemplazar, para cambiar el START WITH XXXX por START WITH 1; y ejecutar!
      Espero que sea de alguna utilidad...

      Eliminar
  7. Excelente articulo me saco de apuros, muy bien documentado y con muy buenos ejemplos, gracias!!

    ResponderEliminar
  8. Cómo cambiaría las rutas de los datafiles y ctls? Tengo una BD en un server, quiero copiarla a otro servidor que alojará rutas distintas.

    ResponderEliminar
    Respuestas
    1. Hola! No has probado utilizar remap_datafile para cambiar la ruta de estos archivos?

      Eliminar
  9. Excelente el articulo.
    Una consulta estimado, yo tengo en mi poder una respaldo full generado por el comando EXP de un oracle 9i, y necesito llevar (importar) estos datos a un ORACLE 11g, sera asi de trasparente el hacer el import con el comando impdp o hay que hacer algun proceso intermedio?

    soy nuevo en esto de las Bases de datos...
    desde ya muchas gracias

    ResponderEliminar
  10. Hola! La versión 11 no soporta imp/exp... por lo tanto lo creo bastante difícil (por no decir imposible) de subir ese dump a la nueva versión. Eso sí, si tienes disponible la versión 9 del motor, puedas intentar subirlo utilizando los binarios de esa versión. Suerte!

    ResponderEliminar
  11. La versión 11g tiene también los binarios exp e imp (por aquello de la compatibilidad hacia atrás) y puedes importar tu BD de 9i a 11g. Esto ya lo realicé para unas pruebas de migración y funciona correctamente. Solo como nota, los parametros de región y juego de caracteres deben ser los mismos en ambas.

    ResponderEliminar
  12. Hola, quisera consultarles si alguno no a tenido problemas al importa esquemas de mas de 300 GB y en la parte de Indixes y statistics a podido lograr mejor el tiempo de respuesta sobre la importacion del esquema.

    ResponderEliminar
  13. Processing object type SCHEMA_EXPORT/TABLE/COMMENT
    Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
    Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
    Processing object type SCHEMA_EXPORT/VIEW/VIEW
    Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
    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


    ResponderEliminar
  14. hola, cuando quiero hacer impdp me sale el siguiente error: ORA-31684: El tipo de objeto USUARIO: ya existe. Como lo soluciono? Gracias.

    ResponderEliminar
    Respuestas
    1. Previo a importar borra el usuario ya que si hiciste un export completo de un esquema este te inclurye la creación del usuario.
      Para borrarlo corre previamente la instruccion DROP USER pepe CASCADE

      Eliminar
  15. hola tengo una duda para hacer el import. Si hago el import y hago que toda la BD se importe completa directamente a un usuario, es posible ver esas tablas, relaciones, etc, desde el Oracl Sql Developer? o solo desde la termina, en mi caso el archivo DMP esta en un servidor de redhat y lo quiero impotar pero tengo esa duda. Seria de mucha ayuda que me respondan lo mas pronto ya que es para mi trabajo

    ResponderEliminar
  16. Excelente publicación
    Buenas noches, por favor necesito ayuda, deseo tener en una misma base de datos dos esquemas con la misma información pero obviamente con distinto nombre de esquema y distinto tablespace. Ya tengo creado el nuevo esqueme y nuevo tablespace. No estoy segura que ahi es donde debo colocar en el impdp los comando remap_schemas=origen:destino y remap_tablespace=origen:destino. Si es asi el esquema origen no sufre ninguna modificacion? Espero que me puedan ayudar....Muchas Gracias.

    ResponderEliminar
    Respuestas
    1. imp system/xx@BD file=D:\BASE_DATOS_ORACLE\FUNDACION_CERREJON\Archivo.DMP fromuser=usuario a cargar touser=usuario donde quedara

      Es asi de facil

      Eliminar
  17. Hola, tengo una pregunta
    Al momento de ejecutar el export genera el siguiente mensaje
    "
    ;;;
    Export: Release 10.2.0.3.0 - 64bit Production on Friday, 25 October, 2013 16:24:47

    Copyright (c) 2003, 2005, Oracle. All rights reserved.
    ;;;
    Connected to: Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
    Starting "SYSTEM"."SYS_EXPORT_FULL_01": system/********@conxx directory=expdp_backup_dir dumpfile=fullexpdp.dmp logfile=fullexpdp.log full=y
    "

    y se queda hay mucho tiempo y no genera ninguna accion. que puedo hacer ????





    ResponderEliminar
    Respuestas
    1. Hola! Seria bueno saber qué parámetros le estas pasando al export al momento de hacer la exportación.

      Eliminar
  18. como hago para importar informacion a un squema que ya tiene informacion vieja y quiero dejarle caer un impdp con informacion actualizada , pero no quiero truncar la table ni borar la table para que se cree con datos nuevos , quiero que la imformacion se actualice
    [3:05:59 PM] benjamin: yo hago esto pero se me duplica la informacion es decir la informacion que ya estaba me la duplica :
    C:\Users\si_bgutierrez>impdp user/pasDUMPFILE=RESPALDO04.DMP LOGFIL=restauraciontest.log content=data_only directory=RESDIARIOS

    ResponderEliminar
  19. Hola,

    Estoy haciendo un exp full de una base de datos con la siguiente sentencia "exp system/clave@orcl file=c:\system.dmp full=y buffer=10000 log=c:\syste,log pero solo me respalda la tablas que tengo datos, las tablas que no tienen registro las omite. Alguien sabe por que puede suceder esto ??

    tengo un Oracle 11g

    muchas gracias
    Saludos

    ResponderEliminar