Sirviendo información sobre Linux desde 1998

Introducción a PostgreSQL - Instalación e inicialización

En este artículo vamos a dar una introducción a la base de datos PostgreSQL, tambien veremos como instalarla e inicializarla para empezar a utilizarla.

Introducción

Logo PostgreSQL PostgreSQL es una base de datos relacional, distribuida bajo licencia BSD y con su código fuente disponible libremente. Es el motor de bases de datos de código abierto más potente del momento y en sus últimas versiones empieza a no tener que envidiarle nada a otras bases de datos comerciales.

Sus características técnicas la hacen una de las bases de datos más potentes y robustas del mercado. Su desarrollo comenzo hace más de 15 años, y durante este tiempo, estabilidad, potencia, robustez, facilidad de administración e implementación de estándares han sido las características que más se han tenido en cuenta durante su desarrollo. En los últimos años se han concentrado mucho en la velocidad de proceso y en características demandadas en el mundo empresarial.

La última serie de producción es la 8.2, siendo la última versión disponible en el momento de escribir este artículo la 8.2.4. PostgreSQL se puede ejecutar en la gran mayoria de sistemas operativos existentes en la actualidad, entre ellos Linux y UNIX en todas sus variantes (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64) y Windows. Las características más importantes y soportadas son:

  • Es una base de datos 100% ACID
  • Llaves ajenas (foreign keys)
  • Joins
  • Vistas (views)
  • Disparadores (triggers)
  • Reglas (Rules)
  • Funciones/procedimientos almacenados (stored procedures) en numerosos lenguajes de programacion, entre otros PL/pgSQL (similar al PL/SQL de oracle)
  • Numerosos tipos de datos, posibilidades de definir nuevos tipos
  • Soporta el almacenamiento de objetos binarios grandes (gráficos, videos, sonido, ...)
  • Herencia de tablas (Inheritance)
  • PITR - point in time recovery
  • Tablespaces
  • Replicación asincrona
  • Nested transactions (savepoints)
  • Two-phase commit
  • Copias de seguridad en caliente (Online/hot backups)
  • Unicode
  • Juegos de caracteres internacionales
  • Multi-Version Concurrency Control (MVCC)
  • Acceso encriptado via SSL
  • SQL92/SQL99
  • APIs para programar en C/C++, Java, .Net, Perl, Python, Ruby, Tcl, ODBC, PHP y muchos otros lenguajes.
  • Completa documentacion

Otra caracteristica muy a tener en cuenta es lo bien que PostgreSQL funciona con grandes cantidades de datos y una alta concurrencia, con muchos usuarios accediendo a la vez el sistema. En un futuro escribiremos un artículo sobre esto.

Algunos de los limites físicos de PostgreSQL son:

         Limite	                                     Valor
--------------------------------------------------------------------
Maximo tamaño base de dato               Ilimitado (Depende de tu sistema
                                         de almacenamiento)
Maximo tamaño de tabla                   32 TB
Maximo tamaño de fila                    1.6 TB
Maximo tamaño de campo                   1 GB
Maximo numero de filas por tabla         Ilimitado
Maximo numero de columnas por tabla      250 - 1600 (dependiendo del tipo)
Maximo numero de indices por tabla       Ilimitado
--------------------------------------------------------------------

Podriamos seguir escribiendo sobre muchas más características, pero en este artículo no tienen cabida. Podeis pasaros por la pagina web del proyecto, Postgresql.org para profundizar en el tema ó estar atentos a una serie de artículos sobre PostgreSQL que iremos publicando en el futuro .

A continución pasaremos a describir como podemos instalar e inicizalizar PosgreSQL.

Instalación

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, el motor de base de datos que utilizo 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 y ldap (estos paquetes se pueden instalar de la manera estandard, rpm og deb en la distribucion de Linux que utiliceis).

Para instalar en casa seguramente no necesiteis --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]#

Esto es todo por esta vez. Mucha mas información en los proximos articulos de esta serie.

Fuentes: postgresql.org / wikipedia.