miércoles, 28 de agosto de 2013

Oraclenerd y la primera playera de Oraclenerd para México y Latinoamerica

Esta entrada no tiene nada técnico y va a ser corta pero es para una buena causa.

En nuestra comunidad de blogeros y conferencistas , existe una persona que su nombre no solo es sinónimo de lo que representa esta agrupación de personas que estamos entusiasmadas a compartir nuestro conocimiento, sino que también tiene una marca que nos identifica a todos los que nos apasiona el mundo de Oracle, su nombre es Chet Justice a.k.a. Oraclenerd.

El tiene una hija que tiene autismo, a la que el mismo apoda Katezilla, y una de las maneras en la que la comunidad apoya a el y a su hija, es a través de las playeras de Oraclenerd , estas playeras/sudaderas tienen varias formas y tamaños , pero lo mas original es que también los que estamos cerca de esta comunidad , hemos tenido la oportunidad de aportar con ideas de como puede ser una playera que representa a nuestra region y/o persona.

Con mucho orgullo y responsabilidad aqui les presento la primera playera de Oraclenerd para México, apodada la playera de René Antunez , y el diseño que tiene es el que se muestra en la imagen de abajo, si te gusta, no dudes en darle click a la imagen y comprar tu playera, aparte de que vas a tener una playera super fregona, estas aportando una muy buena causa.

The Rene Antunez Shirt

Aqui tambien un video en el que el mismo te explica el origen de las playeras, esta en ingles y empieza a hablar a partir del minuto 5:56


viernes, 26 de julio de 2013

Platica en el Oracle Open World 2013 : Como sobrevivir un desastre con RMAN UGF9769

Este año si todo sale como se espera, se va a cumplir unas de mis metas que me propuse para antes de que cumpliera 40, y orgullosamente añado esta imagen.

Si van a ir al Oracle Open World 2013,voy a estar con la siguiente platica y perdón por si lo añado en ingles, pero es en el idioma en el que voy a dar la platica.

How to Survive a Disaster with Oracle RMAN - UGF9769

Abstract:

Oracle Recovery Manager (Oracle RMAN) has been a feature of Oracle Database since Oracle8 Database, and since then it has grown into a robust tool for backing up and recovering your database. DBAs—who must continuously deal with performance issues, user requests, and even non-database-related situations such as meetings—normally set up backups but, more often than not, forget to test out what would happen if a disaster happened and what they would do. This beginner/intermediate-level session covers Oracle RMAN backup configuration tips and real-life Oracle RMAN disaster recovery scenarios, so that if you ever face such adversity, you’ll come out on top.

Oracle Recovery Manager (Oracle RMAN ) ha sido una característica de la base de datos Oracle desde su versión Oracle8 , y desde entonces se ha convertido en una potente herramienta para realizar copias de seguridad y recuperación de la base de datos. Los DBAs -que deben lidiar continuamente con problemas de rendimiento, las solicitudes de los usuarios, e incluso con situaciones que no están relacionadas con Base de Datos, tales como juntas, - normalmente configuran respaldos una sola vez, pero, más a menudo que no, se olvidan de probar qué pasaría si un desastre sucede y lo que harían para resolverlo. Esta sesión para principiantes / nivel intermedio cubre respaldos de Oracle RMAN, consejos de configuración y los escenarios de recuperación de desastres de Oracle RMAN en la vida real, por lo que si alguna vez te enfrentas a esta adversidad, te ayude a salir adelante.

Nos vemos ahí!!!



domingo, 7 de julio de 2013

Instalando Oracle 12cR1

En la primera parte vimos como poder instalar la maquina virtual y la instalación del sistema operativo Linux. Así que en esta parte vamos a ver la instalación de los binarios de Oracle y la creación de una Base de Datos vía el DBCA. De igual manera, vamos a ver que a diferencia de previos versiones de Oracle, aquí podemos crear  nuestra Base de datos de Contenedor de Tenencia múltiple (CDB) y  nuestra primera Base de Datos Conectables (PDB).

Instalación de Binarios de Oracle
Como se menciona en la primera parte de esta entrada, tenemos que verificar los prerequisitos de instalación, si no lo has hecho te recomiendo que lo verifiques en esta entrada
  • Como mencionamos en la parte de prerequisitos, configuramos la variable de ambiente, en donde tenemos la ruta donde se va a instalar los binarios (ORACLE_HOME).
    Una vez que tenemos inicializadas nuestras variables de ambiente, desde donde tenemos el Software de Oracle , corremos runInstaller para iniciar la instalación de los binarios.
  • Una vez que empieza el instalador, en mi caso deseleccione la configuracion con MOS (My Oracle Support), de la misma manera deje en blanco el correo electrónico.


  • En la siguiente parte, también le menciono que se brinque las actualizaciones de Software

  • En la siguiente sección vamos a decirle al instalador que queremos crear y configurar una Base de Datos.
  • En mi caso seleccionamos el tipo de Servidor, pero si vas a hacer pruebas o tienes recursos muy limitados, como en tu computadora , puedes seleccionar Desktop.
  • Para continuar seleccione un tipo de instalación de una sola instancia.

  • El tipo de instalación que seleccionamos es avanzada para poder configurar mas cosas.
  • Ahora seleccionamos el idioma en que vamos a correr, en mi caso seleccione ingles, este se los dejo a su conveniencia.
  • El tipo de instalación que lleve a cabo fue el de Enterprise Edition, esta es una selección que es de acuerdo a sus necesidades y licenciamiento que tienen.

  • En esta parte el instalador verifica lo que es el ORACLE_BASE y el ORACLE_HOME.


  • En esta parte el instalador vamos a seleccionar el Directorio donde se va a almacenar el Inventario de Oracle, así como el grupo primario para escribir en este directorio.


  • En mi caso seleccione el tipo de BD como de uso general

  • Este punto en la instalación, es lo que realmente hace la diferencia de versiones anteriores, aquí vamos a definir si la Base de datos de Contenedor de Tenencia múltiple (CDB) y el nombre de nuestra primera Base de Datos Conectables (PDB)

  • Aquí vamos a definir los parámetros de nuestra base de datos CDB ( Memoria, Tipo de set de caracteres)
  • Para continuar, vamos a seleccionar el destino donde vamos a guardar nuestros archivos de la base de datos, que en mi caso seleccione un directorio fijo, pero si tienes configurado ASM , aquí seria la parte donde lo harías.

  • Si tienes definido e instalado OEM 12c, aquí seria donde definirias la conexion para ella.
  • Ahora definiremos si queremos utilizar FRA, que es una característica de Oracle en donde se guardan los respaldos y todos los archivos que necesitas para recuperar tu base de Datos, y de igual manera, puedes usar ASM si lo tienes configurado, o un directorio fijo, que es lo que yo hice.

  • Vamos aquí a definir el password para los usuarios sys,system,dbsnmp y pdbadmin.
  • Ahora vamos a definir los grupos de sistema operativo, aquí es de igual manera, que fueron agregados nuevos grupos, como el de OSBACKUPDBA y OSDGDBA.

  • Ya casi acabamos, aquí lo que debemos de verificar es que se cumplan todos los requisitos, si no se cumplen, regresa y asegurate que todo este como debe de ser.

  • Una vez que arreglamos todos los prerequisitos necesarios, le damos siguiente y nos lleva a una pantalla de resumen de instalación, en donde podemos verificar si queremos hacer algún cambio a nuestra instalación, si estamos de acuerdo le damos siguiente e inicia la instalación.

  • Como penúltimo paso, tenemos que correr los scripts que te menciona el instalador, estos se corren con el usuario root.

  • Por ultimo paso, vemos que se crearon nuestra PDB y nuestra CDB, así como la dirección que tiene el Oracle Database Express 

