En este artículo vamos a ver como podemos configurar un sistema linux/unix para tener múltiples instalaciones de PostgreSQL ejecutandose en un mismo servidor.
El ejemplo más común es cuando necesitamos tener acceso a diferentes versiones de PostgreSQL y queremos aprovechar los recursos disponibles en una sola máquina.
Una instalación de PostgreSQL tiene ciertos elementos en los cuales tenemos que pensar cuando vamos a tener un servidor ejecutando múltiples instancias:
Lo más importante que tenemos que tener en cuenta para configurar nuestro sistema con múltiples versiones es que existen dos combinaciones de estos elementos en las que todos los elementos de la combinación tienen que ser únicos entre todas las instalaciones de PostgreSQL que comparten el mismo servidor.
En lo que respecta al par IP/puerto podemos decir que, ó bien podemos usar una sola IP con diferentes puertos para cada instalación (opción 1), ó diferentes IPs con el mismo puerto (opción 2). A mi personalmente me gusta más la segunda opción porque de esta manera podemos usar el puerto por defecto (5432) y nos evitamos tener que definir en los clientes el puerto a utilizar.
A continuación teneis un gráfico que os muestra las dos opciones de configuración que tenemos cuando vamos a tener un servidor ejecutando múltiples instancias de PostgreSQL.

