English Version

jueves, 9 de diciembre de 2010

Cómo instalar PostgreSQL en linux desde el código fuente

En este post veremos cómo instalar PostgreSQL desde el código fuente y como configurarlo para un entorno de desarrollo. Aquí no se contempla la configuración de PostgreSQL para entornos de producción.

Para instalar postgresql desde el código fuente en linux (Opensuse en el ejemplo) seguiremos estos pasos:

INSTALACIÓN

1.- Elegir la versión del código fuente que queremos descargar desde aquí.

2.- En mi caso descargaré la versión 9.0.1 desde aquí

3.- Descomprimimos el archivo que hayamos descargado, en mi caso postgresql-9.0.1.tar.bz2

4.- Abrimos el archivo INSTALL y allí veremos una sección llamada “Short Version”. Seguiremos los pasos que aparecen en esta sección:

./configure
gmake (gmake world - esto instalará también la documentación HTML y las páginas man)
su
gmake install
adduser postgres (useradd postgres)
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test


5.- De los anteriores comandos explicaremos ahora algunos de ellos como describe la propia documentación de PostgreSQL.:

adduser postgres (useradd postgres en Opensuse)

- Crea una cuenta de usuario para el servidor PostgreSQL. Este será el usuario con el que levantaremos el servidor. Para usos en entornos de producción se debería crear una cuenta separada sin privilegios (“postgres” es la comunmente usada)

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

- Este comando crea una instalación de la base de datos mediante el comando “initdb”. Para ejecutar el comando “initdb” debes estar logueado con tu cuenta del servidor PostgreSQL.
(Esto es lo que hemos realizado mediante el comando su - postgres). No funcionará hacerlo como root.

- La opción -D especifica la localización donde los datos serán almacenados. Puedes usar el path que elijas, no tiene por qué estar bajo el path de la instalación. Solamente deberás asegurarte que la cuenta del servidor pueda escribir en el directorio antes de iniciar el comando “initdb”, como se ilustra anteriormente.

- En este punto si no has usado el comando “initdb” con la opción -A, deberías querer modificar el archivo “pg_hba.conf” para controlar el acceso local al servidor antes de levantar la instancia del servidor. Por defecto esta fijado para confiar en todos los usuarios locales.

- El comando anterior “inidb” debe haberte dicho como levantar el servidor de la base de datos
(podemos ver un ejemplo en el siguiente recuadro), así que eso será lo que hagamos a continuación.


/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale es_ES.UTF-8.
The default database encoding has accordingly been set to UTF8.
The default text search configuration will be set to "spanish".

fixing permissions on existing directory /usr/local/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /usr/local/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

   /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
or
   /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start



/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &

- Con el comando /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data levantariamos la base de datos en modo foreground, para hacerlo en modo background lo ejecutamos de la forma anterior resaltada en negrita.

- El significado de ">logfile 2>&1 &" es el siguiente:

- Con ">logfile" redireccionamos la salida estándar al fichero logfile
- Con "2>&1" enviamos la salida stderr a donde se está enviando la salida estándar stdout. Para más información podemos consultar aquí.
- Con el último "&" indicamos al shell que ejecute el comando en background.

- Así, si ahora nos vamos a la siguiente ruta /var/lib/pgsql que es la asignada cuando nos identificamos con el usuario postgres podemos ver que existe el archivo logfile que hemos creado al levantar el servidor.

- Para parar el servidor de la base de datos podemos ejecutar el siguiente comando:

kill `cat /usr/local/pgsql/data/postmaster.pid`

/usr/local/pgsql/bin/createdb test

- Este comando crea la base de datos test.

/usr/local/pgsql/bin/psql test

- Con este comando nos conectamos la base de datos test que acabamos de crear donde nos debería aparecer algo similar a lo del siguiente recuadro:


postgres@linux-opensuse:~> /usr/local/pgsql/bin/psql test
psql (9.0.1)
Type "help" for help.

test=#               


6.- Una vez instalada la base de datos lo que haremos será incluir el path de la instalación en la variable PATH para poder ejecutar el comando en cualquier ubicación. Esto podremos hacerlo de dos formas diferentes, para que sea accesible sólo por nuestro usuario mediante el archivo ~/.bash_profile, o bien para que sea accesible a cualquier usuario del sistema mediante el archivo /etc/profile

En nuestro ejemplo lo haremos accesible para cualquier usuario de la siguiente forma

a) Si seguimos identificados como el usuario postgres ejecutaremos el comando exit.

postgres@#> exit

