Wednesday, April 25, 2007

Configuración Oracle Physical Standby

Este manual está pensado para realizar la instalación de la base de datos Oracle 9i.

Para poder seguir el manual se recomiendan los siguientes supuestos:

  • La estructura de directorios de los servidores debe ser la misma (como requerimiento para el "Physical Standby")
  • Se deben definir en el tnsnames.ora de ambos servidores las entradas que permitan conectar con el mismo y con el opuesto.
  • Debe estar activado el mode de archivado automático de logs en la base de datos:
    • Modificar el fichero $ORACLE_HOME/dbs/initSID.ora (si no existe porque la base de datos se inició con SPFILE ejecutar cómo SYS el siguiente comando dentro de una consola de SQL> create pfile from spfile; )
      • Insertar las siguientes entradas en el fichero:
        • log_archive_start=TRUE
        • log_archive_dest_1=/u01/archive/SID
        • log_archive_format=arch_SID_%S_%T.arc
    • Parar la base de datos:
      • SQL> shutdown immediate;
    • Iniciar la base de datos en modo archivelog:
      • SQL> startup mount;
      • SQL> alter database archivelog;
      • SQL> alter database open;
    • Verificar:
      • SQL> archive log list;
  • Debe crearse un catalogo de RMAN para la base de datos principal (esto "no es" indispensable per sí "del todo" recomendable) y este debe ser accesible vía tnsnames.ora
    • Crear un tablespace en una base de datos diferente (con el fin de que si por cualquier causa nos quedásemos sin la base de datos original y/o la máquina, pudiésemos restaurarla desde esta otra base de datos!) (p.e. RMAN_TBS).
    • Crear un usuario en esta otra base de datos con los permisos de escritura necesarios en el espacio de tablas RMAN_TBS y el rol RECOVERY_CATALOG_OWNER.
    • Conectar con RMAN:
      • $ rman target sys@dbserver catalog rman@dbcat
      • RMAN> create catalog
      • RMAN> register database

Definiciones:

  • @dbserver: base de datos principal (Oracle NET8)
  • @dbstb: base de datos standby (Oracle NET8)
  • @dbcat: base de datos del catálogo de RMAN (Oracle NET8)
  • backup: directorio donde RMAN guardará la copia de los ficheros
  • orcl: nombre por defecto de la base de datos (cambiar por el nombre de la base de datos que queramos replicar)
  • $ORACLE_BASE: directorio base de instalación oracle. En nuestro caso utilizamos '/u01/app/oracle' como directorio de instalación
  • comando scp (secure copy): oracle_user (usuario oracle de sistema), dbstb_server (equipo donde se ubica la base de datos standby)
  • $ORACLE_HOME: directorio por defecto de la instalación de Oracle. En nuestro caso utilizaremos por defecto /u01/app/oracle/product/9.2.0

Configuración recomendada para RMAN:

* Para aplicarlos simplemente insertar en RMAN>

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS; # default
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/app/oracle/backup/orcl/%F';
CONFIGURE DEVICE TYPE DISK PARALLELISM 3;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/app/oracle/backup/orcl/bkp_%U' MAXPIECESIZE 512 M;
CONFIGURE MAXSETSIZE TO 2048 M; # Limita el tamaño de los ficheros
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/backup/orcl/snapcf_orcl.ctl';

1.- Acciones a ejecutar en el servidor principal:

Acceso a RMAN:

1.1- Acceder cómo usuario "oracle" al sistema:# su - oracle

1.2.- Realizar una copia del pfile de la base de datos (init$SID.ora) y copiarlo al mismo directorio de la máquina que ejecutará el standby ($ORACLE_HOME/dbs/)

2.1.- $ sqlplus "sys/sys_password@dbserver as sysdba"

2.2.- SQL> create pfile from spfile;

2.3.- SQL> exit

2.4.- scp $ORACLE_HOME/dbs/init$SID.ora oracle_user@dbstb_server:$ORACLE_HOME/dbs/

# Suponiendo que la base de datos se ejecute con spfile, si no, es tan fácil como copiar el init$SID.ora que se encuentra en $ORACLE_HOME/dbs/

1.3.- Acceder a RMAN, a la base de datos principal (TARGET) y al catálogo (CATALOG):

1.3.1.- $ rman target sys@dbserver catalog rman@dbcat

(donde "rman" es el usuario propietario del catálogo de RMAN)

1.3.2.- RMAN> backup current controlfile for standby;

(Esta sentencia crea un controlfile específico de nuestra base de datos para que actúe como standby. Este paso es imprescindible para el funcionamiento de nuestro entorno)

1.3.3.- RMAN> backup database plus archivelog;

(Ahora realizaremos una copia de la base de datos completa con todos los 'archives' disponibles para que podamos recuperar posteriormente la instancia STANDBY hasta el punto actual de transacciones)