Conclusión
Como podemos ver es sencilla la instalación de los binarios, en lo que tenemos que tener cuidado es en haber cumplido los prerequisitos de instalación, si es así el caso, vamos a tener una instalación sin complicaciones. Diviertete manejando la nueva versión de Oracle :)

sábado, 29 de junio de 2013

Requisitos Para Instalar Oracle 12cR1 en Linux x86 para RHEL6

Estos son los requerimientos para poder instalar Oracle 12cR1 en Oracle Linux x86 para RHEL 6. Siempre recomiendo tomar los últimos valores disponibles en la documentacion oficial de Oracle disponible en este enlace.

Si no especifico que vamos a usar otro usuario, todos los comando mencionados son con el usuario root, así que debemos tener acceso a ese usuario. 

Algo de lo que tiene Linux es que tiene una manera de dejar esto todo listo con yum que es un gestor de paquetes interactivo, basado en rpms , y  lo puedes hacer de la siguiente manera:

Configuración automática de Oracle Linux con Oracle RDBMS Pre-Install RPM

  • Como el usuario root

    cd /etc/yum.repos.d/
    wget http://public-yum.oracle.com/public-yum-ol6.repo

  • Asegurate que los siguientes estén habilitados en el archivo public-yum-ol6.repo

    [oracle@oracleenespanol yum.repos.d]$ cat public-yum-ol6.repo
    [ol6_latest]
    name=Oracle Linux $releasever Latest ($basearch)
    baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/$basearch/
    gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6
    gpgcheck=1
    enabled=1

    [ol6_UEK_base]
    name=Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch)
    baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEK/base/$basearch/
    gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6
    gpgcheck=1
    enabled=1

  • Corre el siguiente comando para verificar los canales registrados

    yum repolist

  • Y todavía con el usuario root, corre el siguiente comando que va a dejar listo tu instalación de Linux para que puedas instalar Oracle 12c

    yum install oracle-rdbms-server-12cR1-preinstall -y

Configuración manual de Oracle Linux con Oracle RDBMS 

Requisitos de Memoria
  • Por lo menos 1 GB de RAM
    Para verificar el tamaño de tu RAM
    grep MemTotal /proc/meminfo
  • Espacio swap
    Para verificar el tamaño de tu espacio Swap
    grep SwapTotal /proc/meminfo

RAM DisponibleEspacion Swap Requerido
Entre 1 GB y 2 GB1.5 veces el tamaño de la RAM
Entre 2 GB y 16 GBIgual al Tamaño de la RAM
Mas que 16 GB16 GB

Requisitos de Hardware
  • 1 GB de espacio en el directorio /tmp
    Para determinar el espacio libre
    df -h /tmp
Tipo de InstalacionRequerimientos de Archivos SW (GB)
Enterprise Edition6.4
Standard Edition6.1


Tipo de InstalacionRequerimientos Para Datafiles (GB)
Enterprise Edition3.8
Standard Edition3.2

Requisitos de Software
  • Determinar la distribución y versión de Linux instalado. Acuerdate que estamos instalando una version de RHEL 6 con un kernel 2.6.39-400.17.1.el6uek.x86_64

    cat /proc/version
  • Kernel Requerido 
    Para Oracle Linux 6:
    Oracle Linux 6 con Unbreakable Enterprise kernel: 2.6.39-200.24.1.el6uek.x86_64 o posterior
    Oracle Linux 6 con Red Hat Compatible kernel: 2.6.32-71.el6.x86_64 o posterior

    Red Hat Enterprise Linux 6:
    Red Hat Enterprise Linux 6: 2.6.32-71.el6.x86_64 o posterior
    Red Hat Enterprise Linux 6 with the Unbreakable Enterprise Kernel: 2.6.32-100.28.5.el6.x86_64
    o posterior
  • Paquetes Requeridos
    Todos son la versión mencionada o posterior.
    binutils-2.20.51.0.2-5.11.el6 (x86_64)
    compat-libcap1-1.10-1 (x86_64)
    compat-libstdc++-33-3.2.3-69.el6 (x86_64)
    compat-libstdc++-33-3.2.3-69.el6 (i686)
    gcc-4.4.4-13.el6 (x86_64)
    gcc-c++-4.4.4-13.el6 (x86_64)
    glibc-2.12-1.7.el6 (i686)
    glibc-2.12-1.7.el6 (x86_64)
    glibc-devel-2.12-1.7.el6 (x86_64)
    glibc-devel-2.12-1.7.el6 (i686)
    ksh
    libgcc-4.4.4-13.el6 (i686)
    libgcc-4.4.4-13.el6 (x86_64)
    libstdc++-4.4.4-13.el6 (x86_64)
    libstdc++-4.4.4-13.el6 (i686)
    libstdc++-devel-4.4.4-13.el6 (x86_64)
    libstdc++-devel-4.4.4-13.el6 (i686)
    libaio-0.3.107-10.el6 (x86_64)
    libaio-0.3.107-10.el6 (i686)
    libaio-devel-0.3.107-10.el6 (x86_64)
    libaio-devel-0.3.107-10.el6 (i686)
    libXext-1.1 (x86_64)
    libXext-1.1 (i686)
    libXtst-1.0.99.2 (x86_64)
    libXtst-1.0.99.2 (i686)
    libX11-1.3 (x86_64)
    libX11-1.3 (i686)
    libXau-1.0.5 (x86_64)
    libXau-1.0.5 (i686)
    libxcb-1.5 (x86_64)
    libxcb-1.5 (i686)
    libXi-1.3 (x86_64)
    libXi-1.3 (i686)
    make-3.81-19.el6
    sysstat-9.0.4-11.el6 (x86_64)
