Instalación e inicialización básica de PostgreSQL desde el código fuente

servidor

PostgreSQL está disponible en cualquiera de las principales distribuciones de Linux. Existen paquetes RPM og DEB, que se distribuyen con estas distribuciones y que se pueden instalar de la manera por defecto típica en cada distribución.

Si quereis instalar PostgreSQL de esta manera, adelante, es totalmente valida. A mi particularmente, PostgreSQL me gusta compilarlo e instalarlo yo mismo desde las fuentes. De esta manera tengo control absoluto sobre la versión en uso (especialmente importante en sistemas en producción y bases de datos). El resto del artículo se basa en este tipo de instalación.

Requerimientos

Se necesitan una serie de programas para poder compilar e instalar PostgreSQL (o cualquier otro programa) desde las fuentes. La mayoria de lo que se necesita se suele instalar por defecto en la mayoria de las distribuciones si instalamos los paquetes relacionados con "Desarrollo y compiladores". Todos estos paquetes se pueden instalar de la manera estandard, rpm og deb en la distribucion de Linux que utiliceis, si por causalidad no los teneis instalados.

Necesitamos:

  • GNU make (gmake)
  • Un compilador ISO/ANSI C. GCC el compilador por defecto en Linux funciona perfectamente.
  • tar, gzip o bzip2 para desempaquetar las fuentes.
  • Biblioteca GNU Readline
  • Biblioteca de compresión zlib
  • Perl y python si quereis soportar PL/Perl y PL/Python

Compilación e instalación

Primero nos bajamos las fuentes de la versión que vayamos a instalar de Postgresql.org. En nuestro ejemplo la versión 8.2.4 desde el servidor espejo (mirror) de Noruega.

[user@servidor]# cd /tmp/

[user@servidor]# wget ftp://ftp.no.postgresql.org/pub/databases/postgresql/source/v8.2.4/postg...
--21:17:45--  ftp://ftp.no.postgresql.org/pub/databases/postgresql/source/v8.2.4/postg...
           => `postgresql-8.2.4.tar.bz2'
Resolving ftp.no.postgresql.org... 158.36.2.10
Connecting to ftp.no.postgresql.org|158.36.2.10|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD /pub/databases/postgresql/source/v8.2.4 ... done.
==> PASV ... done.    ==> RETR postgresql-8.2.4.tar.bz2 ... done.
Length: 12,527,803 (12M) (unauthoritative)

100%[===========================================================>] 12,527,803   692.34K/s    ETA 00:00

21:18:02 (700.20 KB/s) - `postgresql-8.2.4.tar.bz2' saved [12527803]

A partir de ahora seguimos trabajamos como usuario root.:

[user@servidor]# su - 

(o sudo -i si estamos en Ubuntu)

Desempaquetamos las fuentes:

[root@servidor]# cd /tmp
[root@servidor]# tar xjvf postgresql-8.2.4.tar.bz2
[root@servidor]# cd postgresql-8.2.4/

Ahora tenemos que configurar y compilar PostgreSQL. Existen muchos parametros que podemos utilizar para configurar las caracteristicas disponibles en el software PostgreSQL que vamos a compilar. Teneis una lista completa sobre estos parametros en la sección 14.5.Installation Procedure de la documentación oficial de PostgreSQL.

Para mis servidores en producción, yo suelo configurar PostgreSQL con estos parametros:

[root@servidor]# ./configure --prefix=/usr/local --enable-nls --with-perl --with-python --with-openssl
--with-pam --with-ldap

Estos parametros necesitan que tengais instalado en vuestro sistema perl, python, openssl (estos paquetes se pueden instalar de la manera estandard, rpm og deb en la distribución de Linux que utiliceis).

Para instalar en casa no necesitais --with-pam --with-ldap, el resto es bueno tenerlo para tener posibilidad de conectar a vuestra base de datos encriptando el trafico de red, y tener posibilidad de utilizar PL/Perl y PL/Python para crear funciones. Mas información en PL/Perl - Perl Procedural Language y PL/Python - Python Procedural Language

