Archivo de la etiqueta: import

Migrar usuario de versión 9i a 11GR2 con herramienta exp/imp

En la siguiente entrada de blog voy a mostrar un ejemplo de cómo exportar un esquema completo de un usuario Oracle de una base de datos en versión 9i hacia una versión 11GR2.

En muchas ocasiones, los DBA´s nos encontramos que tenemos que migrar Bases de datos a las últimas versiones y este proceso de migración se debe hacer de la manera más segura posible.  Pues una de estas maneras, desde mi punto de vista, es migrar la Base de datos esquema a esquema. La idea es la siguiente ….

Si debo migrar de una versión 9i a una 11GR2 y no quiero ir haciendo actualizaciones de versiones de Oracle. Una solución efectiva y rápida puede ser hacer lo siguiente:

- Instalar la nueva versión 11GR2 y crear la BD durante la creación con el mismo “perfil” que la Base de datos de versión anterior (en este caso la 9i), teniendo en cuenta cosas cómo por ejemplo poner el mismo CHARACTER SET, etc….

- Lo siguiente sería, exportar usando las herramientas de la versión 9i todos los esquemas, pero haciéndolo uno a uno. 

- Finalmente importar, usando el export de la nueva versión a la nueva Base de datos.

Seguidamente explico cómo hacer este export/import y explico que errores son los que comúnmente nos podemos encontrar durante este proceso.

Lo primero que tenemos que plantearnos es cómo exportar los esquemas que se encuentran en la versión vieja, en este ejemplo la 9i.

Se puede hacer de dos maneras. O bien ejecutando la herramienta export (exp) desde el mismo servidor donde se encuentre la base de datos, o bien, usando un cliente Oracle instalado en nuestro PC,  por ejemplo, y realizar el export.

Tanto en un caso como en el otro, nos tenemos que asegurar de que tendremos espacio de disco donde ubicar el fichero binario (con extensión .dmp) que genera la herramienta export y luego tendremos que copiarlo al servidor destino (en este caso la 11GR2) para posteriormente realizar el import.

 Si tenemos acceso al servidor donde están los esquemas de la 9i, lo mejor es hacer el export de esta manera. Ya que probablemente será más rápido y además, nos aseguraremos de que la herramienta export que utilizamos corresponde con la versión Oracle que hay instalada. Si por el contrario, realizamos el export desde un cliente Oracle instalado en nuestro PC, nos tenemos que asegurar que la versión que utilizamos para realizar el export, es cómo mínimo igual o inferior a la versión de la Base de datos origen. Porque sino es así obtendremos el siguiente mensaje de error al ejecutar la herramienta export:

EXP-00056: ORACLE error 6550 encountered
ORA-06550: line 1, column 41:
PLS-00302: component ‘SET_NO_OUTLINES’ must be declared
ORA-06550: line 1, column 15:
PL/SQL: Statement ignored
EXP-00000: Export terminated unsuccessfully

Solución: Ejecutar el export desde el servidor o instalarse un cliente de la misma versión o inferior. Nunca superior.

Ejemplo de export de esquema que usaríamos para realizar el export desde nuestro PC Windows con cliente 9i instalado igual o inferior al instalado en el servidor “origen”:

exp system/password@SID9i owner=USUARIO file=esquema_USUARIO.dmp log=exp_USUARIO.log

Esta línea la podemos guardar en un fichero con extensión .bat y ejecutarlo desde la línea de comandos de Windows.

La ejecución de este export generará un fichero binario llamado “esquema_USUARIO.dmp” que será el que posteriormente copiaremos al servidor destino y usaremos para realizar el import a la nueva base de datos.

 Lo siguiente que se debería hacer es copiar el fichero generado con el export en el servidor destino donde tenemos instalada la versión 11GR2. Una vez copiado, en el servidor destino, entraremos a sqlplus y crearemos el usuario con el mismo nombre que tiene en el servidor origen y le asignaremos el tablespace correspondiente. Si el tablespace no existiese, que sería lo normal, lo deberíamos crear antes de crear el usuario y antes de lanzar el import.

Podemos basarnos en la versión 9i para sacar la información del tablespace e incluso del usuario. Si estamos acostumbrados a trabajar con herramientas como TOAD, se puede incluso sacar el código de creación del usuario y lo podemos usar para la creación en el nuevo entorno.

En resumen:

Tenemos el export (fichero .dmp) ya copiado en el servidor destino. Hemos creado el tablespace del usuario y hemos creado el usuario asignándole ese tablespace. Pues ahora, procederemos a hacer el import del usuario. Sino hubiésesmos creado el tablespace y el usuario, el import nos daría un error. Las nueva herramientas de export/import Datapump en el proceso de importación ya nos crea el usuario y su tablespace correspondiente. Pero en este caso como es una versión 9i, nos vemos obligados a usar los antiguos exp/imp que no lo hacen.

imp system/password@SID11G fromuser=USUARIO touser=USUARIO file=esquema_USUARIO.dmp log=imp_USUARIO.log

Ahora podríamos asegurarnos de que nos conectamos correctamente con el usuario y que tenemos todo el esquema creado y los permisos asignados correctamente. Si no tenemos todos los permisos, podemos usar el usuario de la base de datos origen para sacarlos, ya sea usando una herramienta como TOAD o bien podemos ejecutar las siguientes instrucciones que nos generarán los “grants” necesarios para otorgar los permisos.

accept newuser prompt ‘Entra el nombre de usuario para generar el scripts de los roles que tiene:’

select ‘grant ‘ ||granted_role || ‘ to &newuser’ ||
       decode(admin_option, ‘NO’, ‘;’, ‘YES’, ‘ with admin option;’) “ROLE”
from   dba_role_privs
where  grantee = ‘&newuser’
/

select ‘grant ‘ || privilege || ‘ to &newuser’ ||
       decode(admin_option, ‘NO’, ‘;’, ‘YES’, ‘ with admin option;’) “PRIV”
from   dba_sys_privs
where  grantee = ‘&newuser’
/

 

 

Uso de las herramientas expdp e impdp de Oracle

Oracle ofrece unas herramientas para realizar exportaciones/importaciones de datos que nos permiten desde realizar backups de esquemas completos, de bases de datos, de tablas, hasta la migración de esquemas en diferentes versiones, y un sin fin de posibilidades.

La idea de esta entrada del blog es explicar cómo realizar difentes exportaciones e importaciones en función de nuestras necesidades. En versiones anteriores a la 10gR1 de Oracle se utilizaban las herramientas exp e imp. Pero desde esa versión (10gR1) aparece una nueva herramienta llamada Oracle Data Pump que experimenta importantes cambios respecto a sus predecesoras exp e imp.

Una de las diferencias más sustanciales de la nueva herramienta es que pasa de ser una herramienta que se ejecuta en el servidor en lugar de en el cliente, con la mejora de rendimiento/velocidad que eso conlleva. Por tanto los ficheros de dump (.dmp normalmente) se generarán o leerán en el servidor de base de datos.

Las antiguas exp/imp ya se encuentran fuera de soporte. Por lo que es más que recomendable adaptarse al uso de Oracle Data Pump.

Para empezar lo ideal es conocer los parámetros que se le pueden pasar a expdp o impdp para ello basta poner desde la linea de comandos help=y.

En esta entrada de blog todos los ejemplos están hechos en Linux.

Ej. Mostrar los parámetros de expdp (exportación):

$ expdp help=y

Para poder usar Oracle Data Pump debemos realizar unos pasos previos a nivel de Oracle que nos permita ejecutar la herramienta correctamente. El primer paso que debemos realizar es crear el directorio a nivel lógico en Oracle que especifica la ruta que Oracle usará para realizar los exports e imports. De esta manera no tendremos nunca que modificar nuestros scripts de export/import, ya que en el script especificaremos el nombre que nosotros hayamos puesto a nivel lógico.

Para crear el directorio nos conectamos con el usuario “sys”:

$ sqlplus /nolog

SQL>connect /as sysdba

SQL> show user

USER is “SYS”