Para verificar si tienes el paquete instalado, utiliza el siguiente comando
rpm -q nombre_paquete

Ejemplo
rpm -q binutils

De igual manera te puedes ahorrar mucho trabajo, si ya configuraste tu repositorio de yum, corriendo los siguientes comandos
yum install binutils -y
yum install compat-libcap1 -y
yum install compat-libstdc++-33 -y
yum install compat-libstdc++-33.i686 -y
yum install gcc -y
yum install gcc-c++ -y
yum install glibc -y
yum install glibc.i686 -y
yum install glibc-devel -y
yum install glibc-devel.i686 -y
yum install ksh -y
yum install libgcc -y
yum install libgcc.i686 -y
yum install libstdc++ -y
yum install libstdc++.i686 -y
yum install libstdc++-devel -y
yum install libstdc++-devel.i686 -y
yum install libaio -y
yum install libaio.i686 -y
yum install libaio-devel -y
yum install libaio-devel.i686 -y
yum install libXext -y
yum install libXext.i686 -y
yum install libXtst -y
yum install libXtst.i686 -y
yum install libX11 -y
yum install libX11.i686 -y
yum install libXau -y
yum install libXau.i686 -y
yum install libxcb -y
yum install libxcb.i686 -y
yum install libXi -y
yum install libXi.i686 -y
yum install make -y
yum install sysstat -y
yum install unixODBC -y
yum install unixODBC-devel -y
Valores de Kernel Requeridos


ParametroValor MinimoArchivo
semmsl
semmns
semopm
semmni
250
32000
100
128
/proc/sys/kernel/sem
shmall2097152/proc/sys/kernel/shmall
shmmaxYa sea 4 GB - 1 byte, or la mitad del tamaño de la memoria fisica (en bytes), El que sea Menor.
Default: 536870912

/proc/sys/kernel/shmmax
shmmni4096/proc/sys/kernel/shmmni
file-max6815744/proc/sys/fs/file-max
ip_local_port_rangeMinimo: 9000
Maximo: 65500
/proc/sys/net/ipv4/ip_local_port_range
rmem_default262144/proc/sys/net/core/rmem_default
rmem_max4194304/proc/sys/net/core/rmem_max
wmem_default262144/proc/sys/net/core/wmem_default
wmem_max1048576/proc/sys/net/core/wmem_max
aio-max-nrMaximo: 1048576/proc/sys/fs/aio-max-nr

Para ver los valores de los parámetros del Kernel, utiliza los comandos mencionados en la siguiente tabla

ParametroComando
semmslsemmnssemopm, ysemmni# /sbin/sysctl -a | grep sem
shmallshmmax, y shmmni# /sbin/sysctl -a | grep shm
file-max# /sbin/sysctl -a | grep file-max
ip_local_port_range# /sbin/sysctl -a | grep ip_local_port_range
rmem_default# /sbin/sysctl -a | grep rmem_default
rmem_max# /sbin/sysctl -a | grep rmem_max
wmem_default# /sbin/sysctl -a | grep wmem_default
wmem_max# /sbin/sysctl -a | grep wmem_max
  • Si cualquiera de los valores mencionados es menor a los valores recomendados, crea o edita el archivo /etc/sysctl.conf y añade o edita las lineas mencionadas abajo: 
    fs.aio-max-nr = 1048576
    fs.file-max = 6815744
    kernel.shmall = 2097152
    kernel.shmmax = 536870912
    kernel.shmmni = 4096
    kernel.sem = 250 32000 100 128
    net.ipv4.ip_local_port_range = 9000 65500
    net.core.rmem_default = 262144
    net.core.rmem_max = 4194304
    net.core.wmem_default = 262144
    net.core.wmem_max = 1048586
  • Utiliza el siguiente comando para cambiar los valores actuales que tiene el kernel
    /sbin/sysctl -p

  • El siguiente comando te ayuda para confirmar que los parámetros están correctos
    /sbin/sysctl -a

Crear el usuario Oracle y sus grupos
Tomando en cuenta de que esta es una instalación nueva vamos a crear los siguientes grupos

  • /usr/sbin/groupadd dba
  • /usr/sbin/groupadd oinstall
  • /usr/sbin/groupadd oper
  • /usr/sbin/groupadd backupdba(*)
  • /usr/sbin/groupadd dgdba(*)
  • /usr/sbin/groupadd kmdba(*)
  • /usr/sbin/groupadd asmdba(*)
  • /usr/sbin/groupadd asmoper(*)
  • /usr/sbin/groupadd asmadmin(*)
(*)Estos grupos no son inmediatamente requeridos, pero te aconsejo que los crees para no batallar en un futuro, ya que son requeridos para diferentes funciones como ASM o Usuarios de respaldo

A continuación vamos a vamos a crear el usuario oracle
  • /usr/sbin/useradd -g oinstall -G dba oracle 
  • Para cambiar el password del usuario, vamos a usar el siguiente comando
    passwd oracle
Recursos Limites Para el Usuario que va a instalar los binarios
Estos son los valores recomendados por Oracle

Recurso Limite del ShelRecursoLimite SoftLimite Hard
Descriptores de Open file
nofile