Una vez que el proceso de configuración este terminado sin errores, podemos empezar a compilar las fuentes:

[root@servidor]# gmake 

La compilación deberia de terminar sin errores si tenemos instalado todos los paquetes que necesitamos y dependiendo de los parametros de configuración que hayamos definido con ./configure.

Una vez que hayamos terminado de compilar las fuentes, pasamos a instalar todos los programas que forman PostgreSQL:

[root@servidor]# gmake install

Si todo ha salido bien, ahora tendremos todo lo necesario para usar PostgreSQL (servidor, clientes, herramientas, bibliotecas, etc) disponible en nuestro sistema. En nuestro ejemplo todo se habrá instalado bajo /usr/local (como definimos más arriba con --prefix=/usr/local)

Inicialización

Ahora tenemos que inicializar y configurar nuestra instalación de PostgreSQL antes de poder empezar a crear nuetra base de datos.

Lo primero que tenemos que hacer es crear un usuario en el sistema (postgres), que será el dueño en nuestro sistema de los ficheros generados por PostgreSQL, asi como el encargado de ejecutar el motor de base de datos (PostgreSQL se negará a arrancar si intentamos hacerlo como usuario root)

Podeis utilizar vuestro programa preferido para crear nuevos usuarios en vuestra distribución, o ejecutar el siguiente comando:

[root@servidor]# useradd --help
Usage: useradd ...
useradd - create a new user

  -c comment     Set the GECOS field for the new account
 --show-defaults Print default values
 --save-defaults Save modified default values
  -D binddn      Use dn "binddn" to bind to the LDAP directory
  -d homedir     Home directory for the new user
  -e expire      Date on which the new account will be disabled
  -f inactive    Days after a password expires until account is disabled
  -G group,...   List of supplementary groups
  -g gid         Name/number of the users primary group
  -k skeldir     Specify an alternative skel directory
  -m             Create home directory for the new user
  -o             Allow duplicate (non-unique) UID
  -P path        Search passwd, shadow and group file in "path"
  -p password    Encrypted password as returned by crypt(3)
  -u uid         Force the new userid to be the given number
  -r, --system   Create a system account
  -s shell       Name of the user's login shell
 --service srv   Add account to nameservice 'srv'
      --help     Give this help list
      --usage    Give a short usage message
  -v, --version  Print program version
Valid services for --service are: files, ldap

[root@servidor]# useradd -m postgres

Hemos creado nuestro usuario postgres sin clave de acceso. Esto significa que la unica manera de convertirse en este usuario es siendo root y utilizando el comando su - postgres.

A continuación nos conectamos como el usuario postgres e inicializamos nuestro "cluster postgresql".

[root@servidor] mkdir -p /var/pgsql/data
[root@servidor] chown postgres /var/pgsql/data
[root@servidor]# su - postgres

[postgres@servidor]# /usr/local/bin/initdb -E utf8 -U postgres -D /var/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 en_US.UTF-8.

fixing permissions on existing directory /var/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers/max_fsm_pages ... 32MB/204800
creating configuration files ... ok
creating template1 database in /var/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
setting privileges on built-in objects ... ok
creating information schema ... 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/bin/postgres -D /var/pgsql/data
or
    /usr/local/bin/pg_ctl -D /var/pgsql/data -l logfile start

Suponemos que vamos a tener todas nuetras bases de datos y ficheros relacionados con postgresql en el directorio /var/pgsql/data.

En sucesivos artículos, veremos como podemos configurar/organizar nuestros discos de una mejor manera para conseguir la máxima seguridad y velocidad cuando utilicemos PostgreSQL en sistemas de producción. Tambien, veremos como podemos configurar PostgreSQL para sacar el maximo provecho a esta magnifica base de datos.

