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

Imagen de jrockgonzalez

localizacion de Postgresql en Ubuntu

Hola Rafaelma.
Soy nuevo en esta servidor y muy interesado en el mismo.
Instalé Ubuntu Server 12.10, hice los update y los upgrade.
Leyendo tus indicaciones y siguiéndolos en mi servidor, me muchos errores de Orden no encontrada y es que creo que la ruta de los archivos no es la misma que yo tengo.
Instalé Postgresql desde una interfáz gráfica explicada en el seguiente link:
http://www.postgresql.org.es/node/361
Creo que esa instalación fue hecha en ubuntu estación de trabajo, yo como te dije instalé ubuntu server. Según ese tutorial y se puede ver en los gráficos, el instala Postgresql en una carpeta titulada OPT, es decir, dentro de esa carpeta crea su arbol de carpetas. Entonces ya no coincide con las rutas que tu publicas.
Esta instalación no instala archivos de inicialización pero, trae archivos predefinidos de ejemplo para que uno los use.
Cree una carpeta titulada main y dentro de ella grabe el archivo postgresql.conf con los cambios que tu indicas, pero cuando quiero reiniciar el postgresql, me da error porque creo que las rutas no son las mismas y no logro ubicar la aplicación postgresql para reiniciarla. Hasta allí llegué.
Gracias por lo que me puedas aportar

configuracion con errores

buenas ...

Pues en mi caso soy nuevo es este ambiente en postgres y en la Universidad tenemos un proyecto he estado tomando notas de los articulos que acá se presentan...

Ya isntalé en modo grafico postgres ahora lo quiero hacer siguiendo este tutorial, pero al momento de configurar luego de .configure termina con error:

checking for library containing shmget... none required
checking for -lreadline... no
checking for -ledit... no
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.

a al hacer gmake me dá este otro:

You need to run the 'configure' program first. See the file
'INSTALL' for installation instructions.
gmake: *** [all] Error 1

que puedo hacer para solucionar esto???

Por favor ayudenme =)

Imagen de rafaelma

Re: configuracion con errores

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.

Supongo que estas en un sistema Linux. ¿qué distribución/versión estas usando?

Tu problema es que no tienes las bibliotecas readline instaladas. Necesitaras instalar estas bibliotecas para que al compilar postgreSQL, el programa configure te encuentre readline.

Podrias compilar PostgreSQL sin usar las bibliotecas readline usando el parametro --without-readline con configure, pero esto yo no te lo aconsejo. Instala readline y ejecuta configure de nuevo antes de ejecutar gmake

En sistemas que usen RPM, deberias de poder instalar estas bibliotecas con algo parecido a:

yum install readline readline-dev

En sistemas que usen DEB, deberias de poder instalar estas bibliotecas con algo parecido a:

apt-get install libreadline libreadline-dev

--
Rafael Martinez
Webmaster

Gracias por la informacion

Gracias por la informacion Rafael, estoy usando mandriva powerpack 2009 spring y si he estado leyendo sobre --without-readline y nadie recomienda eso .... hasta en la info oficial XD

Vere si puedo instalar las bibliotecas....

Nuevamente gracias =)

Aún sin instalar readline

hola nuevamente Rafael, pues sigo sin poder instalar las bibliotecas readline, probe con las lineas e codigo pero en mandriva no funcionan.

La verdad me estoy frustrando con esto del readline =(. No sé si me puedes ayudar con alguna otra altrnativa...

Ya verifique con un comando (que no recuerdo cual fué) y me dice que tengo instalado esas bibliotecas con versiones superiores a las minimas que pide para poder instalarlo.

Por favor puedes ayudarme en esto???

Gracias por todo.

Al fin sin problemas al hacer ./configure

O_o bueno al final de star en esta lucha logré la instalacion de las librerias, descargue unos rpm y no funcionaron hasta que actualice Mandriva (con mi conexion un tanto decadente) pare buen rato esperando y al final por alli estaba un paquete especial de readline actualizado para mancriva.... se instalo y no tube problemas.

Yo tengo el mismo problema

Hola yo tengo el mismo problema

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.

estoy utilizando ubuntu instale las librerías y nada.... si me podrían ayudar

Imagen de rafaelma

Problemas con readline

¿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