por lo menos 1024

por lo menos 655
Numero de procesos disponibles a un solo usuario
nproc

por lo menos 2047

por lo menos 16384
Tamaño del segmento stack del proceso
stack

por lo menos 10240 KB

por lo menos 10240 KB, y a lo mas 32768 KB


Para verificar los recursos limites del usuario Entra como el usuario que va a hacer la instalación, en nuestro caso es el usuario Oracle
  • Verifica los limites soft y hard para los descriptores de archivo. Por ejemplo:

    ulimit -Sn
     4096
    ulimit -Hn
    65536
  • Verifica los limites soft y hard para los números de procesos disponibles al usuario. Por ejemplo:

    ulimit -Su
    2047
    ulimit -Hu
    16384
  • Verifica los limites soft y hard para los segmentos stack.Por ejemplo:
    ulimit -Ss
    10240
    ulimit -Hs
    32768
  • Si es necesario, actualiza los recursos limites en el archivo de configuración /etc/security/limits.conf . Por ejemplo, añade las siguientes lineas al archivo /etc/security/limits.conf file:
    oracle              soft    nproc   2047
    oracle              hard    nproc   16384
    oracle              soft    nofile  1024
    oracle              hard    nofile  65536
    oracle              soft    stack   10240
Configurando la variable de ambiente y directorios
Aquí yo también me alejo un poco de lo que recomienda Oracle. Lo que hago es utilizar en el .profile del usuario oracle uso lo siguiente:

set -o vi
stty erase "^?"
export PS1="
`echo ${LOGNAME}`@`hostname` \${PWD}
`who am i | awk '{print $1}'` $ "
export EDITOR=vi
PATH=$HOME/bin:
$PATH
export PATH
De ahí en el directorio $HOME/bin creo una variable de ambiente que refleje ahora si las necesidades de mi instancia, ya que puedo definir una variable distinta si tengo tengo otras versiones de Oracle en mi servidor. Asegurate de que todos los directorios definidos existan en tu servidor.
ORACLE_HOME=/u01/oracle/app/oracle/product/12.1.0/dbhome_1
DATA_PUMP_DIR=/mount/copy01/export01/TEST/
ORACLE_SID=TEST
ORACLE_BASE=/u01/oracle/app/oracle
export ORACLE_HOME ORACLE_SID ORACLE_BASE DATA_PUMP_DIR
ORACLE_CONFIG_HOME=/mount/oracle/product/cfg/TEST
export ORACLE_CONFIG_HOME
ADR_HOME=/mount/dump01/oracle/TEST/diag/rdbms/test/TEST
export ADR_HOME
SID_HOME=/mount/dba01/oracle/TEST
export SID_HOME
DBA_HOME=/mount/dba01/oracle
export DBA_HOME
TNS_ADMIN=$ORACLE_HOME/network/admin
export TNS_ADMIN
ORACLE_TERM=vt100
export ORACLE_TERM
Crear los Directorios Necesarios

En mi caso, yo rompo un poco de la arquitectura OFA,aunque conservo alguna como puedes ver arriba, pero sigue teniendo mucho sentido, creo un mount point y dentro de ese creo todos los directorios necesarios para mi base de datos. En mi caso, uso el directorio de oracle para instalar los binarios.

oracle@localhost /mount
oracle $ ls
arch01     copy01     dba01      dump01     oracle   

Conclusión
Aquí no hay mucho que concluir, mas que les vuelvo a decir que esto es solo una guia, para cualquier cambio de los requisitos consulten la documentación oficial En la segunda parte vamos a ver como es la instalación de los binarios de 12c y una base de datos.

sábado, 18 de mayo de 2013

Como crear un Standby Fisico con RMAN Active Duplicate en 11.2.0.3

Este tema ha sido escrito por otros administradores de bases de datos, pero quería que estuviera disponible en español, y sobre todo porque en los sitios que he buscado de cómo se hizo esto, o bien no son muy claros los pasos que se hicieron y asume que ya sabes lo que estás haciendo, o en realidad ejecutan los pasos demasiado rápido sin dar alguna explicación.

Antes de continuar, sólo te quiero decir de que se trata de una entrada larga, y no digas que no te lo advertí :)

Así que para continuar y antes de entrar en cualquiera de los pasos en la creación de tu base de datos Standby Fisica, hay algunos términos que necesitas saber de antemano, que te ayudará a entender mejor el entorno y lo que DataGuard está haciendo, en lugar de copiar una serie de pasos. Estas son sólo las definiciones en la documentación de Oracle, pero te evitarás de ir a buscar por todas partes para entenderlas.

LOG_ARCHIVE_DEST_n .- Controla diferente aspectos de como los servicios de transporte de los Redo, transfiere los datos de redo de la base de datos primaria
a su destino de standby. Este parámetro tiene varios atributos que son necesarios para configurar tu ambiente de Dataguard, aquí nada mas voy a mencionar
los que son críticos para esto:

  • ASYNC (Default) .- Los datos generados de redo por transacción no tienen que haber sido recibidos en cada uno de los destinos habilitados antes de cometerse ésta.
    o
  • SYNC .-Los datos generados de redo por transacción tienen que haber sido recibidos en cada uno de los destinos habilitados antes de cometerse ésta.
  • AFFIRM y NOAFFIRM .- Controla si un destino de transporte de redo acusa de recibo los datos de redo antes o despues de escribir estos al standby redo log.
  • DB_UNIQUE_NAME .-  Especifica un nombre unico para la base de datos que va a recibir los datos de redo. Tienes que especificar este nombre, no hay un valor por default.
  • VALID_FOR .- Identifica cuando el servicio de transporte de redo puede transmitir datos de redo a los destinos, esto se basa en los siguiente factores:
    • redo_log_type .-Si los archivos de Online Redo Log, Standby Redo log o ambos este siendo archivados en la base de datos destinada.
    • database_role .-Si el rol de la base de datos es la Primaria o la base de datos en Stanby.

FAL_SERVER .- Especifica el servidor FAL (Fetch Archive Log) para un base de datos en Standby. Este valor es un nombre de servicio de Oracle Net.
FAL_CLIENT .- Especifica el nombre del cliente FAL (Fetch Archive Log) que es usado por el servicio FAL, que este es configurado a través del parametro FAL_SERVER para referir al cliente.Este valor es un nombre de servicio de Oracle Net.

