lunes, agosto 11, 2008

Conexiones con PostgreSQL

PostgreSQL, es un sistema gestor de base de datos muy robusto y de hecho una muy buena alternativa a sistemas como Oracle. De hecho, hoy al final del día me llamaron para revisar algunas fallas en la conexión a una base de datos que estaba ejecutándose en PostgreSQL (bajo RHEL) desde una aplicación cliente que se ejecutaba en windows. Pues bien, supuse que había algún error en los parámetros de configuración e hice todas las pruebas del caso, y aún el problema persistía. Revisé cuidadosamente los archivos de configuración que controlan las conexiones en PostgreSQL (pg_hba.conf y postgresql.conf) y todo estaba en su sitio, no entendía cuál era la naturaleza del error. En fin, revisé las reglas del firewall, y en efecto, el tráfico por el puerto 5432 no estaba habilitado: sencillo, modifique las reglas y reinicié el servicio, problema resuelto ...., pensé yo, pero nada de eso, lo mejor estaba por venir.

Resulta que la aplicación cliente, estaba compuesta de dos elementos: un primero programa que se conectaba y creaba una especie de instancia de la conexión y otro que haciendo uso de esa instanacia se comunicaba con la base de datos; pues bien el primer programa no lograba conectarse, a pesar de otra aplicación (llamada pgexplorer, primera vez que la ví) si lograba establecer la conexión. Después de mucho probar y revisar, me dí cuenta que el problema radicaba en la versión de PostgreSQL para la que fué escrita dicha aplicación, dado que había un servidor windows en el cual estaba instalado PostgreSQL versión 8.0, al cual se conectaba sin problema alguno, mientras que en el RHEL estaba funcionando inicialmente PostgreSQL 8.1 y después usé la versión 8.3, sin éxito; claro está, que los logs fueron de mucha ayuda, previa configuración de las opciones para logging en el archivo postgresql.conf y usando a syslog. Después de instalar la versión 8.0.17 de PostgreSQL, la aplicación se conectó sin ningún problema y se logró generar el tan anhelado mensaje de:

"Connection success !"

No entiendo el porqué los problemas de conexión con las versiones posteriores a la 8.0.x, después investigaré, si hubo algún cambio significativo.

Aunque, pareciera que ahí paro todo, aún faltaba un problema por resolver: existían incovenientes de codificación que impedian el correcto funcionamiento; cómo lo solucioné ? Sencillo, después de todo:

Al momento de la creación de la base de datos, se debe especificar la codificación de la misma, con la opción -E:

# createdb -U postgres -T template0 -E LATIN1 ....

Posteriormente, al momento de cargar el script sql o de usar el cliente en línea de comandos, especificar la misma codificación, bien sea con:

# set encoding = "LATIN1" o desde plsql:

\encoding LATIN1

y problema resuelto. Aunque me queda la duda, si SELinux, tenga relación con los problemas de conexión.

1 comentario:

Camilo Nova dijo...

Juan muy buena explicacion, alguna vez tuve tambien problemas con las versiones entre software que compone alguna solucion, es de cuidado hacer los cambios entre versiones.