Alta Disponibilidad I – Configurando Dataguard en Oracle

DUPLICATE DATABASE FOR STANDBY

Es importante que consideremos que un posible desastre puede ocurrirle a nuestra base de datos productiva y en muchos casos puede que devenga en una pérdida total de servicio o del servidor mismo, donde si bien existe la posibilidad de hacer un restore de la base en un host distinto, es mucho el tiempo que nos llevaría hacerlo(Criticidad del Negocio) , sin tener los datos desde el punto en que se tomo el backup al momento de la pérdida, desatención del en el negocio, etc.

Es ahi donde ponemos en marcha nuestro plan de tener una base de datos secundaria, con la copia de todos los datos, y que pueda entrar rapidamente en contigencia en caso de que la base primaria de producción sufra una caida, se rompa un disco, no haya red, o hasta la perdidad completa del edificio donde se halla el servidor.

Oracle, nos provee una herramienta llamada dataguard, donde podemos generar una base standby, que sera la encargada de entrar en contingencia por medio de SWICTH_OVER o FAIL_OVER. También hay otros modos como DATAGUARD BROKER, que nos provee las mismas funcionalidades, pero en solo una ejecución de comandos.

Básicamente la estructura es una base Productiva, y n contingencias.

Cada contigencia es altamente recomendable tenerla en un host fuera del productivo, en lo posible en otro edificio.

Esquema Básico de Dataguard

Yo elegi en este caso la opción de armarlo con RMAN, y hacerlo con la opción que nos ofrece para ello por medio de DUPLICATE TARGET DATABASE FOR STANDBY.

Claramente hay que realizar una configuración previa que listo aquí mismo:

  • Archivo de parámetros de la base (Pfile, spfile, init)
  • listener.ora
  • tnsnames.ora
  • pwfile
  • Que la base se encuentre en modo archivelog, un backup de RMAN “siempre es en caliente”.

Para la configuración de los parámetros de la base, recomiendo leer la documentación oficial, y en breve yo expondre los que me toca modificar a mi:

Parámetros de inicio para el ROL PRIMARIO

DB_FILE_NAME_CONVERT: Toma todos los datafiles de la base y los convierte apropiadamente al nuevo path, EJ *_tbs hacia *_stbytbs

*.db_file_name_convert='+MBPRO_DG1/MBPRODG','+MBPRODG_DG1/MBPRO'

DB_LOG_FILE_CONVERT: Toma todos los redolog files y los convierte apropiadamente al nuevo path, EJ *_log hacia *_stbylog

*.log_file_name_convert='+MBPRO_DG1/MBPRODG','+MBPRODG_DG1/MBPRO'

FAL_SERVER: permite que el FAL_SERVER, ahora MBPRODG como primario, pueda enviar REDO hacia MBPRO.

*.fal_server='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=sdat4105lx.bancocredicoop.coop)(PORT=1529)))(CONNECT_DATA=(SERVICE_NAME=MBPRODG_XPT.bancocredicoop.coop)(SERVER=dedicated)))'

FAL_CLIENT: Este parámetro permite que la base primaria MBPRO al pasar a un rol standby pueda obtener los REDO, si la base MBPRODG, ahora en rol primario no pueda enviarlos.

*.fal_client='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=sdat4103lx.bancocredicoop.coop)(PORT=1529)))(CONNECT_DATA=(SERVICE_NAME=MBPRO_XPT.bancocredicoop.coop)(INSTANCE_NAME=MBPRO)(SERVER=dedicated)))'

LOG_ARCHIVE_CONFIG: Habilita a la base a enviar o recibir REDO, despúes de una transición de roles. Este especifica el parámetro correcto para el DG_CONFIG, del DB_UNIQUE_NAME y habilita dinamicamente la adhesión de n bases secundarias (STANDBY)

*.log_archive_config='DG_CONFIG=(MBPRO,MBPRODG)'

LOG_ARCHIVE_DEST_n: Especifica donde serán almacenados los REDO en la base primaria y secundarias.

*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST'

Transmite los archivos de REDO al destino de la base standby.

*.log_archive_dest_2='service="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=sdat4105lx.bancocredicoop.coop)(PORT=1529)))(CONNECT_DATA=(SERVICE_NAME=MBPRODG_XPT.bancocredicoop.coop)(INSTANCE_NAME=MBPRODG)(SERVER=dedicated)))"','   ARCH SYNC NOAFFIRM delay=0 OPTIONAL max_failure=0 max_connections=1   reopen=300 db_unique_name="MBPRODG" register net_timeout=180  valid_for=(online_logfile,primary_role)'

LOG_ARCHIVE_DEST_STATE_n: Habilita a que sean enviados o generados los REDO en los path especificados en el parametro LOG_ARCHIVE_DEST_n, si este se encuentra en ENABLE.

LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE

LOG_FILE_NAME_CONVERT: Convierte los paths donde se almacenan los REDO, en la primaria como en la secundaria.

*.log_file_name_convert='+MBPRODG_DG1/MBPRODG','+MBPRODG_DG1/MBPRO'

REMOTE_LOGIN_PASSWORDFILE: Habilita el mismo password para SYS en la primaria y la secundaria, se recomienda que este setado en EXCLUSIVE o SHARED.

*.remote_login_passwordfile='EXCLUSIVE'

Parámetros de inicio para el ROL SECUNDARIO

*.fal_client='MBPRODG'
*.fal_server='MBPRO'
*.db_file_name_convert='+MBPRO_DG1/MBPRO','+MBPRODG_DG1/MBPRODG'
*.log_file_name_convert='+MBPRO_DG1/MBPRO','+MBPRODG_DG1/MBPRODG'

Teniendo todo configurado, ahora podemos arrancar con nuestro proceso de duplicar la base con RMAN convirtiendola en una STANDBY.

Primero vamos a tomar un HOT_BACKUP con RMAN.

Suelo crear un script y gurdarlo en el catalogo asi me resulta mas sencillo de correr.

[oracle@saturno bin]$ rman target / catalog=rman@catrman

Recovery Manager: Release 10.2.0.4.0 - Production on Mon Sep 14 16:51:48 2009

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

connected to target database: MBPRO (DBID=xxxxxxx)
recovery catalog database Password:
connected to recovery catalog database

RMAN> list script names;

List of Stored Scripts in Recovery Catalog

Global Scripts

Script Name
Description
-----------------------------------------------------------------------
full_cold_backup

full_hot_backup

incremental_copy

RMAN> run {execute script full_hot_backup; }

Cuando finaliza el backup debemos pasarlo al mismo path que generamos en producción, en el equipo de contingencia, de lo contrario habrá que catalogar las piezas.

Nos logueamos en el equipo de contingencia, colocamos las variables de ambiente y ejecutamos el comando de RMAN bajo la siguiente sintaxis, recordemos que aca estamos utilizando el modo DUPLICATE, pero también podemos crear una STANDBY de forma MANUAL.

[oracle@saturno bin]$ rman target=sys@MBPRO catalog=rman@catrman auxiliary /

Recovery Manager: Release 10.2.0.4.0 - Production on Wed Sep 16 14:23:02 2009

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

target database Password:
connected to target database: MBPRO (DBID=xxxxxxx)
recovery catalog database Password:
connected to recovery catalog database
connected to auxiliary database: MBPRO (not mounted)

Una vez dentro podemos correr los comando de duplicate de RMAN para este caso en particular, DUPLICATE TARGET DATABASE FOR STANDBY;

RMAN> DUPLICATE TARGET DATABASE FOR standby;

Starting Duplicate Db at 16-SEP-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=154 devtype=DISK

contents of Memory Script:
{
restore clone standby controlfile;
sql clone 'alter database mount standby database';
}
executing Memory Script

Starting restore at 16-SEP-09
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: copied control file copy
input filename=/u03/rman_database_backup/controlSTBY.ctl
output filename=+MBPRO_DG1/MBPROdg/controlfile/current.257.697731795
Finished restore at 16-SEP-09

sql statement: alter database mount standby database
released channel: ORA_AUX_DISK_1
WARNING: DB_FILE_NAME_CONVERT resulted in invalid ASM names; names changed to diskgroup only.

contents of Memory Script:
{
set newname for tempfile  1 to
"+MBPRO_DG1";
switch clone tempfile all;
set newname for datafile  1 to
"+MBPRO_DG1";
set newname for datafile  2 to
"+MBPRO_DG1";
set newname for datafile  3 to
"+MBPRO_DG1";
set newname for datafile  4 to
"+MBPRO_DG1";
set newname for datafile  5 to
"+MBPRO_DG1";
set newname for datafile  6 to
"+MBPRO_DG1";
set newname for datafile  7 to
"+MBPRO_DG1";
set newname for datafile  8 to
"+MBPRO_DG1";
set newname for datafile  9 to
"+MBPRO_DG1";
restore
check readonly
clone database
;
}
executing Memory Script

executing command: SET NEWNAME

renamed temporary file 1 to +MBPRO_DG1 in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 16-SEP-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=158 devtype=DISK