LOG_ARCHIVE_CONFIG .- Este parámetro habilita o deshabilita el envió de redo los a destinos remotos y el recipiente de estos. Este parámetro tiene varios atributos, aquí te menciono el mas importante para este ejercicio:

  • DG_CONFIG .- Especifica hasta 30 nombres de bases de datos únicas (Definidas con el parámetro DB_UNIQUE_NAME) para todas las bases de datos en tu configuración de Data Guard.

Ufff , esto estuvo largo, y si te interesa saber mas, lo puedes encontrar en la documentación oficial de Oracle 11gR2 . Pero ahora que quitamos las definiciones de encima,  vamos a empezar con la configuracion de nuestra Base de Datos Standby Fisica.

Para este ejercicio tengo lo siguiente :

Primary : testgg1   Server : dlabvm13
Standby : testgg2   Server : dlabvm14
DB_NAME: testgg1

Lo primero que tienes que hacer, es encontrar la ubicación en donde tienes los Online Redo Logs, Datafiles que residen en la base de datos primaria y donde van a residir  estos en la base de datos Standby para que puedas establecer los parámetros LOG_FILE_NAME_CONVERT y DB_FILE_NAME_CONVERT correctamente. Asegúrate de que estos directorios y que tienes el espacio necesario para contener la base de datos primaria, si no tienes este espacio en el servidor de la Standby, entonces ¿cuál es el caso de continuar? :)

A continuación, asegúrate de que estás en modo archivelog y que force logging está activado en tu base de datos primaria.

Si tu base de datos no está en modo archivelog, haz lo siguiente:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.

Total System Global Area 534462464 bytes
Fixed Size 2230072 bytes
Variable Size 163580104 bytes
Database Buffers 364904448 bytes
Redo Buffers 3747840 bytes
Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> alter database force logging;

Database altered.

SQL> select log_mode,force_logging from v$database;

LOG_MODE FOR
------------ ---
ARCHIVELOG YES


Ahora que estamos en modo archivelog y establecida force logging para la base de datos primaria, asegúrate de que las entradas del  Listener/Tns están configurados correctamente y que puedes hacer un  tnsping ambos desde el servidor de la Primaria / Standby.

En esto si no voy a entrar a detalle pero puedes checar la entrada de Kamran en el blog de Pythian (Paso 2) para ver como se hace esto. Si tienes una pregunta de como se hace esto, no dudes en hacermela.

Pero el resultado en ambos servidores debe de ser algo similar a esto:


oracle@dlabvm13.dlab.pythian.com [testgg1] /home/oracle/bin
oracle $ tnsping testgg1

TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 14-MAY-2013 09:44:34
Copyright (c) 1997, 2011, Oracle. All rights reserved.
Used parameter files:
/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = dlabvm13.dlab.pythian.com)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = testgg1)))

OK (0 msec)

oracle@dlabvm13.dlab.pythian.com [testgg1] /home/oracle/bin
oracle $ tnsping testgg2
TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 14-MAY-2013 09:44:40
Copyright (c) 1997, 2011, Oracle. All rights reserved.

Used parameter files:
/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = dlabvm14.dlab.pythian.com)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = testgg2)))

OK (10 msec)

A continuación, debes crear y replicar el archivo de contraseñas de la base de datos primaria que se encuentra en $ORACLE_HOME/dbs y cambiarle el nombre para que refleje el nombre de la Standby. El nombre del archivo de la contraseña de la Standby debe coincidir con el ORACLE_SID utilizado, no el DB_NAME.


oracle@dlabvm13.dlab.pythian.com [testgg1] /u01/app/oracle/product/11.2.0/dbhome_1/dbs
oracle $ orapwd file=orapwtestgg1 password=test entries=5

oracle@dlabvm13.dlab.pythian.com [testgg1] /u01/app/oracle/product/11.2.0/dbhome_1/dbs
oracle $ scp orapwtestgg1 dlabvm14:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwtestgg2

orapwtestgg1 100% 2048 2.0KB/s 00:00

Ahora que has creado el archivo de contraseñas, vamos a configurar el archivo de parámetros init para la base de datos Primaria, como se puede ver al final de este ejemplo, son los parámetros que explicamos y definimos al principio de esta entrada.

SQL> !cat dg.ora
*.audit_file_dest='/u01/app/oracle/oradata/dump/testgg1/adump'
*.audit_trail='db'
*.compatible='11.2.0'
*.control_files='/u01/app/oracle/oradata/testgg1/control/control01.ctl','/u01/app/oracle/oradata/testgg1/control/control02.ctl'
*.db_block_size=8192
*.db_cache_size=128M
*.db_domain=''
*.db_name='testgg1'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=2G
*.db_unique_name='testgg1'
*.diagnostic_dest='/u01/app/oracle/oradata/dump/testgg1'
*.log_archive_dest_1='location=use_db_recovery_file_dest valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testgg1'
*.log_archive_dest_2='SERVICE=testgg2 ASYNC valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=testgg2'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.open_cursors=300
*.pga_aggregate_target=128M
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=512M
testgg11.UNDO_TABLESPACE='UNDOTBS1'
FAL_SERVER=testgg2;
FAL_CLIENT=testgg1;
DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/','/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/'
LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/testgg2/TESTGG2/onlinelog/','/u01/app/oracle/oradata/testgg1/TESTGG1/onlinelog/'
LOG_ARCHIVE_CONFIG='DG_CONFIG=(testgg1,testgg2)'

Una de las cosas mas padres o cheveres acerca de este método, es que casi todo el trabajo que haré será en el servidor de base de datos Primaria,  lo único que tengo que hacer en el servidor de la base de datos Standby es crear las ubicaciones en donde van a residir mis archivos de diagnóstico / redo / datafiles / control files y verificar la conectividad entre el servidor Primario y el Standby y solamente arrancar la instancia de nuestra base de datos Standby, que es nuestro siguiente paso.

Lo que voy a hacer ahora es establecer el ORACLE_SID, ORACLE_HOME y ORACLE_BASE para la instancia Standby y abrirla con las mínimas  opciones posibles:


