jueves, 16 de agosto de 2012

Implementación de una Réplica Standalone de Base de Datos Oracle 11g

Hace mucho que no escribo en este espacio, pero entre el trabajo y las actividades en el hogar, no queda mucho tiempo para escribir.

En esta entrega mostraré los pasos para implementar una réplica standby de Base de Datos sobre Windows. He de mencionar que esto lo hice en base a la documentación de Oracle para implementar replicas sin dataguard para la versión 9i, que estaba guardado en mi empresa.

Este tipo de réplica aún es utilizado en muchos lugares, ya que la implementación no es muy compleja y en cuestiones de licenciamiento, no tiene costo mas que el de la BD que se está creando.

Actualmente lo tengo aplicado con la versión 11g, y una de las ventajas es que se puede utilizar la modalidad snapshot database, útil para pruebas de tipo UAT (User Aceptance Test) sin necesidad de que entren a los entornos productivos o hacer carga de información a un entorno de desarrollo.

Las condiciones para implementar la réplica son las siguientes:

  • Las version de la BD primaria y la réplica deben ser la misma
  • La versión sistema operativo donde se encuentra la BD primaria debe ser del mismo tipo que la réplica (no se pueden mezclar linux en la primaria con un windows en la réplica, por ejemplo)


Ahora si, vamos a colocar los pasos (recuerden que la implementación que describo es para un ambiente con SO Windows Server 2003, en caso de utilizar otro hay que revisar en la documentación de oracle particularidades para su SO.

En el servidor de Producción

1.- Realizar un respaldo en Frío de la Base de Datos (Datafiles, Controlfiles, Redologs, PWDFile y SPFILE)

2.- Crear un PFILE a partir del SPFILE y colocarlo en la carpeta del respaldo en Frío
      SQL> create pfile = 'ruta\SIDPfile.ora' from spfile;

3.- Crear un STANDBY CONTROLFILE y colocarlo en la carpeta del respaldo en Frío
      SQL>alter database create standby controlfile as 'ruta\standby.ctl';

4.- Copiar la carpeta del respaldo en Frío en el servidor para la réplica.


En el servidor de Réplica

5.- Instalar software de Base de Datos Oracle con la misma versión que en el de Producción

6.-Crear una instancia con DBCA la cual deberá tener el mismo SID que la de Producción

7.- Modificar el PFILE de la carpeta del respaldo en frío

  • Modificar rutas y nombres de los controlfiles por los de standby control files en el parametro *.control_files
  • Modificar ruta de destino de archives (si aplica)
  • Si los datafiles no van a quedar en la misma ruta que en el servidor de producción, utilizar el parametro *.db_file_name_convert para hacer las "traducciones de rutas"
  • Si los redolog no estarán en la misma ruta que en el servidor de producción utilizar el parametro  *.log_file_name_convert (Se pueden utilizar "patrones" de rutas, por ejemplo si yo seteo en la ruta "C:\DIR\FILES\" se traduciran todos las carpetas que estén en la raíz de esa ruta [FILES] y lo que esté dentro de ella)
8.- En una consola de SQLPlus crear un SPFILE a partir del PFILE que se modificó, con ello se creará un nuevo SPFILE en la ruta del original


      SQL>create spfile from pfile='ruta\SIDpfile.ora';

      NOTA: En este paso asegurese que sus variables de entorno están configuradas para el SID de la base de datos que creó con DBCA

9.- Detener la instancia e iniciarla en modo mount


      SQL>shutdown immediate;
      SQL>startup mount;

       NOTA: Si al momento de montar la base no reporta ningún datafile faltante, quiere decir que vamos bien... pero pase lo que pase NO ABRIR LA BASE DE DATOS!

10.- Pasar la Base de Datos a modo Physical Standby, con ello al abrir la BD automáticamente se abre en modo SOLO LECTURA. Esta operación desmonta la base de datos.

       SQL>alter database convert to physical standby

Para revisar si la configuración aplicó realice la siguiente consulta:


select database_role from v$database;

11.- Reiniciar la Base de Datos en modo MOUNT


SQL>shutdown immediate;
      SQL>startup mount;


12.- Iniciar el proceso de recuperación

SQL>recover stanby database;

Con ello dará inicio el proceso de recuperación, el cual solicitará los archives que sean necesarios para completar los datafiles con las operaciones realizadas en la BD de Producción.

Este proceso se puede realizar por medio de archivos de procesamiento por lotes.

Activación de la Base de Datos Standby 

Para activar la Base de Datos en modo Lectura/Escritura en caso de perdida del servidor productivo, se realiza lo siguiente:

1.- Detener el proceso de sincronización
2.- Detener instancia de Base de Datos
3.- Iniciar la instancia en modo MOUNT
4.- Pasar la Base de Datos de Physical Standby a Primary

      SQL>alter database activate physical standby database;

5.- Verificar el rol de la base de datos ejecutando la consulta, de la cual es resultado debe ser PRIMARY

SQL>select database_role from v$database;


6.- Abrir la instancia de Base de Datos y verificar que este abierta para operaciones de lectura y escritura. El resultado de la siguiente consulta debe ser, para OPEN_MODE = READ WRITE y para DATABASE_ROLE=PRIMARY


SQL>select open_mode, database_role from v$database;


Y con ello concluimos la implementación de la réplica de Base de Datos.

Mi proceso de sincronización lo describo en la siguiente imagen




También les dejo los scripts que utilizo en .bat para transeferir los archives y hacer la recuperación en la BD.

Script de Transferencia de Producción a Réplica por FTP

TITLE Envio Replica CTS
:INICIO
cls
@ECHO OFF
cd G:\DatabaseProd\Arcs
if exist *.txt del *.txt
if not exist *.arc goto :FINAL
ren *.arc *.bck
dir /B *.bck >>ListaArchives.txt
echo open ftp-replica >>ftpenvio.txt
echo userftp>>ftpenvio.txt
echo pwd_userftp>>ftpenvio.txt
for /F "eol=t tokens=1" %%i in (ListaArchives.txt) do echo put %%i>>ftpenvio.txt
echo bye>>ftpenvio.txt
ftp -s:ftpenvio.txt
move *.bck G:\DatabaseProd\ArcsProcesados
ren  G:\DatabaseProd\ArcsProcesados\*.bck *.ARC
:FINAL
timeout 120
GOTO :INICIO


Scripts de Recuperación en Réplica


@ECHO OFF
TITLE Recover Replica CTS
:RECOVER
cd C:\Archives
if not exist *.bck goto :FINAL
ren *.bck *.ARC
sqlplus / as sysdba @SQLRecover.sql
:FINAL
timeout 120
if exist *.ARC move *.ARC O:\ArchivesCargados
goto :RECOVER


El script SQLRecover.sql tiene el siguiente contenido

recover standby database;
auto
quit

Esta ocasión si ha sido un post extenso, pero que espero sea de utilidad.

Posteriormente estaré probando Oracle Dataguard, ya que lo implemente registraré mi experiencia aqui.