channel ORA_AUX_DISK_1: starting datafile backupset restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to +MBPRO_DG1
restoring datafile 00002 to +MBPRO_DG1
restoring datafile 00003 to +MBPRO_DG1
restoring datafile 00004 to +MBPRO_DG1
restoring datafile 00005 to +MBPRO_DG1
restoring datafile 00006 to +MBPRO_DG1
restoring datafile 00007 to +MBPRO_DG1
restoring datafile 00008 to +MBPRO_DG1
restoring datafile 00009 to +MBPRO_DG1
channel ORA_AUX_DISK_1: reading from backup piece /u03/rman_database_backup/20090914_MBPRO_t697567954_s1091_p1_dbf
contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script
datafile 1 switched to datafile copy
input datafile copy recid=306 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/system.286.687024281
datafile 2 switched to datafile copy
input datafile copy recid=307 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/undotbs1.301.687024277
datafile 3 switched to datafile copy
input datafile copy recid=308 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/sysaux.287.687024279
datafile 4 switched to datafile copy
input datafile copy recid=309 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/users.317.687024381
datafile 5 switched to datafile copy
input datafile copy recid=310 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/undotbs2.295.687024279
datafile 6 switched to datafile copy
input datafile copy recid=311 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/undotbs3.289.687024279
datafile 7 switched to datafile copy
input datafile copy recid=312 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/MB_IDX.284.687024327
datafile 8 switched to datafile copy
input datafile copy recid=312 stamp=687025587 filename=+MBPRO_DG1/oapp1n/datafile/MB_IDX.284.687024327
datafile 9 switched to datafile copy

Una vez finalizado el proceso, podemos ejecutar verificar se se están aplicando los logs.

select NAME, THREAD#, SEQUENCE#, APPLIED, registrar
from v$archived_log where APPLIED='NO' order by sequence#;

De no ser asi hay que dar la orden para que  comience el recovery de los REDO que están llegando desde la primaria.

ALTER DATABASE RECOVERY MANAGER STANDBY DATABASE CANCEL;

About Juan Andres
Consultant | Oracle DBA & IT Specialist | LinuxUnix Administrator | Father | Musician | Farmer | Environmentalist | Writer | Builder | Buenos Aires · burzaco.wordpress.com