oracle@dlabvm14.dlab.pythian.com [testgg2] /home/oracle/bin
oracle $ export ORACLE_HOME="/u01/app/oracle/product/11.2.0/dbhome_1"

oracle@dlabvm14.dlab.pythian.com [testgg2] /home/oracle/bin
oracle $ export ORACLE_BASE=/u01/app/oracle

oracle@dlabvm14.dlab.pythian.com [testgg2] /home/oracle/bin
oracle $ export ORACLE_SID=testgg2

oracle@dlabvm14.dlab.pythian.com [testgg2] /home/oracle/bin
oracle $ cat dg.ora

DB_NAME=testgg1
DB_UNIQUE_NAME=testgg2
DB_BLOCK_SIZE=8192

oracle@dlabvm14.dlab.pythian.com [testgg2] /home/oracle/bin
oracle $ sqlplus
SQL*Plus: Release 11.2.0.3.0 Production on Tue May 14 09:53:30 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Enter user-name: /as sysdba

Connected to an idle instance.

SQL> startup nomount pfile='/home/oracle/bin/dg.ora';
ORACLE instance started.
Total System Global Area  238034944 bytes
Fixed Size              2227136 bytes
Variable Size            180356160 bytes
Database Buffers        50331648 bytes
Redo Buffers              5120000 bytes

SQL> exit

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

Ahora vamos a volver al servidor de la base de datos Primaria, donde lo siguiente que voy a hacer es agregar los Standby Redo Logs, en mi caso he creado dos con el mismo tamaño que los Online Redo Logs que tengo en la Primaria.


SQL> select instance_name,host_name from v$instance;

INSTANCE_NAME HOST_NAME
---------------- ----------------------------------------------------------------
testgg1 dlabvm13.dlab.pythian.com

SQL> select name from v$database;

NAME
---------
TESTGG1

SQL> select GROUP#,THREAD#,MEMBERS,BYTES FROM V$LOG;

GROUP# THREAD# MEMBERS BYTES
---------- ---------- ---------- ----------
1 1 1 104857600
2 1 1 104857600

SQL> ALTER DATABASE ADD STANDBY LOGFILE SIZE 104857600;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE SIZE 104857600;

Database altered.

SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;

GROUP# BYTES
---------- ----------
 3 104857600
 4 104857600

Una vez que he creado los Standby Redo Logs en mi base de datos Primaria, creo los siguientes comandos de RMAN y también los cambios que se van a hacer en spfile de la Standby en este bloque de RMAN.

oracle@dlabvm13.dlab.pythian.com [testgg1] /home/oracle/bin
oracle $ cat duplicate.rmn

run {
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate auxiliary channel stby type disk;
duplicate target database for standby from active database
spfile
 parameter_value_convert 'testgg1','testgg2'
 set db_unique_name='testgg2'
 set db_file_name_convert='/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/','/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/'
 set log_file_name_convert='/u01/app/oracle/oradata/testgg1/TESTGG1/onlinelog/','/u01/app/oracle/oradata/testgg2/TESTGG2/onlinelog/'
 set control_files='/u01/app/oracle/oradata/testgg2/control/control01.ctl','/u01/app/oracle/oradata/testgg2/control/control02.ctl'
 set log_archive_max_processes='10'
 set fal_client='testgg2'
 set fal_server='testgg1'
 set standby_file_management='AUTO'
 set log_archive_config='dg_config=(testgg1,testgg2)'
 set log_archive_dest_2='service=testgg1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=testgg1'
;
}

Ahora que  he creado el archivo de comandos de RMAN, sólo necesito ejecutar este comando en la base de datos target, que es la base de datos Primaria, que se conectara a la Standby que en este caso es la auxiliary.


oracle@dlabvm13.dlab.pythian.com [testgg1] /home/oracle/bin
oracle $ rman target sys/test@testgg1 auxiliary sys/test@testgg2

Recovery Manager: Release 11.2.0.3.0 - Production on Thu May 16 08:42:46 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

connected to target database: TESTGG1 (DBID=839852638)
connected to auxiliary database: TESTGG1 (not mounted)

RMAN> @duplicate.rmn

RMAN>
RMAN> run {
2> allocate channel prmy1 type disk;
3> allocate channel prmy2 type disk;
4> allocate channel prmy3 type disk;
5> allocate channel prmy4 type disk;
6> allocate auxiliary channel stby type disk;
7> duplicate target database for standby from active database
8> spfile
9> parameter_value_convert 'testgg1','testgg2'
10> set db_unique_name='testgg2'
11> set db_file_name_convert='/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/','/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/'
12> set log_file_name_convert='/u01/app/oracle/oradata/testgg1/TESTGG1/onlinelog/','/u01/app/oracle/oradata/testgg2/TESTGG2/onlinelog/'
13> set control_files='/u01/app/oracle/oradata/testgg2/control/control01.ctl','/u01/app/oracle/oradata/testgg2/control/control02.ctl'
14> set log_archive_max_processes='10'
15> set fal_client='testgg2'
16> set fal_server='testgg1'
17> set standby_file_management='AUTO'
18> set log_archive_config='dg_config=(testgg1,testgg2)'
19> set log_archive_dest_2='service=testgg1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=testgg1'
20> ;
21> }
using target database control file instead of recovery catalog
allocated channel: prmy1
channel prmy1: SID=32 device type=DISK

allocated channel: prmy2
channel prmy2: SID=33 device type=DISK

allocated channel: prmy3
channel prmy3: SID=34 device type=DISK

allocated channel: prmy4
channel prmy4: SID=35 device type=DISK

allocated channel: stby
channel stby: SID=19 device type=DISK

Starting Duplicate Db at 16-MAY-13

contents of Memory Script:
{
 backup as copy reuse
 targetfile '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwtestgg1' auxiliary format
 '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwtestgg2' targetfile
 '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfiletestgg1.ora' auxiliary format
 '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfiletestgg2.ora' ;
 sql clone "alter system set spfile= ''/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfiletestgg2.ora''";
}
executing Memory Script

Starting backup at 16-MAY-13
Finished backup at 16-MAY-13

sql statement: alter system set spfile= ''/u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfiletestgg2.ora''