Para ilustrar como podemos configurar un sistema de este tipo, vamos a instalar un sistema con solo dos instalaciones de PostgreSQL, 8.3 y 8.4 y la opción 2 (2 IP diferentes / mismo puerto) . Los datos que vamos a utilizar para cada instalación son:
8.3
8.4
En este artículo no vamos a ver como instalar multiples IP en una misma máquina ya que el procedimiento puede variar ligeramente entre distribuciones de Linux. Este paso queda como ejercicio para los usuarios que estén interesados en el tema.
Lo primero que tenemos que hacer es instalar las diferentes versiones de PostgreSQL que vamos a utilizar. En nuestro caso instalaremos desde el código fuente de PostgreSQL, información de como descargar, compilar e instalar PostgreSQL desde el código fuente, se puede encontrar en el artículo "Instalación e inicialización básica de PostgreSQL desde el código fuente".
Normalmente no se pueden instalar diferentes versiones de un programa via los sistemas de instalación/paquetes que vienen con las diferentes distribuciones, por eso instalamos desde el código fuente.
Una vez que tenemos instalado la versión 8.3 en /usr/local/pgsql-8.3 y 8.4 en /usr/local/pgsql-8.4 (debereis de usar --prefix=/usr/local/pgsql-8.3 y --prefix=/usr/local/pgsql-8.4 respectivamente en el proceso de compilación), tendremos que inicializar los dos directorios de datos que van a utilizarse con estas dos versiones.
Lo primero que hacemos es crear estos dos directorios:
[root@servidor]# mkdir -p /var/pgsql-8.3/data [root@servidor]# mkdir -p /var/pgsql-8.4/data [root@servidor] chown postgres /var/pgsql-8.3/data [root@servidor] chown postgres /var/pgsql-8.4/data
A continuación los inicializamos:
[root@servidor]# su - postgres [postgres@servidor]# /usr/local/pgsql-8.3/bin/initdb -E utf8 -U postgres -D /var/pgsql-8.3/data [postgres@servidor]# /usr/local/pgsql-8.4/bin/initdb -E utf8 -U postgres -D /var/pgsql-8.4/data
Ahora y antes de arrancar las dos instancias de PostgreSQL deberemos de configurar que IP, puerto y unix socket tienen que utilizar. Para ello actualizaremos los ficheros postgresql.conf de las dos versiones.
Editamos el fichero /var/pgsql-8.3/data/postgresql.conf y actualizamos los siguientes parametros:
listen_addresses = '10.1.1.10' port = 5432 unix_socket = '/tmp/pgsql-8.3 unix_socket_permissions = 0700
Y el fichero /var/pgsql-8.4/data/postgresql.conf y actualizamos los siguientes parametros:
listen_addresses = '10.1.1.20' port = 5432 unix_socket = '/tmp/pgsql-8.4 unix_socket_permissions = 0700
Si hubiesemos decidido utilizar la misma IP con diferentes puertos tendriamos que haber definido:
Para 8.3: listen_addresses = '10.1.1.10' port = 5483 unix_socket = '/tmp/pgsql-8.3 unix_socket_permissions = 0700 Para 8.4: listen_addresses = '10.1.1.10' port = 5484 unix_socket = '/tmp/pgsql-8.4 unix_socket_permissions = 0700
Ya estamos casi listos para arrancar las dos versiones. Solo nos queda definir dos directorios diferentes si vamos a conectarnos via Unix sockets con PostgreSQL:
[root@servidor]# mkdir -p /tmp/pgsql-8.3 [root@servidor]# mkdir -p /tmp/pgsql-8.4 [root@servidor]# chown postgres /tmp/pgsql-8.3 [root@servidor]# chown postgres /tmp/pgsql-8.4
En estos momentos podemos arrancar nuestras bases de datos y empezar a utilizarlas sin problemas.
[postgres@servidor]# /usr/local/pgsql-8.3/bin/pg_ctl -D /var/pgsql-8.3/data -l /var/pgsql-8.3/data/postgresql.log start [postgres@servidor]# /usr/local/pgsql-8.4/bin/pg_ctl -D /var/pgsql-8.4/data -l /var/pgsql-8.4/data/postgresql.log start
Si queremos parar PostgreSQL podemos utilizar los siguientes comandos:
[postgres@servidor]# /usr/local/pgsql-8.3/bin/pg_ctl -D /var/pgsql-8.3/data stop -m fast [postgres@servidor]# /usr/local/pgsql-8.4/bin/pg_ctl -D /var/pgsql-8.4/data stop -m fast
Para empezar a utilizar las bases de datos podemos utilizar el cliente psql que viene con PostgreSQL. En nuestro caso solo tendremos que definir con que IP nos queremos conectar para utilizar una versión u otra. Por supuesto los ficheros pg_hba.conf de cada versión deben de tener los permisos correspondientes para poder conectarse a las nuevas instalaciones de PostgreSQL de nuestra máquina.
[postgres@servidor]# /usr/local/pgsql-8.3/bin/psql -h 10.0.0.10
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# SELECT version();
version
-------------------------------------------------------------
PostgreSQL 8.3.7 on i686-pc-linux-gnu, compiled by GCC gcc
(Ubuntu 4.3.2-1ubuntu12) 4.3.2
(1 row)
[postgres@servidor]# /usr/local/pgsql-8.4/bin/psql -h 10.0.0.20
psql (8.4.0)
Type "help" for help.
postgres=# SELECT version();
version
-------------------------------------------------------------
PostgreSQL 8.4.0 on i686-pc-linux-gnu, compiled by GCC gcc
(Ubuntu 4.3.2-1ubuntu12) 4.3.2, 32-bit
(1 row)
Bueno, esto es todo en este artículo. Más información sobre el tema en:
http://www.postgresql-es.org/node/218
http://www.postgresql-es.org/node/219
Comentarios
error al instalar postgres 8.4
Mar, 24/11/2009 - 19:37 — AnónimoHola, estoy intentando instalar el postgres 8.4 ya tengo instalado 8.3 y me da este erroral momento de compilarlo ./configure --prefix=/usr/local/pgsql-8.4
configure: error: readline library not found
If you have readline already installed, see config.log for details on the
failure. It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable readline support.
instale la libreria readline para ver si ese era el problema y nada... espero me puedan ayudar.
Re: error al instalar postgres 8.4
Mar, 24/11/2009 - 22:41 — rafaelma¿Estas seguro que has instalado libreadline y libreadline-dev? Si te da este fallo es porque no tienes instalado todo lo necesario.
Mas información en http://www.postgresql-es.org/node/218#comment-276
--
Rafael Martinez
PostgreSQL-es.org
varias versiones....
Mar, 24/11/2009 - 21:58 — AnónimoHola Tengo instalado postgres 8.3 pero no esta instalado en los directorios que dice el manual el postgres.conf esta en etc/postgres/8.3/main/postgres.conf
quiero saber si puedo dejar como esta el postgres 8.3 y probar el manual instalando postgres 8.1 y postgres8.4, es decir si es posible tener la 3 versiones? o como podria configurar de nuevo mi postgres 8.3 en los directorios que indica el manual.
Re:varias versiones....
Mar, 24/11/2009 - 22:37 — rafaelmaProbablemente hayas instalado PostgreSQL con los paquetes que vienen con tu distribución (¿qué distribución utilizas?), algunos de estos paquetes instalan las diferentes partes en otros sitios que en los estandares, como en este caso.
No deberias de tener ningún problema en instalar otras versiones como indicamos aqui y seguir usando 8.3 como la tienes ahora. Siempre y cuando sigas las reglas explicadas en el artículo de tener todo separado para las diferentes versiones.
La versión 8.3 que has instalado via los paquetes de tu distribución se podria en teoria cambiar, pero no te lo aconsejo. Probablemete tendrias que alterar el script de arranque (en /etc/init.d), y el fichero de configuración (en /etc/postgres/8.3/main), y tienes que saber que cambiar.
--
Rafael Martinez
PostgreSQL-es.org
conflicto BD
Vie, 13/07/2012 - 13:38 — AnónimoHola, tenia instalada solo la version 8.2 pero en una actualizacion q se realizo al servidor, se instalo la version 9.1. La aplicacion funciona correctamente, pero cuando intento conectarme remotamente al serv. de BD por pgadmin o por odbc me sale error de conexion o de contrasenha. Detuve el servicio de la V. 9.1, pero despues vuelvo a preguntar por el estado y me responde que esta activa. Como puedo detener esa version o desistalarla sin que me afecte la version 8.2 y q tampoco se dane la BD.
error
Lun, 30/11/2009 - 17:14 — AnónimoCuando mando a inicial los servicio me resulta lo siguiente:
postgres@servidor-desktop:/$ /usr/local/pgsql-8.4/bin/pg_ctl -D /var/pgsql-8.4/data/ -l /var/pgsql-8.4/data/postgresql.log start
server starting
postgres@servidor-desktop:/$ /usr/local/pgsql-8.1/bin/pg_ctl -D /var/pgsql-8.1/data/ -l /var/pgsql-8.1/data/postgresql.log start
pg_ctl: another postmaster may be running; trying to start postmaster anyway
pg_ctl: could not start postmaster
Examine the log output.
y los postgresql.log
8.4
LOG: autovacuum launcher shutting down
LOG: received smart shutdown request
LOG: shutting down
LOG: database system is shut down
LOG: invalid IP mask "trust": Nombre ó servicio desconocido
CONTEXT: line 77 of configuration file "/var/pgsql-8.4/data/pg_hba.conf"
FATAL: could not load pg_hba.conf
LOG: invalid IP mask "trust": Nombre ó servicio desconocido
CONTEXT: line 77 of configuration file "/var/pgsql-8.4/data/pg_hba.conf"
FATAL: could not load pg_hba.conf
8.1
LOG: next transaction ID: 565; next OID: 10794
LOG: next MultiXactId: 1; next MultiXactOffset: 0
LOG: database system is ready
LOG: transaction ID wrap limit is 2147484146, limited by database "postgres"
LOG: invalid IP mask "trust" in file "/var/pgsql-8.1/data/pg_hba.conf" line 74: Nombre ó servicio $
FATAL: missing or erroneous pg_hba.conf file
HINT: See server log for details.
LOG: invalid IP mask "trust" in file "/var/pgsql-8.1/data/pg_hba.conf" line 74: Nombre ó servicio $
FATAL: missing or erroneous pg_hba.conf file
HINT: See server log for details.
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 6744) running in data directory "/var/pgsql-8.1/data"?
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 6744) running in data directory "/var/pgsql-8.1/data"?
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 6744) running in data directory "/var/pgsql-8.1/data"?
Problemas con OID repetido versión 8.1.11
Mar, 02/03/2010 - 13:54 — AnónimoHola, buen día.
Rafael no sé si este es el medio para contactarte pero quisiera saber si alguna vez se te ha presentado problemas de duplicidad de OID en una misma tabla, tenemos una aplicación que corría para la versión 7.3.7 y subimos a la 8.1.11 y en ocaciones se encuentra el caso q te comento.
Que podría esta pasando?
Re: error
Mar, 01/12/2009 - 09:28 — rafaelmaLOG: invalid IP mask "trust": Nombre ó servicio desconocido
CONTEXT: line 77 of configuration file "/var/pgsql-8.4/data/pg_hba.conf"
FATAL: could not load pg_hba.conf
........
LOG: invalid IP mask "trust" in file "/var/pgsql-8.1/data/pg_hba.conf" line 74: Nombre ó servicio $
FATAL: missing or erroneous pg_hba.conf file
........
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 6744) running in data directory "/var/pgsql-8.1/data"?
Bueno, aqui podemos ver porque los ficheros logs son tan importantes de usar y consultar ;-)
Tienes tres fallos:
--
Rafael Martinez
PostgreSQL-es.org
Gracias por tu ayuda ahora
Mié, 25/11/2009 - 12:59 — AnónimoGracias por tu ayuda ahora tengo otra duda al momento de configurar el postgres.conf la dirección IP que voy a utilizar como selecciono la IP puede ser cualquiera? o de acuerdo a que parámetros la tengo que seleccionar?
Dirección IP en postgresql.conf
Mié, 25/11/2009 - 15:52 — rafaelmaLa direccion IP (ó hostname) que defines en postgresql.conf con el parámetro 'listen_addresses' tiene que ser una IP (ó nombre de maquina) que esté instalada en el ordenador que va a ejecutar postgresql. si lo que defines aqui no esta instalado en el ordenador, no te va a funcionar.
Por defecto listen_addresses tiene el valor 'localhost' (ó lo que es lo mismo 127.0.0.1). Si quieres que postgresql este accesible por todas las IPs instaladas en tu máquina puedes usar listen_addresses = '*'. Si defines más de una IP en listen_addresses las tienes que separar con comas.
--
Rafael Martinez
PostgreSQL-es.org