Restaurar un respaldo de Oracle en un tablespace diferente

 

Existen situaciones en que necesitamos que un esquema en Oracle utilice un tablespace diferente. Por ejemplo, como nos sucedió con Claro, podemos requerir que un esquema tenga toda su información en un disco físicamente distinto para asegurarnos de que el trabajo diario del servidor no afecte el performance de las consultas.

Lamentablemente hacer esto es, por decirlo de alguna manera, complicado. En nuestro caso de ejemplo, intentamos obteniendo un respaldo usando “exp” (Exportar base de datos Oracle), pero el archivo .dmp obtenido mantiene la información del tablespace de origen, con lo que al hacer “imp” Oracle intenta reconstruir las tablas en el tablespace original. Por supuesto si no existe se generará un buen número de errores.

También se intentó quitándole el privilegio “UNLIMITED TABLE SPACE” al usuario del esquema de destino y asignandole cuota sólo al tablespace que nos interesaba, pero funcionó sólo para algunas tablas.

Los pasos para lograr hacer el restore, aunque suene muy manual, son los siguientes:

  • Crear un archivo .sql con las instrucciones para crear una base de datos vacía, sólo las tablas de nuestro esquema. Eso lo hacemos con la siguiente instrucción:
imp <usuario_esquema>/<password_esquema>@servidor file=<archivo.dmp>
 indexfile=archivo.sql full=y

esto creará un archivo con las instrucciones SQL para crear la tablas y otros objetos vacíos.

  • Usando un editor de texto:

– Borrar todos los “REM” que aparezcan – Reemplazar el nombre del tablespace original por el nuevo en todo el texto – Reemplazar “…” por “REM …”. Esto es para eliminar líneas del tipo “… 105 rows”. – Comentar “CONNECT” (reemplazando por “REM CONNECT”

  • Guardar este archivo y ejecutarlo con TOAD o sqlplus. En este punto antes asegurarse de que el esquema esté vacío.