18 Responses to Alta Disponibilidad I – Configurando Dataguard en Oracle

  1. Pingback: ORACLE DATAGUARD – create a standby database by manual steps « Tecnología Informática Buenos Aires

  2. Edgar says:

    Buenos dias amigo saludos desde Venezuela ! encontre tu post y me parecio interesante ya que se me esta presentando un inconveniente con la configuracion de un dataguard sobre windows pero no me esta reconociendo el pwfile tu no sabes de algun tip que se deba tener en cuenta para el tratamiento especifico del Windows es un tema de permisos pero ya he verificado varias cosas y no me reconoce el archivo de password , algo relacionado con case sentitive ?? en realidad no se …. gracias por tu atencion si logras ver y responder algo !!!

    • Juan Andres says:

      Otra cosa mas, es importante que me pases la version y si el error es alguno de estos:

      OPW-00005
      ORA-1017
      ORA-1031
      ORA-1996

      también tene en cuenta que hayas seteado las variables de ambiente:

      ORA_sid_PWFILE + ORA_PWFILE

      • Edgar says:

        Gracias por tu atencion:

        La version utilizada es la 10g 10.2.0.4

        la linea de comando que estoy utilizando para crear el pwfile es:

        orapwd file=E:\oracle\PRO\102\database\pwPRO password=xxxxx

        Si le coloco las condiciones ignorecase=y me da error creo que eso aplica es para las 11g.

        las variables que me indicas quedarian como?

        ORA_PRO_PWFILE= LA RUTA DONDE ESTA EL ARCHIVO ? tengo que reiniciar ?

        ORA_PWFILE=E:\oracle\PRO\102\database\pwPRO ?

        En una oportunidad ley que habia algo relacionado con las mayusculas minusculas pero no encuentro la nota !

        gracias !!!!

      • Juan Andres says:

        Edgar:
        Te cuento que la nota de la cual me hablas es la 225097.1, te puede servir de referencia para algunos controles, en cuanto al ignorecase, solo aplica para 11g en adelante.

        En ORA_PRO_PWFILE pones el path, si no lo va a buscar directamente a lo que tengas en el ORA_PWFILE.

        También podes buscar en el registro de windows.

        Es importante que sepas que en las versiones de windows 10.2 se crea en mayúscula, y revisando en los windows que tengo aparece de esa manera, en tu caso sería PWDPRO.ora
        La nomenclatura del comando es la siguiente:

        orapwd FILE=PWDsid.ora PASSWORD=password ENTRIES=max_users FORCE=y/n

        Y otra detalle importante es ORACLE_BASE\ORACLE_HOME\DATABASE\PWDPRO.ORA debe estar la extensión en mayúscula.

        Podes ver tu seteo del archivo con TOOLS –> FOLDER OPTIONS –> VIEW –> y destildas HIDE FILE EXTENTIONS

        Con eso podes ver que la extensión de tu archivo se la correcta, por ahí encontras que tu init sea : initPRO.ora y tu pwfile debería ser PWPRO.ORA.

        Espero te sea de ayuda.

        Próximamente posteare la diferencias entre UNIX , WIN y las versiones 11 y 10.

  3. Juan Andres says:

    Edgar, Buenos Días, te pido si podes subir el log del error que te arroja como salida cuando no lo puede leer y si podes poner la linea de comandos que estas empleando , de esa manera puedo darte una respuesta que se aproxime a la solucion. Saludos !

  4. Edgar says:

    Buenas tardes :

    Juan resuelto el tema!!! ya me funciono !!

  5. Eduardo Hm says:

    Buenas,

    Navegando he llegado a este post en el que me podrias ayudar a montar un dataguard para un linux en Oracle 11g. La verdad que mirando por internet, he visto que hay varias formas de hacer un data guard, o bien de forma fisica o bien logica. La que intento implementar yo es la primera, un data guard fisico.

    Tengo un par de dudas. Una de ellas es si la base de datos standby, tiene que estar previamente creada por el asistente de creacion de base de datos de Oracle11g o si directamente se crea mientras se configura el data guard.

    De resto me gustaria que me mandaras paso por paso como montarlo en una maquina que tiene la base de datos primaria y otra maquina que tiene o que va a albergar el data guard.

    Muchas gracias y un cordial saludo

    • Juan Andres says:

      Tengo un par de dudas.
      Una de ellas es si la base de datos standby, tiene que estar previamente creada por el asistente de creacion de base de datos de Oracle11g o si directamente se crea mientras se configura el data guard.

      Mira, podes armar un dataguard en 11g de dos maneras:

      1) Tomando un backup de la primaria, configurar los parametros y que salga andando.
      2) Sin tomar un backup de la primaria.

      De resto me gustaria que me mandaras paso por paso como montarlo en una maquina que tiene la base de datos primaria y otra maquina que tiene o que va a albergar el data guard.

      Suscribite al blog y ahi se registra tu correo y te lo envio.

      Saludos.

  6. Gino says:

    ah! ademas quisiera saber si existen requisitos de sistema, programas, procesador o cualkier requisito de compatibilidad para hacer el dataguard. GRACIAS

  7. Javi10 says:

    Hola , estoy realizando un proyecto de Oracle 11g en el cual , entre mucha cosa ,como el uso de los paquetes DBMS_PIPE , ALERT , AQ , AQADM , SCHEDULER , UTL_FILE …. etc necesito implementar una configuración DATA GUARD como la del post , pero tengo muchas dudas , porque no se si la bd stanby debe estar creada desde el principio con el asistente o se crear mientras se esta configurando , porfavor si me lo pudieras explicar más detalladamente me harías un gran favor , tenga en cuenta que soy más de programación y no he prácticado mucho con RMAN

    Muchas Gracias y un Saludo

  8. Ivan Paredes Villalba says:

    Estimado Andres buenas tardes, estoy en un proyecto en el cual tengo que realizar un stanby contra un RAC hecho en 11gr2 que tiene dos dg (data y fra) en hpux. El stanby en una base 11gr2 con oracle Restar tambien con 2 dg (data,fra). Me podrias ayudar indicandome paso a paso como lo tengo que hacer utilizando el duplicate del rman, el nombre de la base rac es racprod. El nombre de la standby todavia no la se, pero podria ser el mismo nombre o debe ser racstby. Ya me suscribi a tu blog y dejame decirte que esta excelente.

  9. Sergio says:

    Hola, cuanto tiempo aprox. demora en instalar y configurar Dataguard para DB Oracle 11g R2?,
    Algun sitio de referencia?
    Saludos, excelente sitio y espero tu respuesta.

    • Juan Andres says:

      Depende en el punto donde estes parado, la configuracion es rapida, bien organizado te deberia llevar dos dias de trabajo, dependiendo del tamaño de la base de datos, pero a eso le tenes que agregar tiempo de diseño, armado del sitio de contingencia y algunas otras cosa mas. Saludos !

  10. Sergio says:

    Hola, cuanto se demora ejecutar un Duplicate sobre una DB de 100GB? y cuanto demora aprox en replicar la estructura de la DB en la de destino y montar los datos?, como se llama o con que comando se ejecuta esa actualización en la DB destino?.

    Saludos!

    • Juan Andres says:

      Depende del Procesador y memoria que tengas, tambien del OS. Tambien depende de cuanto ancho de banda tengas para pasar los datos. Con comando para la actualizacion a que te referis ? Saludos

  11. Daniel says:

    Este procedimiento para qué versión es? Me sirve para 11203?

%d bloggers like this: