Cómo un clon de la base de datos nos puede ayudar a aplicar un patch

Por Enrique Orbegozo
Publicado en Julio 2014

Cada vez que vamos a aplicar un patch o un patch set update (PSU), el procedimiento tradicional implica detener todos los procesos que se estén ejecutándo en el Oracle home directory involucrado, lo cual obliga a que dejemos de prestar servicio para iniciar el patching, proceso que si bien es relativamente fácil y sencillo, está sujeto a eventuales fallas que, de ocurrir, pueden llevar a una situación de crisis en la cual el DBA debe identificar el problema y tratar de resolverlo, u optar por dar marcha atrás.


Para evitar pasar por una situación como ésta y reducir al mínimo posible la suspensión del servicio, es una práctica recomendada proceder al patching sobre un Oracle home directory nuevo, uno que sea un "clon" del que está en producción, y así no tener que suspender el servicio sino hasta que estemos seguros que la primera parte del patching se ha logrado de forma satisfactoria. A continuación veremos cómo y en sólo 3 pasos, podemos tener en pocos minutos un clon completamente soportado y listo para ser objeto del patching (*)

(*) El procedimiento a ser mostrado ha sido probado con Oracle Server 10.2, 11.2 y 12.1.

Clonación al estilo Oracle

Para empezar tomemos en cuenta las siguientes suposiciones iniciales:

  1. Oracle home directory original: /u01/app/oracle/12.1.0/db_1
  2. Oracle home directory clonado: /u01/app/oracle/12.1.0/db_2
  3. La versión en uso es la 12.1.0.1.2 y se desea aplicar el PSU 12.1.0.1.3

En líneas generales el procedimiento implica copiar el software al Oracle home directory clonado, ejecutar la clonación en sí con Oracle Universar Installer, para finalmente aplicar el patch o PSU sobre ese directorio.

1. Copiar el software desde el Oracle home directory original hacia el clonado.

[oracle@server1 ~]$ cp -Rp /u01/app/oracle/12.1.0/db_1 /u01/app/oracle/12.1.0/db_2

Ojo, es posible que se nos presenten mensajes indicando que algunos archivos no pueden ser copiados, tal como se ve cuando copiamos un Oracle home directory con Oracle Server 11.2.0.3.

