Manage Transport of Tablespaces Across Platforms

1. Documentación en Tahiti -> Masters Book List -> Administrator’s Guide -> 14 Managing Tablespaces -> Transporting Tablespaces Between Databases

2. La funcionalidad de TRANSPORTABLE TABLESPACE nos permite llevar un tablespace una BD a otra, pudiendo tener distinto tamaño de bloque y/o además, distinta arquitectura. Podéis consultar la información acerca del Endian en Wikipedia.

Vamos a realizar un ejercicio en el que movemos objetos del catálogo de RMAN que tenemos en la BD de OEM a la BD de OCM. Supongamos que nos interesa mover las tablas DB, DBINC, BP (yo suelo consultar la tabla BP cuando tengo que hace restores de tiempo atrás, por eso escojo esa tabla).

-- Consultamos que la arquitectura es la misma en ambas BD<br />-- Ejecutamos la siguiente consulta en la BD de OCM y OEM<br />-- El formato de ENDIAN es el mismo = LITTLE (no necesitamos hacer conversión)<br />SELECT d.PLATFORM_NAME, ENDIAN_FORMAT<br /><%%KEEPWHITESPACE%%>  FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d<br /><%%KEEPWHITESPACE%%>  WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;<br /><br />-- Comprobamos la lista de TABLESPACES de las tablas DB; DBINC y BP (owner RMAN)<br />-- Todos los objetos están creados en el mismo TABLESPAC =&gt; RCAT<br />SELECT DISTINCT T.OWNER, T.TABLE_NAME, T.TABLESPACE_NAME, I.TABLESPACE_NAME<br /><%%KEEPWHITESPACE%%>  FROM DBA_TABLES T, DBA_INDEXES I<br /><%%KEEPWHITESPACE%%>  WHERE T.TABLE_NAME IN ('DB','DBINC','BP')<br /><%%KEEPWHITESPACE%%>  AND T.OWNER = 'RMAN'<br /><%%KEEPWHITESPACE%%>  AND T.TABLE_NAME = I.TABLE_NAME<br /><%%KEEPWHITESPACE%%>  AND T.OWNER = I.OWNER;<br /><br />-- Comprobamos que el tablespace RCAR es auto-contenido<br />-- De esta forma validamos que tenemos toda la información en ese TABLESPACE<br />--   · INCL_CONSTRAINTS =&gt; Se examinan las constraints<br />--   · FULL_CHECK =&gt; Chequeo completo (necesario para TSPITR)<br />EXEC DBMS_TTS.TRANSPORT_SET_CHECK('RCAT', INCL_CONSTRAINTS =&gt; TRUE);<br /><br />-- Consultamos el informe generado<br />SELECT * FROM TRANSPORT_SET_VIOLATIONS;<br /><br />-- Generamos un conjunto TRANSPORTABLE TABLESPACE con el tbs RCAT<br />ALTER TABLESPACE RCAT READ ONLY;

 

# Realizamos un export de los metadatos del tbs RCAT&lt;/span&gt;<br />&lt;pre&gt;-- TRANSPORT_FULL_CHECK=Y =&gt; Comprueba que el TBS es autocontenido (si no lo es, falla)<br />expdp system dumpfile=tts_rcat.dmp directory=DATA_PUMP_DIR logfile=tts_rcat.log transport_tablespaces=rcat transport_full_check=y<br /><br /># El log de expdp nos informa de los ficheros que necesitamos para hacer la importación<br />#   · /u01/app/oracle/admin/OEM/dpdump/tts_rcat.dmp<br />#   · /u01/app/oracle/oradata/OEM/rcat.dbf<br /><br /># NO NECESARIO, pero si tuvieramos que convertir el TBS de plataforma, lo haríamos así con RMAN<br /># Ejemplo:<br />#   RMAN&gt; CONVERT TABLESPACE RCAT TO PLATFORM 'AIX-Based Systems (64-bit)' FORMAT '/tmp/%U';<br />#<br />#   Starting conversion at source at 12-JUN-13<br />#   using channel ORA_DISK_1<br />#   using channel ORA_DISK_2<br />#   channel ORA_DISK_1: starting datafile conversion<br />#   input datafile file number=00008 name=/u01/app/oracle/oradata/OEM/rcat.dbf<br />#   converted datafile=/tmp/data_D-OEM_I-2661290750_TS-RCAT_FNO-8_0aoc03v3<br />#   channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01<br />#   Finished conversion at source at 12-JUN-13<br /><br /># Movemos los ficheros generados a la VM OCM<br />scp /u01/app/oracle/admin/OEM/dpdump/tts_rcat.dmp ocm:/u01/app/oracle/admin/OCM/dpdump/<br />scp /u01/app/oracle/oradata/OEM/rcat.dbf ocm:/u01/app/oracle/oradata/OCM

 