SQL> create or replace directory dirdatapump as ‘/home/oracle/dirdatapump’;

 Directory created.

 SQL> grant read,write on directory dirdatapump to system;

 Grant succeeded.

Con esto ya tenemos el directorio creado llamado dirdatapump que será el que usaremos en nuestros scripts. Si quisieramos modificar la ruta del directorio deberíamos volver a ejecutar los pasos anteriores especificando la nueva ruta. Al usuario que hemos dado permisos para poder hacer los exports/imports lo hemos especificado en la segunda setencia con el “grant”, en el ejemplo “system”.

Una vez hecho esto, ya podemos empezar a crear nuestros scripts para hacer las exportaciones o importaciones que necesitemos. Seguidamente pongo algún ejemplo…

Ejemplo 1: Exportar datos de un esquema en concreto

Crear un fichero llamado expdp.sh y añadir el siguiente contenido:

$ vi expdp.sh

expdp system/password@micadenaconexion schemas=USUARIO_EJEMPLO directory=dirdatapump dumpfile=esquema_USUARIO_EJEMPLO.dmp  logfile=expdp_USUARIO_EJEMPLO.log

Dar permisos de ejecución al script en Linux:

$ chmod u+x expdp.sh

donde…

USUARIO_EJEMPLO es el nombre de usuario

micadenaconexion es el nombre de la instancia a la que nos conectamos

dirdatapump es la ruta que hemos especificado en la creación del directorio a nivel lógico. En este ejemplo ‘/home/oracle/dirdatapump’

Este export generará un fichero con extensión .dmp que posteriormente usaremos para realizar el import en función de nuestras necesidades.

Ya podríamos ejecutar el script para realizar el export:

$ . ./expdp.sh

- Ejemplo de import usando el anterior export para crear el esquema en otra instancia:

impdp system/password@micadenaconexion2 schemas=USUARIO_EJEMPLO directory=dirdatapump dumpfile=esquema_USUARIO_EJEMPLO .dmp  logfile=impdp_USUARIO_EJEMPLO.log

Donde …

micadenaconexion2 es el nombre de una nueva instancia donde por ejemplo quiero importar los datos del esquema que he exportado anteriormente. Si el usuario no existe el propio impdp lo crea.

 Ejemplo 2: Quiero copiar un esquema de desarrollo a un entorno de producción pero con otro nombre.

Para ello usaremos el parámetro REMAP_SCHEMA en el import.

Export:

expdp system/password@micadenaconexion schemas=USUARIO_DESARROLLO directory=dirdatapump dumpfile=esquema_USUARIO_DESARROLLO .dmp  logfile=expdp_USUARIO_DESARROLLO.log

Import:

impdp system/password@micadenaconexion remap_schema=USUARIO_DESARROLLO:USUARIO_PRODUCCION directory=dirdatapump dumpfile=esquema_USUARIO_DESARROLLO .dmp  logfile=impdp_USUARIO_REMAP.log

Ejemplo 3: Quiero copiar un esquema y quiero que el fichero .dmp se sobreescriba para evitar el error al ejecutar expdp y así tener la última versión del esquema exportado.

Sólo basta con añadir el parámetro REUSE_DUMPFILES=y en el export.

Export:

expdp system/password@micadenaconexion schemas=USUARIO_EJEMPLO directory=dirdatapump dumpfile=esquema_USUARIO_EJEMPLO.dmp  resuse_dumpfile=y logfile=expdp_USUARIO_EJEMPLO.log

Nota:

Si no sabemos que ruta tenemos definida como “directory” la tabla all_directories nos podrá facilitar esta información,  podemos ejecutar la siguiente setencia:

SELECT privilege,directory_name, directory_path
FROM user_tab_privs t, all_directories d
WHERE t.table_name(+)=d.directory_name and d.directory_name = ‘DIRDATAPUMP’
ORDER BY 2,1
/

o esta para saber todos los directorios configurados de Oracle

SELECT privilege,directory_name, directory_path
FROM user_tab_privs t, all_directories d
WHERE t.table_name(+)=d.directory_name ORDER BY 2,1
/