domingo, 28 de agosto de 2011

Como vincular los binarios de Oracle

En este cuarto de año, mi equipo y yo estamos aplicando una seria de parches y el PSU de Julio 2011 a nuestras bases de datos, decidimos que para reducir el tiempo de baja de las Bases de Datos, vamos a construir un nuevo ORACLE_HOME con estos parches y PSU, y solamente bajar la instancia,cambiar la variable de ambiente ORACLE_HOME a la nueva y empezar la instancia.

En este metodo, lo que hicimos fue construir un solo ORACLE_HOME y clonarlo a los demas servidores, pero en este proceso nos dimos cuenta que nuestra copia "base", habia sido borrado el archivo $ORACLE_HOME/network/admin/shrept.lst. Esto causaba que la clonacion a la hora de vincular los binarios de Oracle con el sistema operativo fallaba con el siguiente error:

INFO: Calling Action unixActions10.2.0.3.0 make
registerOnly = false
installMakePath = /usr/ccs/bin/make
installMakeFileName = /mount/oracle/product/11.2.0.2v2/rdbms/lib/ins_rdbms.mk
installTarget = client_sharedlib
undoMakeFileName =
installArguments = ORACLE_HOME=/mount/oracle/product/11.2.0.2v2
logFile = /mount/oracle/product/11.2.0.2v2/install/make.log
undoTarget =
progMsg = Building Client Shared Libraries

INFO: The output of this make operation is also available at: '/mount/oracle/product/11.2.0.2v2/install/make.log'
INFO:

INFO: Start output from spawned process:
INFO: ----------------------------------
INFO:

INFO: /mount/oracle/product/11.2.0.2v2/bin/genclntsh

INFO: genclntsh: Could not locate /mount/oracle/product/11.2.0.2v2/network/admin/shrept.lst
genclntsh: exiting ...

INFO: make: Fatal error: Command failed for target `client_sharedlib'

INFO: *** Error code 1

Para poder entender lo que hicimos para solucionar este problema, hay que entender que en cualquier distribucion de un sistema operativo basado en Unix, el software de Oracle viene como archivos tipo objeto (object files) o como archivos tipo fuente (source files), estos al ser instalados en Unix se vinculan con las librerias del sistema operativo para generar el ejecutable de oracle.

Lo primero que tuvimos que hacer es recrear el archivo, ya sea de otra instalacion de 11.2.0.2 que tuviera el archivo o lo puedes extraer del cd de instalacion (Metalink id 340978.1), en este caso el contenido de nuestro archivo, es como se menciona abajo:

oracle@localhost [DBATEST] /mount/oracle/product/11.2.0.2v2/network/admin
root $ cat shrept.lst
# function entry points for genclntsh.sh

network : snaumihi_inithostinfo
network : snaumbg_gmt
network : naedpwd_encrypt
network : naumbsb_bld_singlebyte
network : ztapis
network : nlgh

Una vez que reconstruimos el archivo con el usuario oracle y permisos 644, bajamos todas las instancias y listeners que estuvieran corriendo en el ORACLE_HOME donde fallo la instalacion, y utilizamos el comando $ORACLE_HOME/bin/relink all

oracle@localhost [DBATEST] /mount/oracle/product/11.2.0.2v2/bin
root $ ./relink all
writing relink log to: /mount/oracle/product/11.2.0.2v2/install/relink.log

Este comando no te regresa un mensaje de exito, es mas bien si ocurre un error durante esta fase te muestra el mensaje de falla, como por ejemplo

'Fatal error', 'Ld: fatal', 'Exit Code 1'

Si te llega a suceder un error, lo mas recomendable es buscar en metalink, si hay otro suceso de este error o abrir un SR con oracle para resolverlo.

Conclusion
El comando de relink all es una herramienta muy util, sobre todo cuando por alguna razon los vinculos se perdieron entre Oracle y las librerias del sistema operativo.