-- Ya podemos restaurar el modo Read/Write del TBS&lt;/span&gt;<br />&lt;pre&gt;ALTER TABLESPACE RCAT READ WRITE;<br /><br />-- Creamoe el usuario RMAN en la BD de OCM<br />CREATE USER RMAN IDENTIFIED BY "rman";<br />GRANT CONNECT, RESOURCE TO RMAN;

 

# Importamos el tablespace&lt;/span&gt;<br />&lt;pre&gt;impdp system dumpfile=tts_rcat.dmp directory=data_pump_dir transport_datafiles=/u01/app/oracle/oradata/OCM/rcat.dbf logfile=tts_import.log

 

-- Realizamos comprobaciones con&lt;/span&gt;<br />&lt;pre&gt;SELECT COUNT(1) FROM RMAN.DB;<br />SELECT COUNT(1) FROM RMAN.DBINC;<br />SELECT COUNT(1) FROM RMAN.BP;<br /><br />-- Limpiamos el entorno<br />-- Borramos el TBS en OCM (Ojo, en OCM no en la bd de OEM)<br />DROP TABLESPACE RCAT INCLUDING CONTENTS AND DATAFILES;<br />DROP USER RMAN CASCADE;

3. En el ejercicio anterior hemos realizar un movimiento de un TBS (RCAT) de la BD de OEM a OCM. En uno de los pasos que hemos seguido, es necesario poner el TBS en modo READ ONLY. Esto puede suponer un problema en entornos productivos donde no se puede parar el «servicio». Existe una forma alternativa con RMAN para obtener un tablespace transportable de forma automática. RMAN se encarga de crear una instancia auxiliar, realizar una recuperación en el tiempo de la BD (DBPITR) y sacar el TBS transportable junto con el DUMP. Veamos como realizarlo.

# Lo primero es asegurarnos de que tenemos un backup completo de la BD de OEM<br /># Si no lo tenemos, realizar un BACKUP completo<br />BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;<br /><br /># Creamos los directorios necesarios para RMAN<br />mkdir -p /tmp/transportdest<br />mkdir -p /tmp/auxdest<br /><br /># Lanzamos el comando para generar el TBS transportable de RCAT<br /># Si aparece el error RMAN-06024 porque no encuentra el CONTROLFILE, ejecutamos en OEM<br /># Más información en MOS =&gt; 466321.1 (madre mía la de dolores de cabeza que me ha dado esto uffff)<br /># ALTER SYSTEM ARCHIVE LOG CURRENT;<br />RUN<br />{<br /><%%KEEPWHITESPACE%%>  # Podríamos utilizar otro fichero INIT (no es necesario en nuestro caso)<br /><%%KEEPWHITESPACE%%>  # SET AUXILIARY INSTANCE PARAMETER FILE TO '/tmp/auxinstparams.ora';<br /><%%KEEPWHITESPACE%%>  TRANSPORT TABLESPACE RCAT<br /><%%KEEPWHITESPACE%%>    TABLESPACE DESTINATION '/tmp/transportdest'<br /><%%KEEPWHITESPACE%%>    AUXILIARY DESTINATION '/tmp/auxdest';<br />}

Además, no sólo podemos generar un TBS transportable del momento actual, sino que además podríamos especificar una fecha/hora o un SCN del que queremos recuperar dicho TBS. Más info en en la Documentación de Oracle.