1.3.4.- RMAN> exit;

1.4.- Copiar los ficheros en el servidor destino (donde se hospedará la base de datos STANDBY):

$ scp /u01/app/oracle/backup/orcl/* oracle_user@dbstb_server:/u01/app/oracle/backup/orcl/

El comando anterior copia a través de canal seguro (ssh - encriptado) todos los ficheros de backup de RMAN, tanto de la base de datos cómo de los ficheros de "archive" generados hasta el momento por RMAN.

2.- Acciones a ejecutar en el servidor de standby:

$ sqlplus "sys@dbstb as sysdba"

SQL> startup nomount

SQL> exit

3.- Duplicación de la base de datos y generación en el servidor de Oracle standby

3.1.- rman target sys@dbserver catalog rman@dbcat auxiliary /

En este punto se establece la conexión con los repositorios de RMAN. RMAN sabe que debe recrear la base de datos en el servidor de standby gracias a la conexión "auxiliary"

3.2.- RMAN> duplicate target database for standby nofilenamecheck dorecover;

Este comando duplica la base de datos (en modo standby!, importante...) sin revisar los nombres de directorios ni ficheros (esto es motivado por la creación de la base de datos standby "física" que tiene que tener una estructura idéntica a la de al base de datos original)

3.3.- RMAN> exit;

4.- Configuración del servidor Oracle principal

4.1.- Acceder a SQLPLUS como sys y realizar la siguiente consulta:

$ sqlplus "sys@dbserver as sysdba"

4.2.- SQL> show parameter log_archive_dest

El resultado de la consulta nos mostrará los diferentes directorios de destino de los logs de Oracle.

4.3.- SQL> alter system set log_archive_dest_X=’SERVICE=DBSTB LGWR ASYNC=20480 net_timeout=20 reopen=300 noaffirm’ scope=both;

Donde X será el primer destino libre (normalmente '2', ya que el primero es el destino de los "archives" de la base de datos)

4.4.- SQL> alter system set log_archive_dest_state_X='ENABLE' scope=both;

Suelen estar habilitados todos los destinos por defecto, pero nunca está de más revisarlo

SQL> alter system set standby_file_management=auto scope=both;

Indicamos a la base de datos que la gestión de los archivos de standby debe ser gestionada automáticamente.

5.- Configuración del servidor Oracle standby

5.1.- Acceder a SQLPLUS como sys y ejecutar las siguientes instrucciones

SQL> alter system set standby_file_management=auto scope=both;

Indicamos a la base de datos que la gestión de los archivos de standby debe ser gestionada automáticamente.

SQL> alter system set log_archive_dest_X='' scope=both;

Elimina cualquier referencia al destino secundario (tal como está configurado en "dbserver") en "dbstb".

SQL> alter system set FAL_SERVER='DBSERVER' scope=both;

Indica al servidor de la base de datos standby qué servidor principal tiene

SQL> alter system set FAL_CLIENT='DBSTB' scope=both;

Indica el servidor standby

SQL> shutdown immediate;

SQL> startup nomount;

Inicia la base de datos sin montarla

SQL> alter database mount standby database;

Monta la base de datos en modo standby

SQL> alter database recover managed standby database disconnect from session;

Inicia la recuperación de la base de datos standby y desconecta la sesión activa. Vuelve a mostrar el prompt "SQL>"

5.2.- Creación de redo logs standby en "dbstb".

5.2.1.- Para poder crear grupos de redo log es necesario que la base de datos standby "dbstb" esté en modo MONTADA.

5.2.2.- Acceder a SQLPLUS como sys y ejecutar las siguientes instrucciones:

SQL> shutdown immediate

El paso de parar la base de datos depende del estado en que se encuentre la misma.

SQL> startup nomount

Inicia la base de datos sin montarla

SQL> alter database mount standby database;

Monta la base de datos en modo standby

SQL> alter database add standby logfile group N# ('/u01/app/oracle/oradata/orcl/redoN#.rdo') size S#M;

Donde N# es el número de grupo que vamos a crear (se recomienda que sea consecutivo del que corresponde de los redo logs) y S# el tamaño que tendrán los standby redo log (que debe ser idénticos a los de la base de datos principal). Se puede modificar la sentencia para multiplexar los archivos y evitar males mayores, pero para el ejemplo muestro únicamente como organizarlo con un único archive de redo. Se deben crear, como mínimo, un número de standby redo logs igual al número de redo's en la base de datos principal + 1.

SQL> alter database add standby logfile group N# ('/u01/app/oracle/oradata/orcl/redoN#.rdo') size S#M;

SQL> alter database add standby logfile group N# ('/u01/app/oracle/oradata/orcl/redoN#.rdo') size S#M;

SQL> alter database add standby logfile group N# ('/u01/app/oracle/oradata/orcl/redoN#.rdo') size S#M;

SQL> alter database add standby logfile group N# ('/u01/app/oracle/oradata/orcl/redoN#.rdo') size S#M;

SQL> alter database add standby logfile group N# ('/u01/app/oracle/oradata/orcl/redoN#.rdo') size S#M;

SQL> alter database recover managed standby database disconnect from session;

Inicia la recuperación de la base de datos standby y desconecta la sesión activa. Vuelve a mostrar el prompt "SQL>"

6.- Verificación del correcto funcionamiento del Oracle en standby

6.1.- Para verificar el correcto funcionamiento del standby

6.1.1.- Conectar como sys a la base de datos standby (sqlplus "sys@dbstb as sysdba")

6.1.2.- Ejecutar la siguiente sentencia SQL:

SQL> select sequence#, applied, to_char(first_time,'dd/mm/yyyy hh24:mi:ss'), to_char(next_time,'dd/mm/yyyy hh24:mi:ss'), archived, status from v$archived_log order by sequence#;

SEQUENCE# APP TO_CHAR(FIRST_TIME, TO_CHAR(NEXT_TIME,' ARC S

316 YES 02/05/2007 09:02:06 02/05/2007 11:57:12 YES A
317 YES 02/05/2007 11:57:12 02/05/2007 14:43:50 YES A
318 YES 02/05/2007 14:43:50 02/05/2007 17:37:21 YES A
319 YES 02/05/2007 17:37:21 02/05/2007 18:03:11 YES A
320 YES 02/05/2007 18:03:11 03/05/2007 18:57:00 YES A
321 YES 03/05/2007 18:57:00 03/05/2007 21:42:00 YES A
322 YES 03/05/2007 21:42:00 04/05/2007 00:36:25 YES A
323 YES 04/05/2007 00:36:25 04/05/2007 03:31:51 YES A
324 YES 04/05/2007 03:31:51 04/05/2007 06:28:01 YES A
325 NO 04/05/2007 06:28:01 04/05/2007 09:14:08 YES A
326 NO 04/05/2007 09:14:08 04/05/2007 11:43:51 YES A

La segunda columna muestra qué archivers han sido aplicados y cuales no. Dependiendo del número de ficheros a aplicar la operación puede tardar más o menos tiempo.

6.2.- La siguiente sentencia muestra el estado de los redo logs de standby en la base de datos standby "dbstb"

6.2.1.- Conectar como sys a la base de datos standby (sqlplus "sys@dbstb as sysdba")

6.2.2.- Ejecutar la siguiente sentencia SQL:

select group#, thread#, sequence#, archived, status from v$standby_log;

GROUP# THREAD# SEQUENCE# ARC STATUS

4 0 0 YES UNASSIGNED
5 1 157 YES ACTIVE
6 0 0 YES UNASSIGNED
7 0 0 YES UNASSIGNED
8 0 0 YES UNASSIGNED
9 0 0 YES UNASSIGNED

La última columna muestra qué standby redo log es el que está activo en el momento actual (recogiendo los datos del redo log activo de la base de datos principal.

7.- Inicio de emergencia de la base de datos STANDBY (esta operación implica la "inutilización absoluta" de la base de datos principal (dbserver) y que la hasta ahora base de datos standby (dbstb) adopte "immediatamente" el rol de base de datos principal sin posibilidad de "marcha atrás"):

7.1.- SQL> shutdown immediate

7.2.- SQL> startup nomount

7.3.- SQL> alter database mount standby database exclusive;

7.4.- SQL> recover managed standby database disconnect from session;

7.5.- SQL> alter database recover managed standby database finish;

7.6.- SQL> alter database commit to switchover to primary;

7.7.- SQL> shutdown immediate

7.8.- SQL> startup

Tuesday, March 27, 2007

Instalacion Oracle9i en CentOS/RedHat

Antes de iniciar la instalación

Oracle recomienda para la esta versión los siguientes requisitos mínimos para el sistema:

RAM: 512 Mb.
SWAP: 1 Gb.
HD: 3 Gb.

(He conseguido hacerlo funcionar con mucho menos... pero allá tú!... realmente el rendimiento se “desinfla” exponencialmente...)

La instalación se muestra con CentOS 4.4 instalado en el sistema.

Obtener Oracle

Accede a http://technet.oracle.com y pulsa sobre “Downloads” y “Database”.

Después de haber aceptado las condiciones descarga los siguiente ficheros:
ship_9204_linux_disk1.cpio.gz
ship_9204_linux_disk2.cpio.gz
ship_9204_linux_disk3.cpio.gz
Después de descargarlos, ejecuta los siguientes comandos para montarlos en un sistema de ficheros lo suficientemente grande (+/- 2 Gb.)
# cd /bigtmp
# zcat ship_9204_linux_disk1.cpio.gz | cpio -idmv
# zcat ship_9204_linux_disk2.cpio.gz | cpio -idmv
# zcat ship_9204_linux_disk3.cpio.gz | cpio -idmv
Una vez expandidos los ficheros puedes copiarlos (si lo deseas) en sendos CD's para disponer de ellos en posteriores instalaciones.

Preparación del entorno

Crea los directorios de instalación donde tú decidas (yo acostumbro a utilizar /u01/app/oracle/product/9.2.0)

Crea además un usuario y un grupo para la instalación de los binarios así como un directorio para los ficheros de datos:

# /usr/sbin/groupadd dba
# /usr/sbin/groupadd oinstall
# /usr/sbin/useradd -m -g oinstall -G dba oracle
# mkdir -p /u01/app/oracle/product/9.2.0
# chown -R oracle:oinstall /u01/app/oracle
# mkdir -p /u01/oradata
# chown -R oracle:oinstall /u01/oradata
# passwd oracle

Añade las siguientes líneas en el fichero /etc/sysctl.conf

echo "kernel.shmmax = 2147483648" >> /etc/sysctl.conf
echo "kernel.shmmni = 100" >> /etc/sysctl.conf
echo "kernel.shmall = 2097152" >> /etc/sysctl.conf
echo "# semaphores: semmsl, semmns, semopm, semmni" >> /etc/sysctl.conf 
echo "kernel.sem = 100 256 100 100" >> /etc/sysctl.conf
echo "fs.file-max = 327679" >> /etc/sysctl.conf
echo "kernel.hostname = centos.localdomain" >> /etc/sysctl.conf
echo "kernel.domainname = localdomain" >> /etc/sysctl.conf 

Ejecuta el siguiente comando para cambiar los parámetros de kernel en caliente

# /sbin/sysctl -p

Añade las siguientes líneas al fichero /etc/security/limits.conf

echo "oracle soft nofile 65536" >> /etc/security/limits.conf
echo "oracle hard nofile 65536" >> /etc/security/limits.conf
echo "oracle soft nproc 16384" >> /etc/security/limits.conf
echo "oracle hard nproc 16384" >> /etc/security/limits.conf 

Modifica el .bash_profile del usuario

# Oracle 9i
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/9.2.0; export ORACLE_HOME
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=$ORACLE_HOME/bin:$PATH; export PATH
ORACLE_OWNER=oracle; export ORACLE_OWNER
ORACLE_SID=DBORA; export ORACLE_SID
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib; export CLASSPATH
LD_ASSUME_KERNEL=2.4.19; export LD_ASSUME_KERNEL
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

Guarda el fichero .bash_profile y vuelve a entrar como el usuario “oracle” (en en la misma session ejecuta en el home del usuario

$ . ./.bash_profile

Asegúrate de haber asignado una ip al servidor

# 192.168.0.10 hostname

Revisa que los siguientes paquetes estén instalados en el sistema

# rpm -q make                         \
compat-db                      \
compat-gcc-32                  \
compat-gcc-32-c++              \
compat-oracle-rhel4            \
compat-libcwait                \
compat-libgcc-296              \
compat-libstdc++-296           \
compat-libstdc++-33            \
gcc                            \
gcc-c++                        \
gnome-libs                     \
gnome-libs-devel               \
libaio-devel                   \
libaio                         \
make                           \
openmotif21                    \
xorg-x11-deprecated-libs-devel \
xorg-x11-deprecated-libs

Si no es así instalalos con los comandos “yum”, “up2date” o bién con rpm (aunque es bastante más artesanal!!!)

Instala los paquetes asociados al parche 4198954 :

cd 4198954
rpm -Uvh compat-oracle-rhel4-1*
rpm -Uvh compat-libcwait-2*

Instalación

Para iniciar la instalación accede al directorio

$ cd /bigtmp
$ cd Disk1
$ export ORACLE_HOME=/u01/app/oracle/product/9.2.0
$ ./runInstaller

Bienvenidos a mi humilde residencia en la gran telaraña.


Con los artículos que contiene mi blog pretendo únicamente poder colaborar con todos vosotros en lo referente a bases de datos, sistemas operativos abiertos y sistemas de inteligencia de negocio.

Las entradas que se muestran son las que, limitado por el tiempo, puedo garantizar que funcionan con el noble arte de "copy & paste"... pero si tenéis cualquier tipo de duda acerca de las tecnologías mencionadas con anterioridad no dudéis en poneros en contacto conmigo y procuraré colaborar con vosotros para cualquier cosa que esté a mi alcance.

Gracias por vuestro interés y hasta muy pronto!!!