miércoles, 23 de septiembre de 2009

Transportable Tablespaces

Con esta utilidad, lo que buscamos básicamente es bajar los tiempos de pasaje de datos, más específicamente al transferir un tablespace de una BD a otra, o al recuperarlo de un estado anterior (recover).

Para poder transportar un tablespace, éste debe ser self-contained (auto-contenido), es decir, no debe contener objetos que referencien a otros objetos en diferentes tablespaces.

Cómo chequeamos si el tablespace es self-contained?

EXEC DBMS_TTS.TRANSPORT_SET_CHECK(ts_list => 'nombre_tablespace', incl_constraints => TRUE);

Luego chequeamos la vista transport_set_violations para ver si existe alguna violación...

SELECT * FROM transport_set_violations


RESPALDANDO EL TABLESPACE A TRANSPORTAR:

Como primer paso, luego de estos chequeos, debemos crear el "respaldo" del tablespace a transportar.

Seteamos el tablespace en cuestión en modo READ ONLY:

ALTER TABLESPACE nombre_tablespace READ ONLY;

Ejecutamos el siguiente export:

exp parfile=export_parfile.txt

-- contenido archivo export_parfile.txt
userid="sys/pass as sysdba"
transport_tablespace=y
tablespaces=(nombre_tablespace)
file=plug_in_nombre_tablespace_ts.dmp
log=plug_in_nombre_tablespace_ts.log
statistics=NONE

Respaldamos los datafiles que componen el tablespace, ésto lo podemos hacer simplemente con el comando de copia del sistema operativo (xcopy para Win o cp para Linux) o como más cómodo nos quede.

-- ejemplo respaldo bajo Linux
cp tablespace_datafile*.dbf /Respaldo

Ya con ésto tenemos todo lo necesario para poder levantar el mismo tablespace en otra BD o simplemente para utilizarlo como respaldo.

Ahora deberíamos llevar nuevamente el tablespace a modo READ WRITE para retornar a la "normalidad":

ALTER TABLESPACE nombre_tablespace READ WRITE;


RESTAURANDO EL TRANSPORTABLE TABLESPACE:

Ahora intentaremos describir cómo hacer para levantar el respaldo que realizamos en el capítulo anterior.

Si el tablespace que vamos a restaurar ya existe en nuestra BD destino, debemos eliminarlo:

DROP TABLESPACE nombre_tablespace INCLUDING CONTENTS AND DATAFILES;

Restauramos los datafiles del "respaldo", que tan cuidadosamente habíamos guardado...

-- ejemplo copia desde respaldo, supongamos orcl es la BD
cp /Respaldo/tablespace_datafile*.dbf  $ORACLE_BASE/oradata/orcl

Luego, debemos "enchufar" (no se me ocurrió otro término para traducir plug-in) el tablespace:

imp parfile=plug_in_nombre_tablespace_ts.txt

-- contenido archivo plug_in_nombre_tablespace_ts.txt
userid="sys/pass as sysdba"
transport_tablespace=y
file=plug_in_nombre_tablespace_ts.dmp               -- dmp generado en el respaldo
log=plug_in_nombre_tablespace_ts.log
tablespaces=(nombre_tablespace)
tts_owners=schema_origen
fromuser=schema_origen
touser=schema_destino
datafiles=(
'$ORACLE_BASE/oradata/orcl/tablespace_datafile1.dbf ',      -- declaramos todos los datafiles del ts
$ORACLE_BASE/oradata/orcl/tablespace_datafile2.dbf '       -- en su ubicación correspondiente
...
)

Luego de terminado el import, colocamos el tablespace en modo READ WRITE:

ALTER TABLESPACE nombre_tablespace READ WRITE;

Si seguimos los pasos al pie de la letra, deberíamos poder realizar los transportes de tablespaces sin mayores problemas. Espero que haya sido de utilidad!

3 comentarios:

  1. Muy buena guia, me saque gran parte de mis dudas.. Gracias

    ResponderEliminar
  2. Excelente guia. Solo tengo una duda, en caso de que la restauración de los tablespaces la quiera hacer sobre otro schema, que pasos se deben realizar? Es decir en producción el esquema es DTAPROD y yo lo quiero restaurar en desarrollo como DTADEV.

    ResponderEliminar
  3. Hola!. En caso de un diccionario corrupto. Cual seria una mejor idea TTS o un export import datapump?. Para una BD que tiene mas de 300 datafiles y tiene un tamaño de 300G

    ResponderEliminar