En estos momentos podemos arrancar nuestra base de datos postgresql y empezar a utilizarla sin problemas.

[postgres@servidor]# /usr/local/bin/pg_ctl -D /var/pgsql/data -l /var/pgsql/data/postgresql.log start

server starting

Si queremos parar PostgreSQL podemos utilizar el siguiente comando:

[postgres@servidor]# /usr/local/bin/pg_ctl -D /var/pgsql/data stop -m fast

waiting for server to shut down.... done
server stopped

Podemos empezar a utilizar la base de datos con el potentisimo cliente por linea de comandos que se instala por defecto, su nombre /usr/local/bin/psql:

[postgres@servidor]# /usr/local/bin/psql 

Welcome to psql 8.2.4, 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=# 

Para conseguir una lista de los principales comandos que podeis utilizar en psql para que podais empezar a disfrutar de PostgreSQL, ejecutar el comando \?:

postgres=# \?

Aqui teneis algunos ejemplos de como utilizar este cliente :

postgres=# \l
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8
(3 rows)

postgres=# CREATE DATABASE test001;
CREATE DATABASE

postgres=# \l
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 postgres  | postgres | UTF8
 template0 | postgres | UTF8
 template1 | postgres | UTF8
 test001   | postgres | UTF8
(4 rows)

postgres=# \c test001 
You are now connected to database "test001".

test001=# CREATE TABLE testing(
id INTEGER NOT NULL,
name TEXT NOT NULL,
PRIMARY KEY (id));

NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "testing_pkey" for table "testing"
CREATE TABLE

test001=# \d
          List of relations
 Schema |  Name   | Type  |  Owner   
--------+---------+-------+----------
 public | testing | table | postgres
(1 row)

test001=# \q

[postgres@servidor]#

Fuentes: postgresql.org / wikipedia.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

excelente manual

por cierto excelente material gracias,solamente una duda:logre instalar el postgresql con las instrucciones que diste, si quisiera que postgresql arrancara al iniciar la computadora, como se lograria?.

De antemano gracias por las respuesta

Imagen de rafaelma

arranque de postgresql

Hola

La manera de arrancar PostgreSQL automaticamente dependerá de la distribución de Linux que uses. Te dejo un ejemplo de un simple shell script que se puede utilizar para un arranque automático.

Crea un fichero llamado /etc/init.d/postgresql con este contenido:

#! /bin/sh
#

## EDIT FROM HERE

# Installation prefix
prefix=/usr/local

# Data directory
PGDATA="/var/pgsql/data"

# Log directory
PGLOGS="/var/pgsql/logs"

# Who to run the postmaster as, usually "postgres".  (NOT "root")
PGUSER=postgres

# Where to keep a log file
PGLOG="$PGLOGS/serverlog-`/bin/date +%Y-%m-%d`.log"

## STOP EDITING HERE

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

PGCTL="$prefix/bin/pg_ctl"

set -e

# Only start if we can find the postmaster.
test -x $PGCTL || exit 0

# Parse command line parameters.
case $1 in
  start)
	echo -n "Starting PostgreSQL: "
	su - $PGUSER -c "$PGCTL start -D '$PGDATA' -s -l $PGLOG" 
	echo "ok"
	;;
  stop)
	echo -n "Stopping PostgreSQL: "
	su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast"
	echo "ok"
	;;
  restart)
	echo -n "Restarting PostgreSQL: "
	su - $PGUSER -c "$PGCTL restart -D '$PGDATA' -s -m fast -w"
     	echo "ok"
	;;
  reload)
        echo -n "Reload PostgreSQL: "
        su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
        echo "ok"
        ;;
  status)
	su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
	;;
  *)
	# Print help
	echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
	exit 1
	;;
esac

exit 0

Dale permisos de ejecución:

root@server:~# chmod a+x /etc/init.d/postgresql

Y dile al sistema que ejecute este script cuando arranque. Esto dependerá de la distribución de linux que uses.

