Este artículo explica detalladamente cómo instalar un servidor de bases de datos PostgreSQL en sistemas FreeBSD, y cómo inicializar una instancia.

Instalación de PostgreSQL

Un aspecto importante que diferencia a FreeBSD de los sistemas GNU/Linux, es la capacidad de disponer, en su colección de ports, de diferentes versiones (actualizadas) de un mismo paquete. Por ejemplo, en la rama 10 de FreeBSD se encuentran disponibles (y actualizadas) las versiones "9.0", "9.1", "9.2", "9.3" y "9.4" del servidor de bases de datos Postgres:

emi@hal9000:~ % pkg search postgresql | grep "\-server"
postgresql90-server-9.0.22_1   The most advanced open-source database available anywhere
postgresql91-server-9.1.18_1   The most advanced open-source database available anywhere
postgresql92-server-9.2.13_1   The most advanced open-source database available anywhere
postgresql93-server-9.3.9_1    The most advanced open-source database available anywhere
postgresql94-server-9.4.4_1    The most advanced open-source database available anywhere

Esto otorga la flexibilidad de instalar la versión más compatible con nuestras aplicaciones, sin necesidad de tener que compilar (y mantener actualizada manualmente) una versión anterior, o quedar atado a una versión previa del sistema operativo. Sin dudas una grandísima ventaja frente a la mayoría de los sistemas GNU/Linux (por ejemplo Red Hat o Debian), donde en los repositorios oficiales de cada versión del sistema operativo, se mantiene actualizada una única versión de cada paquete.

Esto también significa que se debe elegir una versión al momento de instalar, seguramente responsabilidad del DBA o desarrollador de Software, aunque de no estar seguro, en general basta con instalar la última versión disponible.

El último número en el nombre del paquete indica la versión exacta disponible actualmente. Por ejemplo, la última versión del paquete postgresql94-server disponible es la 9.4.4_1.

Para instalar entonces el servidor de bases de datos PostgreSQL 9.4, ejecutar:

# pkg install postgresql94-server

Durante la instalación, el gestor de paquetes pkg descarga, extrae e instalar el paquete, y además crea el usuario y grupo "pgsql":

[1/2] Installing postgresql94-client-9.4.4...
[1/2] Extracting postgresql94-client-9.4.4: 100%
[2/2] Installing postgresql94-server-9.4.4_1...
===> Creating users and/or groups.
Creating group 'pgsql' with gid '70'.
Creating user 'pgsql' with uid '70'.

Por defecto, el port está configurado para utilizar autovacuum de las nuevas bases de datos.

A fin de proveer aislación (una de las propiedades ACID), Postgres utiliza un modelo de control de concurrencia a través de multiversionado. Esto significa que se mantienen múltiples versiones de un mismo dato, cada vez que el mismo es modificado. Otros sistemas de bases de datos, como Oracle, utilizan un registro de transacciones (undo log) para deshacer cambios en caso de fallo. Postgres no utiliza un undo log, en lugar de esto mantiene múltiples versiones del dato en las tablas. Esto significa que hay mucha menor sobrecarga cuando se hacen updates, al costo de tener que eliminar periódicamente las viejas versiones de los datos. Esto es lo que hace vacuum, para mantener a las bases de datos "limpias".

En caso de necesitar ejecutar manualmente un vacuum o una copia de respaldo, existe un script periódico que puede ser útil en /usr/local/etc/periodic/daily/502.pgsql. Este script a su vez permite hacer backups y ejecutar vacuum sobre todas las bases de datos durante la noche.

Configuración del servidor PostgreSQL

Antes de inicializar una instancia de bases de datos, es necesario configurar el locale creando una clase en el archivo /etc/login.conf:

# nano /etc/login.conf

Agregar las siguientes líneas:

postgres:\
        :lang=es_ES.UTF-8:\
        :setenv=LC_COLLATE=es_ES.UTF-8:\
        :tc=default:

Ejecutar cap_mkdb /etc/login.conf para reconstruir la base de datos de capacidades:

# cap_mkdb /etc/login.conf

Y asignar la clase "postgres" al usuario "pgsql" utilizando el comando pw. Se observa que inicialmente el usuario "pgsql" no tiene una clase asociada:

# pw user show pgsql
pgsql:*:70:70::0:0:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh

Ejecutar el siguiente comando para asociar la clase "postgres" al usuario "pgsql":

# pw user mod pgsql -L postgres

Verificar el cambio ejecutando nuevamente pw user show:

# pw user show pgsql
pgsql:*:70:70:postgres:0:0:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh

Al iniciar una sesión como "pgsql" el locale está correctamente configurado:

# su - pgsql
$ locale
LANG=es_ES.UTF-8
LC_CTYPE="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_ALL=

Luego es necesario configurar PostgreSQL para que inicie automáticamente, agregando postgresql_enable="YES" en el archivo /etc/rc.conf:

# nano /etc/rc.conf

Además es necesario configurar el directorio de trabajo de PostgreSQL, los flags para el inicio, los flags para initdb y la clase para PostgreSQL creada anteriormente:

postgresql_enable="YES"
postgresql_data="/zdata/postgres"
postgresql_flags="-w -s -m fast"
postgresql_initdb_flags="--encoding=utf-8 --lc-collate=es_ES.UTF-8"
postgresql_class="postgres"
postgresql_profiles=""

Creación de una instancia fresca

Para crear una instancia (cluster) de PostgreSQL (directorio de datos fresco) en el directorio especificado a través de la variable postgresql_data (dentro del archivo /etc/rc.conf), ejecutar el siguiente comando:

# /usr/local/etc/rc.d/postgresql initdb

Este comando crea los directorios de trabajo donde se alojarán los datos pertenecientes a las bases de datos administradas por la instancia. A su vez crea los templates y la base de datos "postgres", donde se almacenan datos de usuarios, privilegios y herramientas.

Luego es posible iniciar el servidor:

# service postgresql start

Creación de un usuario

Si se requiere crear un usuario con privilegios de administrador o superusuario, ejecutar los siguientes comandos.

Iniciar una sesión como "pgsql":

# su - pgsql

Iniciar el cliente psql y conectarse a la base de datos "postgres":

$ psql postgres

Crear el usuario "pepe", con contraseña "1234", ejecutando:

postgres=# create user pepe encrypted password '1234';

Es posible que se requiera otorgar el rol de superusuario temporalmente, particularmente en los casos donde una aplicación necesita instalar una base de datos.

Otorgar rol de superusuario mediante la consulta:

postgres=# alter user pepe superuser;

Cerrar el cliente ejecutando \q:

postgres-# \q

Luego es posible quitar el rol de superusuario ejecutando la consulta alter user pepe nosuperuser;.

Notas adicionales

La versión de PostgreSQL de FreeBSD registra los eventos de log por defecto en syslog.

Si el servidor posee muchas tablas y muchos clientes, se debe considerar aumentar el valor de la variable kern.maxfiles utilizando el comando sysctl, o reconfigurar el kernel apropiadamente.

Si el directorio de datos de PostgreSQL está ubicado dentro de un sistema de archivos ZFS, es recomendable configurar el dataset adecuadamente para mejorar el rendimiento y optimizar su uso.

Enlaces

Introduction to VACUUM, ANALYZE, EXPLAIN, and COUNT


Tal vez pueda interesarte


Compartí este artículo