b) Si al realizar esto ya estamos identificados como root seguiremos así si no, ejecutarmeos el comando su para identificarnos como root. Una vez que estemos identificados como root editaremos el archivo /etc/profile con cualquier editor, en nuestro ejemplo ejecutaremos el siguiente comando:

root@#> nano /etc/profile

c) Una vez dentro del archivo nos situaremos al final del mismo e introduciremos las siguientes dos lineas, guardaremos y saldremos.

PATH=/usr/local/pgsql/bin:$PATH
export PATH

En mi caso en Opensuse quedaría como refleja el recuadro


PATH=/usr/local/pgsql/bin:$PATH
export PATH

#
# End of /etc/profile
#


d) Para permitir que el sistema encuentre la documentación de ayuda del comando man también incluiremos en el archivo las siguientes dos lineas:

MANPATH=/usr/local/pgsql/share/man:$MANPATH
export MANPATH

En mi caso las últimas líneas del archivo /etc/profile quedaría de la siguiente forma


PATH=/usr/local/pgsql/bin:$PATH
export PATH

MANPATH=/usr/local/pgsql/share/man:$MANPATH
export MANPATH

#
# End of /etc/profile
#



Una vez hecho esto recargaremos nuestro archivo profile escribiendo el siguiente comando:

root@#> source /etc/profile


Si no has instalado la documentación y quieres hacerlo a posteriori deberas compilar de nuevo con la opción “gmake world”  y ejecutar en la línea de comandos el siguiente comando como root “gmake install-docs”


Si ahora ejecutamos el comando “man psql” deberemos poder ver la página del manual.

7.- Una vez hecho todo esto sé lo que muchos estaréis pensando ¿por qué no habré instalado yo esto desde el paquete de mi distribución? ¿Por qué elijiría yo la pastilla roja? en fin, podemos consolarnos con las palabras de Yoda, el reverso tenebroso no es más poderoso, sólo más rápido, más fácil y más seductor, así que paciencia ya queda menos en nuestro camino hacía la luz. Ahora en serio, lo siguiente que es posible que queramos hacer será levantar PostgreSQL como un servicio más. Pues bien, para esto volveremos a la carpeta de la descarga donde descomprimimos nuestra versión de PostgreSQL y dentro de la carpeta navegaremos hasta la siguiente ubicación:

#postgresql-9.0.1> cd contrib/start-scripts>

En este path encontraremos varios archivos para varios sistemas operativos. En nuestro caso nos interesa el script “linux” .

Si hemos instalado nuestro postgresql de manera estándar en las ubicaciones por defecto y el usuario por defecto, no necesitaremos editar este archivo. Si por el contrario hemos instalado postgresql en otra ubicación diferente o con otro usuario deberemos modificar algunas variables como por ejemplo PGDATA, PGUSER, o PGCTL. del script con algún editor de texto.

En nuestro caso al haber hecho la instalación por defecto continuaremos con los siguientes pasos:

a) Haremos una copia del archivo linux renombrándolo a postgresql

#start-scripts> cp linux postgresql

b) Moveremos como superusuario el nuevo archivo renombrado como postgresql al path /etc/init.d/

#start-scripts> sudo mv postgresql /etc/init.d/

c) Es posible que necesitemos cambiar el propietario del archivo y asignarle permisos de ejecución:

#start-scripts> su
Contraseña: xxxxx

root#> cd /etc/init.d/
root#init.d> chown root:root postgresql
root#init.d> chmod 755 postgresql

Para probar su funcionamiento podemos ejecutar los siguientes comandos como root:

root#init.d>./postgresql status
root#init.d>./postgresql start
root#init.d>./postgresql status
root#init.d>./postgresql stop
root#init.d>./postgresql status

también podremos comprobarlo al identificarnos como el usuario postgres

root#init.d> su - postgres
postgres#> /etc/init.d/postgresql start
Starting PostgreSQL:  

Si obsrevamos que se queda aquí y no llega a mostrar el “ok” esperado puede ser que al igual que a mi, esté esperando la contraseña del usario postgres, podéis comprobar esto mirando el archivo de log /usr/local/pgsql/data/serverlog así que tecleamos la contraseña que hayamos asignado al usuario postgres y voilà:

Starting PostgreSQL: ok

En Opensuse si queremos tener la posibidad de controlar el servicio desde el “Centro del Control Yast2” -> Sistema -> “Servicios del Sistema” podremos hacerlo mediante el siguiente comando:

root#> chkconfig --add /etc/init.d/postgresql