Con redhat, fedora, etc, puedes utilizar:

root@server:~# chkconfig --add postgresql

Con debian, ubuntu, etc puedes probar con:

root@server:~# update-rc.d postgresql defaults

Tambien puedes utilizar este script manualmente para arrancar/parar postgreSQL

root@server:~# /etc/init.d/postgresql start
root@server:~# /etc/init.d/postgresql stop

Suerte

archivos log

Estoy peliando con la configuracion de Postgresql 8.3 y nose como configurarlo para activar los arvhivos log. Alguna sugerencia?. cualquier ayuda me viene al pelo. Muchas gracias.-

Como saber el estatus de postgres?

Hola como hago para saber el estatus de mi servicio postgres?

yo siempre ejecuto el sudo /etc/init.db/postgres-8.3 status

pero ahora como instale en otro servidor de acuerdo al manual no se que comando ejecutar....

arranque en modo grafico

como hago para arrancar postgressql en modo gráfico

Gracias
lizandro

INSTALE MAL POSTGRES....

Hola como están? instale mi postgres pero se me paso instalarlo para que soporte python... estoy ejecutando de nuevo todos los pasos para la instalacion:

./configure --prefix=/usr/local --enable-nls --with-perl --with-python --with-openssl
--with-pam --with-ldap

luego gmake pero me da el siguiente error:

gmake -C ../../../src/interfaces/libpq all
gmake[4]: se ingresa al directorio `/opt/postgresql-8.4.1/src/interfaces/libpq'
gmake[4]: No se hace nada para `all'.
gmake[4]: se sale del directorio `/opt/postgresql-8.4.1/src/interfaces/libpq'
gmake -C ../../../src/port all
gmake[4]: se ingresa al directorio `/opt/postgresql-8.4.1/src/port'
gmake[4]: No se hace nada para `all'.
gmake[4]: se sale del directorio `/opt/postgresql-8.4.1/src/port'
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -DDEF_PGPORT=5432 -I../../../src/interfaces/libpq -I../../../src/include -D_GNU_SOURCE -c -o pg_ctl.o pg_ctl.c
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv pg_ctl.o -L../../../src/port -lpgport -L../../../src/interfaces/libpq -lpq -L../../../src/port -Wl,-rpath,'/usr/local/lib' -lpgport -lssl -lcrypto -lz -lreadline -ltermcap -lcrypt -ldl -lm -o pg_ctl
../../../src/interfaces/libpq/libpq.so: undefined reference to `libpq_gettext'
collect2: ld devolvió el estado de salida 1
gmake[3]: *** [pg_ctl] Error 1
gmake[3]: se sale del directorio `/opt/postgresql-8.4.1/src/bin/pg_ctl'
gmake[2]: *** [all] Error 2
gmake[2]: se sale del directorio `/opt/postgresql-8.4.1/src/bin'
gmake[1]: *** [all] Error 2
gmake[1]: se sale del directorio `/opt/postgresql-8.4.1/src'
gmake: *** [all] Error 2

no se que pueda ser... no se si tenga que eliminar antes el postgres que habia instalado pero como? porfavor agradeceria su ayuda.

archivos log

archivos wal?...mmm..nose a que te referis con eso..estoy leyendo de todo pero no logro hacer que funcione

gmake no funciona

hola por lo que estuve viendo gmake es un compilador que no logro hacer funcionar, hice todas las combinaciones posibles tanto de instalacion como de uso y en ningun caso consegui hacer la instalacion desde el codigo

estoy usando ubuntu server 10.04 LTS (lucid)

algun consejo que me puedas dar?

Gracias
Ariel

Gracias

Muy amable, un gran articulo para mi, Saludos.

Inicio automatico de postgres

hola q tal tengo problemas al iniciar automaticamente postgres, pues solo se inicia si entro como root y despues como usuario postgres y pego esto : /etc/init.d/postgresql start

agradeceria cualquier ayuda