miércoles, 16 de marzo de 2011

Clonar con RMAN una Base de Datos sin conexion al Catalogo y a la Base de datos de Origen

Uno de las tareas comunes y a veces repetitivas que tenemos para los usuarios de desarrollo, es la necesidad de clonar una base de datos de produccion hacia una de desarrollo, pero uno de los problemas que presentaba el comando DUPLICATE de rman era que para poder hacerlo tenias que tener una conexion a la base de datos origen (TARGET DATABASE) , que pasaba si por consecuencias del destino no tenias o no podias conectarte a esta base de datos, realmente te ponia en una situacion en donde te las tenias que ingeniar para poder clonar tu base de datos.

En la version de 11gR2 puedes clonar tu base de datos sin que tengas que conectarte a la base de datos origen y tampoco al catalogo, solamente con que tengas acceso al respaldo es mas que suficiente, claro tomando en cuenta de que es un respaldo consistente y que tambien se hayan respaldado los archive logs, para un ejemplo de como hacer un respaldo lo puedes encontrar en nuestra entrada  Respaldos con RMAN - Parte I .Vamos a ver como se hace

Para empezar tenemos que asegurarnos que el respaldo sea visible en el servidor donde se encuentra la base de datos auxiliar (AUXILARY DATABASE), ya sea copiando los archivos del servidor donde se encuentra al servidor de la base de datos auxiliar o por un NFS share.

El siguiente paso es asegurarnos que tenemos todas nuestras variables de ambiente definidas para la base de datos auxiliar, como ORACLE_HOME,ORACLE_SID, ORACLE_BASE, y cualquier otra variable que use tu auxiliar.

Importante, la siguiente variable de ambiente tiene que estar presente, ya que si no te puedes enfrentar al Bug 1300348.1 (Recovery Time For Rman Duplication Does Not Match Specified Until Time Clause). En donde lo que sucede es se trunca la fecha y es como si fueran las 00:00 hrs de la fecha a la que vas a hacer la recuperacion.

NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS'
export NLS_DATE_FORMAT


Tambien tenemos que definir nuestro archivo de parametros init_AUXILIAR_BD.ora (pfile). Puedes tomar como ejemplo el archivo de parametros de la base de datos Origen, asegurandote que el parametro db_name= AUXILIAR_BD y control_files = DIRECTORIO_CTL_AUXILIAR_BD

Asegurate de que $ORACLE_HOME/bin se encuentre en el PATH tambien
ejemplo
export PATH=$ORACLE_HOME/bin:$PATH


Ahora vamos a copiar el archivo de password de la base de datos origen a nuestra auxiliar, este archivo se encuentra en $ORACLE_HOME/dbs para unix o $ORACLE_HOME/database para windows, lo puedes encontrar con el nombre de orapwNOMBRE_BD.

Una vez que hayamos completado los pasos anteriores,vamos a crear el archivo spfile del pfile initAUXILIAR_BD.ora que configuramos arriba y vamos a arrancar la base de datos auxiliar en modo nomount

oracle $ sqlplus

SQL*Plus: Release 11.2.0.2.0 Production on Thu Mar 17 01:00:23 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Enter user-name: /as sysdba

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the OLAP, Data Mining and Real Application Testing options

TESTDB >create spfile from pfile='/mount/dba01/oracle/TESTDB/pfile/initTESTDB.ora';

File created.

TESTDB >startup nomount
ORACLE instance started.

Total System Global Area 3658891264 bytes
Fixed Size 2163680 bytes
Variable Size 1392516128 bytes
Database Buffers 2248146944 bytes
Redo Buffers 16064512 bytes

TESTDB >exit

Ahora vamos a crear el script de rman para hacer la clonacion, que te puedes ayudar del siguiente query, corriendolo en la base de datos origen para hacer los cambios de directorio, este lo utilizo en Unix

SELECT 'set newname for datafile '
|| a.file#
|| ' to ''&aux_data_mnt'
|| SUBSTR (a.NAME, INSTR (a.NAME, '/', -1, 1) + 1)
|| ''';'
FROM v$datafile a, v$tablespace b
WHERE a.ts# = b.ts# and
a.file# IN (SELECT DISTINCT file#
FROM v$backup_datafile)
UNION ALL
SELECT 'set newname for tempfile '
|| a.file#
|| ' to ''&aux_data_mnt'
|| SUBSTR (a.NAME, INSTR (a.NAME, '/', -1, 1) + 1)
|| ''';'
FROM v$tempfile a;

Del resultado de query de arriba, voy a construir el script de rman, llamado clone_TESTDB.rmn, toma en cuenta que nos vamos a conectar a la base de datos auxiliar, asi que tenemos que alojar los canales auxiliares.

RUN
{
ALLOCATE AUXILIARY CHANNEL CH1 TYPE DISK ;
ALLOCATE AUXILIARY CHANNEL CH2 TYPE DISK ;
ALLOCATE AUXILIARY CHANNEL CH3 TYPE DISK ;
set newname for datafile 1 to '/mount/u01/oracle/TESTDB/data/system01.dbf';
set newname for datafile 2 to '/mount/u01/oracle/TESTDB/data/sysaux01.dbf';
set newname for datafile 3 to '/mount/u01/oracle/TESTDB/data/def01.dbf';
set newname for datafile 4 to '/mount/u01/oracle/TESTDB/data/undorbs1_1.dbf';
set newname for tempfile 1 to '/mount/u01/oracle/TESTDB/data/temp01.dbf';
DUPLICATE DATABASE TO TESTDB
UNTIL time "to_date('12-MAR-201112:57:29','dd-MON-yyyyhh24:mi:ss')"
BACKUP LOCATION '/mount/copy01/SOURCEDB'
logfile
group 1 (
'/mount/u01/oracle/TESTDB/log/redo01g01.log',
'/mount/u01/oracle/TESTDB/log/redo02g01.log'
) size 50M,
group 2 (
'/mount/u01/oracle/TESTDB/log/redo01g02.log',
'/mount/u01/oracle/TESTDB/log/redo02g02.log'
) size 50M,
group 3 (
'/mount/u01/oracle/TESTDB/log/redo01g03.log',
'/mount/u01/oracle/TESTDB/log/redo02g03.log'
) size 50M
;
}

Si te fijas en el script, la clave se encuentra en la seccion del comando DUPLICATE,
DUPLICATE DATABASE TO TESTDB
UNTIL time "to_date('12-MAR-201112:57:29','dd-MON-yyyyhh24:mi:ss')"
BACKUP LOCATION '/mount/copy01/SOURCEDB'
Ya que no estamos diciendo que sea el duplicado directamente de la base de datos TARGET, sino que estamos diciendole a rman donde se encuentra nuestro respaldo. Algo que debes saber es que cuando clonas una base de datos sin conexion al catalogo y a tu base de datos origen, la unica clausula UNTIL que puedes usar es TIME, no puedes usar SCN o SEQUENCE.
Ahora si ya estas listo para hacer la clonacion, conectate con la utileria de rman en la base de datos auxiliar, y corre el script creado arriba

oracle $ rman auxiliary /

Recovery Manager: Release 11.2.0.2.0 - Production on Thu Mar 17 02:38:44 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

connected to auxiliary database: TESTDB (not mounted)

RMAN>@clone_TESTDB.rmn

Conclusion

Esta nueva manera de hacer una clonacion, ta va a ayudar a mitigar errores, ya que no es necesario conectarte a la base de datos de origen, y de la misma manera, si la base de datos origen no esta disponible, vas a poder clonar tu base de datos.