Es posible que al ejecutar el comando nos muestre un error similar al siguiente:

insserv: warning: script 'postgresql' missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `postgresql'
insserv: Script jexec is broken: incomplete LSB comment.
insserv: missing `Required-Stop:'  entry: please add even if empty.
insserv: There is a loop between service apache and postgresql if stopped
insserv:  loop involving service postgresql at depth 2
insserv:  loop involving service apache at depth 1
insserv:  loop involving service named at depth 4
insserv: exiting without changing boot order!
/sbin/insserv failed, exit code 1

Para solucionarlo deberemos introducir las siguientes lineas al inicio dle archivo postgressql
justo después de la línea ## EDIT FROM HERE

### BEGIN INIT INFO
# Provides:       postgresql
# Required-Start: $network $remote_fs
# Required-Stop: $network $remote_fs
# Default-Start:  3 5
# Default-Stop:   
# Description:    Start the PostgreSQL master daemon
### END INIT INFO

Una vez hecho esto si volvemos a ejecutar el archivo chkconfig debería solucionar el problema y nos debería poder gestionar el servicio desde Yast2

Podemos encontrar más información del total de la instalación aquí.

CONFIGURACIÓN INICIAL

Una vez instalada la base de datos veamos a continuación los archivos de configuración  inicial y cómo configurarlos para poder conectarnos desde un programa cliente como pgAdmin o phpPgAdmin. Recuerdo que la configuración aquí indicada es para entornos de desarrollo, no para entornos de producción.

1.- Nos situamos en /usr/local/pgsql/share

#> cd /usr/local/pgsql/share

2.- Creamos nuestro archivo de configuración pg_hba.conf a partir del suministrado como ejemplo.

#> cp pg_hba.conf.sample pg_hba.conf

3.- Editamos el archivo de tal forma que quede de forma similar al del siguiente recuadro::

#> nano pg_hba.conf


# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD

@remove-line-for-nolocal@# "local" is for Unix domain socket connections only
@remove-line-for-nolocal@local   all             all                                     @authmethod@
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 @authmethod@




4.- Creamos nuestro archivo de configuración postgresql.conf a partir del suministrado como ejemplo.

#> cp postgresql.conf.sample postgresql.conf

5.- Editamos el archivo quedando las opciones modificadas de la forma mostrada en los siguientes recuadros:

#> nano postgresql.conf


#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------

# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.

data_directory = '/usr/local/pgsql/data'                # use data in another directory
                                       # (change requires restart)
hba_file = '/usr/local/pgsql/data/pg_hba.conf'  # host-based authentication file
                                       # (change requires restart)
ident_file = '/usr/local/pgsql/data/pg_ident.conf'      # ident configuration file
                                       # (change requires restart)




#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -

listen_addresses = 'localhost'          # what IP address(es) to listen on;
                                       # comma-separated list of addresses;
                                       # defaults to 'localhost', '*' = all
                                       # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)

ssl = true                              # (change requires restart)




#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------

# - Memory -

shared_buffers = 32MB                   # min 128kB




6.- Una vez guardados los archivos reiniciamos el servicio de postgresql:

root#> /etc/init.d/postgresql restart

7.- Una vez reiniciado podemos comprobar que podemos conectarnos desde algún programa cliente como por ejemplo pgAdmin3 o phpPgAdmin.


En las últimas versiones de phpPgAdmin no se puede identificar con usuario postgres a menos que se modifique su configuración, así que deberemos crear un nuevo usuario para poder probar la conexión.



Para los usuarios de Opensuse si habéis instalado la aplicación pgAdmin3 1.12.1  instalable para x_64 desde el repositorio es probable que obtengáis el siguiente error al intentar conectaros al servidor después de haber introducido los datos de la conexión cerrándose el programa:

pgadmin3: symbol lookup error: pgadmin3: undefined symbol: PQconninfoParse

Parece ser un bug de esta versión no resuelto todavía así que como solución podéis bajar de aquí la versión i586 e instalarla. Esto debería funcionar y permitiros conectaros al servidor con el usuario postgres.


Si queréis podéis profundizar más sobre la configuración del servidor aquí, y para la configuración de la autentificación de clientes aquí.

Y eso es todo por el momento.

Saludos.

1 comentario:

  1. Echa un vistazo a una herramienta gratuita – Valentina Studio. Producto asombroso! OMI es el mejor gestor de postgresql, para todas las plataformas. http://www.valentina-db.com/en/valentina-studio-overview

    ResponderEliminar