[oracle@server1 ~]$ cp -Rp /u01/app/oracle/11.2.0/db_1 /u01/app/oracle/11.2.0/db_2
cp: cannot open `/u01/app/oracle/11.2.0/db_1/bin/nmhs' for reading: Permission denied
cp: cannot open `/u01/app/oracle/11.2.0/db_1/bin/nmo' for reading: Permission denied
cp: cannot open `/u01/app/oracle/11.2.0/db_1/bin/nmb' for reading: Permission denied

No hay nada de qué preocuparse, son archivos que serán reconstruidos más adelante, como parte del proceso de clonación, por lo que podemos ignorar estos mensajes.

2. Clonar la instalación con Oracle Universal Installer (OUI).

Existen 2 formas de hacerlo, ambas producen el mismo resultado:

a. Usando clone.pl

[oracle@server1 ~]$ cd /u01/app/oracle/12.1.0/db_2/clone/bin

[oracle@server1 bin]$ perl clone.pl ORACLE_HOME="/u01/app/oracle/12.1.0/db_2" ORACLE_HOME_NAME="OraDB12Home2" ORACLE_BASE="/u01/app/oracle" OSDBA_GROUP=dba OSOPER_GROUP=oper

./runInstaller -clone -waitForCompletion  "ORACLE_HOME=/u01/app/oracle/12.1.0/db_2" "ORACLE_HOME_NAME=OraDB12Home2" "ORACLE_BASE=/u01/app/oracle" "oracle_install_OSDBA=dba" "oracle_install_OSOPER=oper" -silent -paramFile /u01/app/oracle/12.1.0/db_2/clone/clone_oraparam.ini
Starting Oracle Universal Installer...

Checking Temp space: must be greater than 500 MB.   Actual 5156 MB    Passed
Checking swap space: must be greater than 500 MB.   Actual 640 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2014-05-21_04-51-05AM. Please wait ...


You can find the log of this install session at:

/u01/app/oraInventory/logs/cloneActions2014-05-21_04-51-05AM.log
....................................................................................................  5% Done.
....................................................................................................  10% Done.
....................................................................................................  15% Done.
....................................................................................................  20% Done.
....................................................................................................  25% Done.
....................................................................................................  30% Done.
....................................................................................................  35% Done.
....................................................................................................  45% Done.
....................................................................................................  50% Done.
....................................................................................................  55% Done.
....................................................................................................  60% Done.
....................................................................................................  65% Done.
....................................................................................................  70% Done.
....................................................................................................  75% Done.
....................................................................................................  80% Done.
....................................................................................................  85% Done.
....................................................................................................  90% Done.
....................................................................................................  95% Done.

Copy files in progress.

Copy files successful.

Link binaries in progress.

Link binaries successful.

Setup files in progress.

Setup files successful.

Setup Inventory in progress.

Setup Inventory successful.

Finish Setup in progress.

Finish Setup successful.

The cloning of OraDB12Home2 was successful.
Please check '/u01/app/oraInventory/logs/cloneActions2014-05-21_04-51-05AM.log' for more details.

As a root user, execute the following script(s):
1. /u01/app/oracle/12.1.0/db_2/root.sh

.................................................................................................... 100% Done.

Si se trata de Oracle 10.2 la sintaxis es algo diferente:

[oracle@server1 ~]$ cd /u01/app/oracle/10.2.0/db_2/clone/bin

[oracle@server1 bin]$ perl clone.pl ORACLE_HOME="/u01/app/oracle/10.2.0/db_2" ORACLE_HOME_NAME="OraDB10Home2"

b. Usando runInstaller

[oracle@server1 ~]$ cd /u01/app/oracle/12.1.0/db_2/oui/bin

[oracle@server1 bin]$ ./runInstaller -clone -silent -ignorePreReq ORACLE_HOME="/u01/app/oracle/12.1.0/db_2" ORACLE_HOME_NAME="OraDB12Home2" ORACLE_BASE="/u01/app/oracle" oracle_install_OSDBA=dba oracle_install_OSOPER=oper

Starting Oracle Universal Installer...

Checking swap space: must be greater than 500 MB.   Actual 640 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2014-05-21_05-27-10AM. Please wait ...Oracle Universal Installer, Version 12.1.0.1.0 Production
Copyright (C) 1999, 2013, Oracle. All rights reserved.

You can find the log of this install session at:

/u01/app/oraInventory/logs/cloneActions2014-05-21_05-27-10AM.log
.................................................................................................... 100% Done.

Installation in progress (Wednesday, May 21, 2014 5:27:46 AM EDT)
.................................................................................................... 81% Done.
Install successful

Linking in progress (Wednesday, May 21, 2014 5:27:59 AM EDT)
.................................................................................................... 82% Done.
Link successful

Setup in progress (Wednesday, May 21, 2014 5:30:30 AM EDT)
.................................................................................................... 100% Done.
Setup successful

Saving inventory (Wednesday, May 21, 2014 5:30:33 AM EDT)
Saving inventory complete

Configuration in progress (Wednesday, May 21, 2014 5:31:14 AM EDT)
Configuration complete

End of install phases.(Wednesday, May 21, 2014 5:31:18 AM EDT)
WARNING:
The following configuration scripts need to be executed as the "root" user.
/u01/app/oracle/12.1.0/db_2/root.sh
To execute the configuration scripts:
1. Open a terminal window
2. Log in as "root"
3. Run the scripts

The cloning of OraDB12Home2 was successful.
Please check '/u01/app/oraInventory/logs/cloneActions2014-05-21_05-27-10AM.log' for more details.

Si se trata de Oracle 10.2 la sintaxis es algo diferente:

[oracle@server1 ~]$ cd /u01/app/oracle/10.2.0/db_2/oui/bin

[oracle@server1 bin]$ ./runInstaller -clone -silent -ignorePreReq ORACLE_HOME="/u01/app/oracle/10.2.0/db_2" ORACLE_HOME_NAME="OraDB10Home2"

3. Ejecutar el script root.sh en el Oracle home directory clonado.

[root@server1 ~]# sh /u01/app/oracle/12.1.0/db_2/root.sh
Check /u01/app/oracle/12.1.0/db_2/install/root_server1_2014-05-21_04-57-50.log for the output of root script

¡Felicitaciones!, si llegaste a este punto entonces ya tienes un Oracle home directory debidamente clonado sobre el cual puedes aplicar el patch o PSU que necesitas, sin tener que suspender el servicio (por el momento). En cuanto termines el patching sobre este Oracle home directory ya puedes suspender el servicio (de ser necesario) y seguir con los pasos restantes que se señalen en el archivo Installation Notes que acompaña al patch/PSU, de forma que pase a ser el nuevo Oracle home directory activo.


La saga continúa: nuevos patches/PSU por aplicar

Si bien luego de tener operativo el nuevo Oracle home directory es posible deshacernos del anterior, lo recomendable es mantenerlo y usarlo para el siguiente patch/PSU que necesitemos aplicar. De hacerlo así, ya no es necesario copiar el Oracle home directory activo, ni ejecutar la clonación, sino que podemos proceder directamente con la aplicación del patch/PSU sobre lo que antes era el Oracle home directory activo.


Al terminar con el patching sobre este Oracle home directory ya se puede suspender el servicio y seguir con los pasos restantes que se señalen en el archivo Installation Notes que acompaña al patch/PSU, de forma que pase a ser el nuevo Oracle home directory activo.


Clonación en esteroides

Pero la historia no termina aquí, ¿qué ocurre si, como es usual, tenemos muchos más servidores en los cuales es necesario aplicar el mismo patch/PSU?


Afortunadamente no hay que repetir todo el procedimiento de copia/clonado/patching, sino que ahora solo es necesario copiar y clonar el Oracle home directory activo en el nuevo servidor.


El procedimiento completo es el siguiente:

1. Empaquetar el software del nuevo Oracle home directory, el que ya contiene el patch/PSU aplicado.

[oracle@server1 ~]$ cd /u01/app/oracle/12.1.0/db_2
[oracle@server1 db_2]$ tar -cvf /stage/12gR1.tar

2. Transferir y desempaquetar el archivo empaquetado en el servidor sobre el que se trabajará.

[oracle@server1 ~]$ scp /stage/12gR1.tar server2:/stage/.

[oracle@server2 ~]$ cd /u01/app/oracle/12.1.0/db_2
[oracle@server2 db_2]$ untar -xvf /stage/12gR1.tar

3. Clonar la instalación con Oracle Universal Installer (OUI).

[oracle@server2 ~]$ cd /u01/app/oracle/12.1.0/db_2/clone/bin

[oracle@server2 bin]$ perl clone.pl ORACLE_HOME="/u01/app/oracle/12.1.0/db_2" ORACLE_HOME_NAME="OraDB12Home2" ORACLE_BASE="/u01/app/oracle" OSDBA_GROUP=dba OSOPER_GROUP=oper

[root@server2 ~]# sh /u01/app/oracle/12.1.0/db_2/root.sh

Con el software ya clonado, solo queda suspender el servicio y seguir con los pasos restantes que se señalen en el archivo Installation Notes que acompaña al patch/PSU, de forma que pase a ser el nuevo Oracle home directory activo.


Este procedimiento se repite en todos y cada uno de los servidores a los que deseemos aplicar los mismos cambios.

Conclusiones

Una de las responsabilidades de todo DBA es mantener el software Oracle Server con los últimos PSU y patches recomendados, siendo un objetivo prioritario el interrumpir lo mínimo posible el servicio al aplicarlos. En este escenario es altamente recomendable realizar el patching sobre un clon del Oracle home directory en uso. Esto permite retrasar la suspensión del servicio hasta el momento en que tengamos el patch debidamente aplicado, y también nos permite resolver con calma cualquier problema que se presente durante esta tarea, algo que nos generaría una situación de tensión en caso estuviésemos trabajando sobre el Oracle home directory en uso y algo saliera mal, lo que nos obligaría a mantener suspendido el servicio por más tiempo del programado, y lo que es peor, a abortar todo el proceso en caso no demos con la solución y ya no podamos mantener por más tiempo la suspensión del servicio.

 


Enrique Orbegozo tiene más de 18 años de experiencia con productos Oracle. El provee servicios de consultoría independiente, enfocados en el diseño e implementación de soluciones de alta disponibilidad y contingencia, así como migraciones y upgrades con zero downtime, pero también destaca en el afinamiento de aplicaciones, gracias a su experiencia previa diseñando y codificando rutinas altamente optimizadas en SQL y PL/SQL. En 1999 se convirtió en Oracle ACE, en reconocimiento a su trayectoria y gran disposición a compartir sus conocimientos y experiencia, ya sea en conferencias, foros o en su blog.