contents of Memory Script:
{
 sql clone "alter system set audit_file_dest =
 ''/u01/app/oracle/oradata/dump/testgg2/adump'' comment=
 '''' scope=spfile";
 sql clone "alter system set diagnostic_dest =
 ''/u01/app/oracle/oradata/dump/testgg2'' comment=
 '''' scope=spfile";
 sql clone "alter system set log_archive_dest_1 =
 ''location=use_db_recovery_file_dest valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testgg2'' comment=
 '''' scope=spfile";
 sql clone "alter system set db_unique_name =
 ''testgg2'' comment=
 '''' scope=spfile";
 sql clone "alter system set db_file_name_convert =
 ''/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/'', ''/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/'' comment=
 '''' scope=spfile";
 sql clone "alter system set log_file_name_convert =
 ''/u01/app/oracle/oradata/testgg1/TESTGG1/onlinelog/'', ''/u01/app/oracle/oradata/testgg2/TESTGG2/onlinelog/'' comment=
 '''' scope=spfile";
 sql clone "alter system set control_files =
 ''/u01/app/oracle/oradata/testgg2/control/control01.ctl'', ''/u01/app/oracle/oradata/testgg2/control/control02.ctl'' comment=
 '''' scope=spfile";
 sql clone "alter system set log_archive_max_processes =
 10 comment=
 '''' scope=spfile";
 sql clone "alter system set fal_client =
 ''testgg2'' comment=
 '''' scope=spfile";
 sql clone "alter system set fal_server =
 ''testgg1'' comment=
 '''' scope=spfile";
 sql clone "alter system set standby_file_management =
 ''AUTO'' comment=
 '''' scope=spfile";
 sql clone "alter system set log_archive_config =
 ''dg_config=(testgg1,testgg2)'' comment=
 '''' scope=spfile";
 sql clone "alter system set log_archive_dest_2 =
 ''service=testgg1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=testgg1'' comment=
 '''' scope=spfile";
 shutdown clone immediate;
 startup clone nomount;
}
executing Memory Script

sql statement: alter system set audit_file_dest = ''/u01/app/oracle/oradata/dump/testgg2/adump'' comment= '''' scope=spfile

sql statement: alter system set diagnostic_dest = ''/u01/app/oracle/oradata/dump/testgg2'' comment= '''' scope=spfile

sql statement: alter system set log_archive_dest_1 = ''location=use_db_recovery_file_dest valid_for=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=testgg2'' comment= '''' scope=spfile

sql statement: alter system set db_unique_name = ''testgg2'' comment= '''' scope=spfile

sql statement: alter system set db_file_name_convert = ''/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/'', ''/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/'' comment= '''' scope=spfile

sql statement: alter system set log_file_name_convert = ''/u01/app/oracle/oradata/testgg1/TESTGG1/onlinelog/'', ''/u01/app/oracle/oradata/testgg2/TESTGG2/onlinelog/'' comment= '''' scope=spfile

sql statement: alter system set control_files = ''/u01/app/oracle/oradata/testgg2/control/control01.ctl'', ''/u01/app/oracle/oradata/testgg2/control/control02.ctl'' comment= '''' scope=spfile

sql statement: alter system set log_archive_max_processes = 10 comment= '''' scope=spfile

sql statement: alter system set fal_client = ''testgg2'' comment= '''' scope=spfile

sql statement: alter system set fal_server = ''testgg1'' comment= '''' scope=spfile

sql statement: alter system set standby_file_management = ''AUTO'' comment= '''' scope=spfile

sql statement: alter system set log_archive_config = ''dg_config=(testgg1,testgg2)'' comment= '''' scope=spfile

sql statement: alter system set log_archive_dest_2 = ''service=testgg1 ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=testgg1'' comment= '''' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 534462464 bytes

Fixed Size 2230072 bytes
Variable Size 163580104 bytes
Database Buffers 364904448 bytes
Redo Buffers 3747840 bytes
allocated channel: stby
channel stby: SID=18 device type=DISK

contents of Memory Script:
{
 backup as copy current controlfile for standby auxiliary format '/u01/app/oracle/oradata/testgg2/control/control01.ctl';
 restore clone controlfile to '/u01/app/oracle/oradata/testgg2/control/control02.ctl' from
 '/u01/app/oracle/oradata/testgg2/control/control01.ctl';
}
executing Memory Script

Starting backup at 16-MAY-13
channel prmy1: starting datafile copy
copying standby control file
output file name=/u01/app/oracle/product/11.2.0/dbhome_1/dbs/snapcf_testgg1.f tag=TAG20130516T084319 RECID=7 STAMP=815561001
channel prmy1: datafile copy complete, elapsed time: 00:00:07
Finished backup at 16-MAY-13

Starting restore at 16-MAY-13

channel stby: copied control file copy
Finished restore at 16-MAY-13

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

sql statement: alter database mount standby database

contents of Memory Script:
{
 set newname for tempfile 1 to
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_temp_8qbok7fk_.tmp";
 switch clone tempfile all;
 set newname for datafile 1 to
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_system_8ocl7bho_.dbf";
 set newname for datafile 2 to
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sysaux_8ocl7k6n_.dbf";
 set newname for datafile 3 to
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sys_undo_8ocl7q6c_.dbf";
 set newname for datafile 4 to
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_users_8qbolh3g_.dbf";
 backup as copy reuse
 datafile 1 auxiliary format
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_system_8ocl7bho_.dbf" datafile
 2 auxiliary format
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sysaux_8ocl7k6n_.dbf" datafile
 3 auxiliary format
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sys_undo_8ocl7q6c_.dbf" datafile
 4 auxiliary format
 "/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_users_8qbolh3g_.dbf" ;
 sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_temp_8qbok7fk_.tmp in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting backup at 16-MAY-13
channel prmy1: starting datafile copy
input datafile file number=00001 name=/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/o1_mf_system_8ocl7bho_.dbf
channel prmy2: starting datafile copy
input datafile file number=00002 name=/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/o1_mf_sysaux_8ocl7k6n_.dbf
channel prmy3: starting datafile copy
input datafile file number=00003 name=/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/o1_mf_sys_undo_8ocl7q6c_.dbf
channel prmy4: starting datafile copy
input datafile file number=00004 name=/u01/app/oracle/oradata/testgg1/TESTGG1/datafile/o1_mf_users_8qbolh3g_.dbf
output file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sys_undo_8ocl7q6c_.dbf tag=TAG20130516T084335
channel prmy3: datafile copy complete, elapsed time: 00:00:45
output file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_users_8qbolh3g_.dbf tag=TAG20130516T084335
channel prmy4: datafile copy complete, elapsed time: 00:00:55
output file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_system_8ocl7bho_.dbf tag=TAG20130516T084335
channel prmy1: datafile copy complete, elapsed time: 00:01:05
output file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sysaux_8ocl7k6n_.dbf tag=TAG20130516T084335
channel prmy2: datafile copy complete, elapsed time: 00:01:05
Finished backup at 16-MAY-13

sql statement: alter system archive log current

contents of Memory Script:
{
 switch clone datafile all;
}
executing Memory Script

datafile 1 switched to datafile copy
input datafile copy RECID=7 STAMP=815561103 file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_system_8ocl7bho_.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=8 STAMP=815561104 file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sysaux_8ocl7k6n_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=9 STAMP=815561104 file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_sys_undo_8ocl7q6c_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=10 STAMP=815561104 file name=/u01/app/oracle/oradata/testgg2/TESTGG2/datafile/o1_mf_users_8qbolh3g_.dbf
Finished Duplicate Db at 16-MAY-13
released channel: prmy1
released channel: prmy2
released channel: prmy3
released channel: prmy4
released channel: stby

RMAN> **end-of-file**

RMAN> exit

Como puedes ver, es pan comido, ahora sólo inicio el proceso de recuperación de la base de datos Standby, en mi caso he usado la opción de Active Dataguard para que te pueda demostrar que realmente funciona, pero ten cuidado que es un Opción Licenciable.


SQL> alter database open;

Database altered.

SQL> alter database recover managed standby database disconnect;

Database altered.

SQL> select protection_mode,protection_level,database_role,name from v$database;

PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE NAME
-------------------- -------------------- ---------------- ---------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PHYSICAL STANDBY TESTGG1

SQL> select instance_name,host_name from v$instance;

INSTANCE_NAME HOST_NAME
---------------- ----------------------------------------------------------------
testgg2 dlabvm14.dlab.pythian.com

SQL> select * from sender.test;
select * from sender.test
 *
ERROR at line 1:
ORA-00942: table or view does not exist


Ahora me regreso a la base de datos Primaria, y creo una tabla llamada test en el esquema sender, y como se puede ver arriba, esta tabla no existe en la base de datos Standby.


SQL> select instance_name,host_name from v$instance;

INSTANCE_NAME HOST_NAME
---------------- ----------------------------------------------------------------
testgg1 dlabvm13.dlab.pythian.com

SQL> select protection_mode,protection_level,database_role,name from v$database;

PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE NAME
-------------------- -------------------- ---------------- ---------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PRIMARY TESTGG1

SQL> create table sender.test(id number);

Table created.

SQL> insert into sender.test values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

De nuevo me regreso a la base de datos Standby y podemos ver que tenemos nuestra tabla test que acabamos de crear en la primaria.


SQL> select protection_mode,protection_level,database_role,name from v$database;

PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE NAME
-------------------- -------------------- ---------------- ---------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE PHYSICAL STANDBY TESTGG1

SQL> select instance_name,host_name from v$instance;

INSTANCE_NAME HOST_NAME
---------------- ----------------------------------------------------------------
testgg2 dlabvm14.dlab.pythian.com

SQL> select * from sender.test;

ID
----------
 1

Ahora bien, hay varias manera de ver si esto funciona o no, puedes utilizar el siguiente query para ver cual fue el último archivo recibido/se aplico en la base de datos Standby.


SQL> SELECT 'Last Applied : ' Logs,
TO_CHAR(next_time,'DD-MON-YY:HH24:MI:SS') TIME,thread#,sequence#
FROM v$archived_log
WHERE sequence# =
(SELECT MAX(sequence#) FROM v$archived_log WHERE applied='YES'
)
UNION
SELECT 'Last Received : ' Logs,
TO_CHAR(next_time,'DD-MON-YY:HH24:MI:SS') TIME,thread#,sequence#
FROM v$archived_log
WHERE sequence# =
(SELECT MAX(sequence#) FROM v$archived_log );

LOGS TIME THREAD# SEQUENCE#
---------------- ------------------ ---------- ----------
Last Applied : 16-MAY-13:11:42:52 1 65
Last Received : 16-MAY-13:11:42:52 1 65

Mientras que en la base de datos Primaria, se puede comprobar cuál es la secuencia actual y cuál es la secuencia en espera de ser aplicada.


SQL> SELECT
 (SELECT name FROM V$DATABASE
 ) name,
 (SELECT MAX (sequence#) FROM v$archived_log WHERE dest_id = 1
 ) Current_primary_seq,
 (SELECT MAX (sequence#)
 FROM v$archived_log
 WHERE TRUNC(next_time) > SYSDATE - 1
 AND dest_id = 2
 ) max_stby,
 (SELECT NVL (
 (SELECT MAX (sequence#) - MIN (sequence#)
 FROM v$archived_log
 WHERE TRUNC(next_time) > SYSDATE - 1
 AND dest_id = 2
 AND applied = 'NO'
 ), 0)
 FROM DUAL
 ) "To be applied",
 (
 (SELECT MAX (sequence#) FROM v$archived_log WHERE dest_id = 1
 ) -
 (SELECT MAX (sequence#) FROM v$archived_log WHERE dest_id = 2
 )) "To be Shipped"
FROM DUAL;

NAME CURRENT_PRIMARY_SEQ MAX_STBY To be applied To be Shipped
--------- ------------------- ---------- ------------- -------------
TESTGG1 65 65 0 0

Espero que esta pequeña guía te pueda ayudar cuando estés tratando de construir una base de datos Standby Fisica con RMAN Active Duplicate, y como siempre,  prueba todo lo ,que he dicho o se ha mencionado,  antes de ejecutarlo en un entorno de producción y sobre todo para que puedas entender lo que está sucediendo .