Se puede utilizar RMAN para duplicar una base de datos con el comando DUPLICATE a partir de los backups de la base de datos original manteniendo la base de datos original intacta. La base de datos duplicada (con nuevo DBID) será idéntica a la base de datos target o podrá contener solo una parte de la misma. Por otra parte, la base de datos target y la duplicada pueden estar en el mismo servidor o en servidores diferentes.
El uso que suele darse a la duplicación es:
- Probar las copias de seguridad y sus recuperaciones.
- Exportar datos que se hayan borrado accidentalmente de la base de datos original. Se puede exportar una tabla de la copia e importarla en la base de datos original.
Arquitectura de la duplicación
El proceso de duplicación puede ser dividido en varias fases:
- RMAN determina los backups necesarios para realizar la operación. RMAN reserva los canales auxiliares para la instancia auxiliar. RMAN restaura los ficheros de datos en la instancia auxiliar. RMAN construye un nuevo fichero de control auxiliar. RMAN restaura los ficheros de log archivados del backup (si es necesario) y realiza el recovery. RMAN establece el DBID a la instancia auxiliar y abre la base de datos con la opción resetlogs.
- Una base de datos duplicada no es igual que una base de datos Standby, aunque ambas se hayan creado con el comando DUPLICATE. La base de datos STANDBY es actualizada periódicamente con los Archived Redo Logs y en caso de caída de la principal puede ser utilizada como la base de datos primaria; una base de datos duplicada no.
- Desde versión 10g de Oracle, el comando DUPLICATE realiza todas las operaciones necesarias para obtener una copia de una base de datos. Sin embargo, puede seguir usándose el procedimiento manual de versiones anteriores.
Tareas básicas para la duplicación de base de datos
Para preparar la instancia auxiliar que RMAN utilizará durante el proceso de duplicación se deben realizar las siguientes tareas:
Crear un fichero de contraseñas para la instancia auxiliar
Seguir el procedimiento de administración usando el ejecutable orapwd. Por ejemplo:
> orapwd Usage: orapwd file= password= entries= force= where file - name of password file (mand), password - password for SYS (mand), entries - maximum number of distinct DBAs and OPERs (opt), force - whether to overwrite existing file (opt) There are no spaces around the equal-to (=) character.
El siguiente comando crea un fichero de contraseñas denominado acct.pwd que permite la conexión de 30 usuarios privilegiados. La contraseña de los usuarios que se conecten como SYS será secret.
orapwd FILE=acct.pwd PASSWORD=secret ENTRIES=30
Comprobar la conectividad vía OracleNet a la instancia auxiliar
La instancia auxiliar debe ser accesible via Oracle Net. Antes de proceder a la duplicación se debe comprobar el acceso a la misma. La conexión ha de realizarse como SYSDBA por lo que el fichero de contraseñas debe existir.
Crear un fichero de parámetros de inicialización para la instancia auxiliar
Se debe crear un fichero de parámetros para la instancia auxiliar. Los parámetros mínimos requeridos son:
- DB_NAME – El mismo nombre que el utilizado con el comando DUPLICATE de RMAN. No se puede usar el mismo nombre que la base de datos target si la duplicación se realiza en el mismo Oracle Home. Si la duplicación se realiza en diferentes Oracle Home, el nombre de la base de datos auxiliar no podrá ser el mismo que las que estén en ese home.
- CONTROL_FILES – Se aplica de igual forma que en la creación de una base de datos nueva. Ha de cumplir las mismas condiciones.
- DB_BLOCK_SIZE – Igual que en base de datos target.
- DB_FILE_NAME_CONVERT – Se utilizará para establecer una nueva ruta o nombre a los ficheros de datos de la base de datos auxiliar.
- LOG_FILE_NAME_CONVERT – Se utilizará para establecer una nueva ruta o nombre a los ficheros de log de la base de datos auxiliar.
Si no se establecen parámetros de conversión de nombres de ficheros se pueden usar los parámetros de gestión de OMF (Oracle Managed Files) DB_CREATE_FILE_DEST, DB_CREATE_ONLINE_LOG_DEST_n, or DB_RECOVERY_FILE_DEST. En este caso se podrá obviar el parámetro CONTROL_FILES, creándose los ficheros de control en la ruta OMF.
A continuación se muestra un fichero de parámetros de inicialización para la instancia auxiliar de una duplicación:
DB_NAME=newdb CONTROL_FILES=(/dup/oracle/oradata/trgt/control01.ctl, /dup/oracle/oradata/trgt/control02.ctl) DB_FILE_NAME_CONVERT=(/oracle/oradata/trgt/,/dup/oracle/oradata/trgt/) LOG_FILE_NAME_CONVERT=(/oracle/oradata/trgt/redo,/dup/oracle/oradata/trgt/redo)
Una vez generado el fichero de parámetros de inicialización (init.ora) se ejecutará el comando CREATE SPFILE para crear el fichero de parámetros servidor (spfile.ora). Es muy importante crear este fichero de parámetros en la ruta por defecto para que RMAN lo encuentre cuando comience el proceso de duplicación. Un ejemplo de creación de este fichero podría ser:
CREATE SPFILE FROM PFILE='/tmp/initDUPDB.ora';
Arrancar la instancia auxiliar
Antes de que RMAN comience la operación de duplicación se debe hacer una conexión a la instancia auxiliar con SQL*Plus y arrancar la instancia (NOMOUNT). Por ejemplo:
CONNECT SYS/oracle@aux AS SYSDBA STARTUP FORCE NOMOUNT
Montar y abrir la base de datos target
La base de datos target ha de estar montada y abierta:
SQL> CONNECT SYS/oracle@trgt AS SYSDBA; STARTUP MOUNT;
Comprobar los backups precisos para la duplicación
Asegurar que todos los ficheros de datos del backup de la base de datos target son accesibles desde el servidor en el que está generada la instancia auxiliar. El backup puede ser completo, de ficheros individuales o incremental.
Por otra parte, los redo log archivados necesarios para hacer la duplicación a un punto en el tiempo deben estar accesibles desde el servidor en el que está duplicada la base de datos.
Reservar canales auxiliares si los canales automáticos no están configurados
Arrancar RMAN con una conexión a la base de datos target, a la instancia auxiliar y al catálogo de recuperación, si procede.
% rman TARGET SYS/oracle@trgt CATALOG rman/cat@catdb AUXILIARY SYS/oracle@aux
Si no hay canales automáticos configurados, deben ser reservados manualmente dentro del mismo bloque RUN en el que se realizará la duplicación de la base de datos. Por ejemplo:
RUN { ALLOCATE AUXILIARY CHANNEL ch1 DEVICE TYPE sbt; ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK; ALLOCATE AUXILIARY CHANNEL aux2 DEVICE TYPE DISK; ALLOCATE AUXILIARY CHANNEL aux3 DEVICE TYPE DISK; . . . DUPLICATE TARGET DATABASE TO dupdb; }
Duplicar una base de datos en servidor remoto con igual estructura de directorios
Este es el caso mas simple de duplicación de una base de datos. En este supuesto no es necesario cambiar la localización de los ficheros en el fichero de parámetros de inicialización.
Se realizarán las tareas previas descritas en el apartado anterior y se procederá a la duplicación.
El comando DUPLICATE de RMAN será ejecutado con la opción NOFILENAMECHECK (igual nombre de ficheros en origen y destino).
DUPLICATE TARGET DATABASE TO dupdb PFILE = /dup/oracle/dbs/initDUPDB.ora # si aplica NOFILENAMECHECK;
Duplicar base de datos en servidor remoto con diferente estructura de directorios
En este supuesto se debe tener en cuenta la generación de los nuevos nombres de ficheros en la nueva estructura de directorios.
Los nombres de los nuevos ficheros pueden establecerse por dos métodos: mediante el fichero de parámetros de inicialización o a través de comandos específicos de RMAN.
Método 1: Fichero de parámetros de inicialización
Se deben establecer los parámetros de inicialización con la nueva ruta en la que se duplicarán los ficheros: DB_FILE_NAME_CONVERT y LOG_FILE_NAME_CONVERT. A continuación se ejecutará el comando DUPLICATE de RMAN.
El siguiente ejemplo asume que los servidores origen y destino tienen capacidad para acceder a la misma unidad de cinta. En el ejemplo se duplica la base de datos usando un canal de tipo sbt automático y un fichero de parámetros servidor (spfile) localizado en el servidor en el que se generó la instancia auxiliar:
DUPLICATE TARGET DATABASE TO dupdb DEVICE TYPE sbt;
Método 2: Opciones AUXNAME y NEWNAME de RMAN
Otra posibilidad a la hora de renombrar los ficheros de la base de datos auxiliar es utilizar los comandos CONFIGURE AUXNAME o SET NEWNAME de RMAN.
El siguiente ejemplo utiliza canales preconfigurados y el fichero de parámetros servidor (SPFILE) para el proceso de duplicación:
RUN { # establecer nuevos nombres a los ficheros SET NEWNAME FOR DATAFILE 1 TO '/dup/oracle/oradata/trgt/system01.dbf'; SET NEWNAME FOR DATAFILE 2 TO '/dup/oracle/oradata/trgt/undotbs01.dbf'; . . . # lanzar comando duplicate DUPLICATE TARGET DATABASE TO dupdb # crear grupos de redo log LOGFILE GROUP1 ( '/dup/oracle/oradata/trgt/redo01a.log', '/dup/oracle/oradata/trgt/redo01b.log', '/dup/oracle/oradata/trgt/redo01c.log'; ) SIZE 200K, GROUP2 ( '/dup/oracle/oradata/trgt/redo02a.log', '/dup/oracle/oradata/trgt/redo02b.log', '/dup/oracle/oradata/trgt/redo02c.log'; ) SIZE 200K, GROUP3 ( '/dup/oracle/oradata/trgt/redo03a.log', '/dup/oracle/oradata/trgt/redo03b.log', '/dup/oracle/oradata/trgt/redo03c.log'; ) SIZE 200K;
El siguiente ejemplo usa el comando CONFIGURE AUXNAME para establecer los nuevos nombres a los ficheros de datos. Usa fichero de parámetros servidor para la duplicación de base de datos y claúsula LOGFILE para especificar los nombres y tamaños de los ficheros redo log online.
Primero se ejecuta el comando CONFIGURE AUXNAME:
# establecer nuevos nombres a los ficheros CONFIGURE AUXNAME FOR DATAFILE 1 TO '/dup/oracle/oradata/trgt/system01.dbf'; CONFIGURE AUXNAME FOR DATAFILE 2 TO '/dup/oracle/oradata/trgt/undotbs01.dbf'; # ... y mas hasta establecer todos los nombres necesarios
y posteriormente se ejecuta el comando DUPLICATE:
DUPLICATE TARGET DATABASE TO dupdb # establecer fichero de parámetros si es preciso(si no hay SPFILE) PFILE = /dup/oracle/dbs/initDUPDB.ora . . . # crear grupos de redo log online LOGFILE GROUP1 ( '/dup/oracle/oradata/trgt/redo01a.log', '/dup/oracle/oradata/trgt/redo01b.log', '/dup/oracle/oradata/trgt/redo01c.log'; ) SIZE 200K, GROUP2 ( '/dup/oracle/oradata/trgt/redo02a.log', '/dup/oracle/oradata/trgt/redo02b.log', '/dup/oracle/oradata/trgt/redo02c.log'; ) SIZE 200K, GROUP3 ( '/dup/oracle/oradata/trgt/redo03a.log', '/dup/oracle/oradata/trgt/redo03b.log', '/dup/oracle/oradata/trgt/redo03c.log'; ) SIZE 200K;
Tras la duplicación se deben eliminar las configuraciones de nombres de ficheros establecidas al efecto:
CONFIGURE AUXNAME FOR DATAFILE 1 CLEAR; CONFIGURE AUXNAME FOR DATAFILE 2 CLEAR;
Duplicar una base de datos en el servidor local
Se debe seguir un procedimiento igual al utilizado para duplicar una base de datos en un servidor remoto con diferente estructura de directorios.
Dentro del mismo servidor, se puede duplicar la base de datos en el mismo Oracle Home cuidando que el nombre de la base de datos sea diferente al de la base de datos target.
Es muy importante NO USARLA CLAÚSULA NOFILENAMECHEK.Si se utiliza, el comando DUPLICATE puede sobreescribir los ficheros de datos de la base de datos target.
Operaciones realizadas por RMAN en la duplicación debase de datos
- RMAN ejecutará las siguientes acciones como parte del proceso de duplicado:
- Restaurará los ficheros de datos de la base de datos original en la base de datos duplicada y ejecutará una recuperación incompleta utilizando los backups y los Archived Redo Logs.
- Parará e iniciará la base de datos duplicada.
- Abrirá la base de datos duplicada con la opción RESETLOGS después de la recuperación incompleta. Exceptuando si la base de datos es STANDBY DUPLICATE… FOR STANDBY en cuyo caso RMAN no abrirá la base de datos.
- Generará un nuevo y único DBID para la base de datos duplicada, a excepción de si es Standby.
- Durante la duplicación RMAN ejecuta una recuperación incompleta puesto que los Redo Logs Online no están en las copias de seguridad y no pueden ser aplicados.
Opciones de duplicación
Cuando se duplica una base de datos se puede especificar las siguientes opciones:
- Ejecutar el comando DUPLICATE con o sin un catálogo de recuperación.
- Saltarse o no duplicar los tablespaces de sólo lectura con la opción SKIP READONLY. En la base de datos duplicada aparecerán estos tablespaces dentro del diccionario por si se desean activar más tarde. Ej. Un tablespace que sea un CD-ROM.
En la vista V$DATAFILE aparecerán estos tablespaces con los siguientes valores en las columnas:
STATUS = OFFLINE ENABLED = READ ONLY NAME = MISSING
En la columna STATUS de la vista DBA_DATA_FILES aparecerán con el valor AVAILABLE.
En la columna STATUS de la vista DBA_TABLESPACES aparecerán con el valor READ ONLY.
- Saltarse tablespaces con la opción SKIP TABLESPACE. El único que no se puede saltar es el tablespace SYSTEM.
En la vista V$DATAFILE aparecerán estos tablespaces con los siguientes valores en las columnas:
STATUS = OFFLINE ENABLED = READ ONLY NAME = MISSING
En la columna STATUS de la vista DBA_DATA_FILES aparecerán con el valor AVAILABLE.
En la columna STATUS de la vista DBA_TABLESPACES aparecerán con el valor READ ONLY.
- Crear la base de datos en una nueva máquina o host. Si la estructura de directorios es la misma se puede especificar la cláusula NOFILENAMECHECK y reutilizar los mismos nombres de los archivos para los ficheros de datos duplicados.
- Usar el comando SET UNTIL o la cláusula UNTIL en el comando DUPLICATE para fijar el punto de recuperación incompleta. Por defecto, es el punto más reciente contenido en los archivos de backup y los Archived Redo Logs.
- Registrar la base de datos duplicada en el mismo catálogo de recuperación puesto que RMAN genera un nuevo DBID durante la duplicación.