SafeChildren Banner

Havoc Oracle Solaris Experts

martes, 6 de octubre de 2009

Instalar PostgreSQL en Solaris 10 - Parte 1

Introducción
Postgres es una gran base de datos, y como sucede con Oracle, un poco peculiar. Sin embargo, la instalación no es muy complicada asi que vamos a ver cómo podemos Instalar Postgres sobre Solaris 10

UPDATED: Si quieres puedes ir a Cómo Instalar PostgreSQL 9.x en OpenIndiana, un post más actualizado sobre el proceso de instalación en el nuevo sistema operativo sucesor de OpenSolaris

Nota Sobre Solaris 10 y usuario Postgres
En Solaris 10 ya existe una instalación de Postgres en el sistema, y por lo tanto el usuario postgres está creado. Éste utiliza pfexec (el sudo de Solaris) y aunque es muy útil, en nuestro caso puede complicar un poco la instalación, así que he decidido eliminarlo y crearlo desde cero, pero es por un tema de simplificación del post

Creación del Usuario postgres
Como hemos comentado, en Solaris 10, existe un usuario y grupo llamado postgres así que primero eliminaremos el usuario y lo crearemos de forma normal
# userdel postgres
# useradd -g postgres -s /bin/bash -d /export/home/postgres -m postgres
# passwd postgres
Nueva contraseña:
Vuelva a escribir la nueva contraseña:
passwd: la contraseña se ha cambiado para postgres satisfactoriamente
Creación del project
Como en Oracle, es necesario definir las dimensiones de max-shm-memory y max-sem-ids, max-shm-ids en un project (Los valores de max-shm-memory puedes ajustarlos a tu necesidad)

# projadd -c "Postgres Database" -G postgres group.postgres
# projmod -sK "process.max-sem-nsems=(priv,256,deny)" group.postgres
# projmod -sK "project.max-sem-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-memory=(priv,8G,deny)" group.postgres
Preparación del Profile
Una vez creado el nuevo usuario, vamos a crear un profile (al estilo de Oracle) para que nos precarge las diferentes variables de entorno. En postgres la variable PGDATA
es la que indica dónde se encuentran los archivos de datos (datafiles) en nuestro caso en /var/postgres/8.4/data y aunque no es necesario, voy a utilizar POSTGRES_HOME para la ruta de instalación. En nuestro caso, vamos a instalar Postgres en 64bits en la ruta /u01/app/postgres/8.4/db

Ahora crearemos la estructura de directorios para nuestra instalación de Postgres, es decir, /u01/app/postgres/8.4/db para el motor y /var/postgres/8.4/data para los datos (Estas son mis configuraciones, puedes cambiarlas si no te gustan, pero recuerda que en el profile utilizo $LOGNAME para las instalaciones, en mi caso postgres)

# mkdir -p /u01/app/postgres/8.4/db
# chown -R postgres:postgres /u01/app/postgres
# chmod 750 /u01/app/postgres
# mkdir -p /var/postgres/8.4/data
# chown -R postgres:postgres /var/postgres
# chmod 750 /var/postgres
# mkdir -p /var/log/postgres
# chown -R postgres:postgres /var/log/postgres
Y Creamos en archivo .profile del usuario postgres

# su - postgres
$ vi $HOME/.profile

#!/bin/bash
#####################################
## POSTGRES PROFILE LIKE ORACLE ONE
#####################################

# Postgres Type(32bits/64bits)
POSTGRES_ARCH=64
POSTGRES_VERSION=8.4
POSTGRES_HOME=/u01/app/${LOGNAME}/${POSTGRES_VERSION}/db
export POSTGRES_HOME POSTGRES_VERSION

# Path
if [ $POSTGRES_ARCH -eq 32 ]; then
PATH=${POSTGRES_HOME}/bin:$PATH:/usr/sfw/bin:/usr/local/bin
else
PATH=${POSTGRES_HOME}/bin/64:${POSTGRES_HOME}/bin:$PATH:/usr/sfw/bin:/usr/local/bin
fi
export PATH

# PreLoad LD

# PGDATA
PGDATA_32=/var/postgres/${POSTGRES_VERSION}/data
PGDATA_64=/var/postgres/${POSTGRES_VERSION}/data

if [ $POSTGRES_ARCH -eq 32 ]; then
PGDATA=${PGDATA_32}
else
PGDATA=${PGDATA_64}
fi

export PGDATA

# Simple Log
banner postgres
echo ""
echo ""
echo "POSTGRES VERSION: ${POSTGRES_VERSION}"
echo "POSTGRES HOME : ${POSTGRES_HOME}"
echo "PGDATA : ${PGDATA}"
echo "PGARCH : ${POSTGRES_ARCH}"
echo ""
# Mail
MAIL=/usr/mail/${LOGNAME:?}

:wq
Instalación de Postgres
Podemos obtener los binarios compilados para Solaris en la página principal de Postgres http://www.postgresql.org/download/, yo voy a descargarlos para Solaris SPARC en 32 y 64bits.
# su - postgres
Sun Microsystems Inc. SunOS 5.10 Generic January 2005


POSTGRES VERSION: 8.4
POSTGRES HOME : /u01/app/postgres/8.4/db
PGDATA : /var/postgres/8.4/data
PGARCH : 64

$ mkdir postgres-bin
$ cd postgres-bin/
$ wget http://wwwmaster.postgresql.org/redir/376/h/binary/v8.4.1/solaris/solaris10/sparc/postgresql-8.4.1-S10.sparc-32.tar.bz2
$ wget http://wwwmaster.postgresql.org/redir/376/h/binary/v8.4.1/solaris/solaris10/sparc/postgresql-8.4.1-S10.sparc-64.tar.bz2
$ ls -ltr
total 35184
-rw-r--r-- 1 postgres postgres 8842332 sep 8 13:58 postgresql-8.4.1-S10.sparc-32.tar.bz2
-rw-r--r-- 1 postgres postgres 9149287 sep 8 13:58 postgresql-8.4.1-S10.sparc-64.tar.bz2
Descomprimimos los bz2 utilizando GNU tar (gtar) que se encuentra en /usr/sfw/bin, si no tenemos GNU tar, siempre podemos utilizar bunzip2 y tar
$ gtar jxpf postgresql-8.4.1-S10.sparc-32.tar.bz2
$ gtar jxpf postgresql-8.4.1-S10.sparc-64.tar.bz2
Movemos los binarios de postgres a nuestro POSTGRES_HOME

$ pwd
/export/home/postgres/postgres-bin/postgres/8.4-community
$ mv * /u01/app/postgres/8.4/db/
Recargamos nuestro profile y ya tenemos nuestra instalación concluida ... al menos el primer paso.

$ . ~/.profile


POSTGRES VERSION: 8.4
POSTGRES HOME : /u01/app/postgres/8.4/db
PGDATA : /var/postgres/8.4/data
PGARCH : 64

$ which psql
/u01/app/postgres/8.4/db/bin/64/psql
Inicio de PGDATA
Una vez instalado nuestro POSTGRES_HOME, debemos iniciar nuestro PGDATA para ello, vamos a utilizar initdb ubicado en /u01/app/postgres/8.4/db/bin/64/initdb
Este binario nos va a crear toda las estructura necesaria para postgres y los archivos de configuración. Debemos tener en cuenta que esta estructura ha de iniciarse en un encoding específico, aunque mi recomendación es que sea siempre UTF8, por ello, debemos tener las variables LC_xxxx en formato compatible con UTF8 y como yo tengo mi instalación de Solaris en es_ES.ISO8859-15 tengo que hacer un cambio a UTF8@euro, vamos a ver un ejemplo de cómo iniciar PGDATA en UTF8

Cambiamos nuestras variables de entorno para hacerlo compatible con UTF8
$ export LC_COLLATE=es_ES.UTF-8@euro
$ export LC_CTYPE=es_ES.UTF-8@euro
$ export LC_MESSAGES=es_ES.UTF-8@euro
$ export LC_MONETARY=es_ES.UTF-8@euro
$ export LC_NUMERIC=es_ES.UTF-8@euro
$ export LC_TIME=es_ES.UTF-8@euro
Llamamos a initdb con encoding utf8 (-E utf8) configuración regional por defecto (--locale es.UTF8) super-usuario postgres (-U postgres) y que me pida la contraseña para el superusuario (-W)
$ initdb -E utf8 --locale=es.UTF-8 -U postgres -W
Si todo ha ido correctamente, podemos comprobar que ha creado una estructura parecida a la siguiente:
$ ls -l $PGDATA
total 62
drwx------ 7 postgres postgres 512 jul 2 11:23 base
drwx------ 2 postgres postgres 1024 jul 22 12:06 global
drwx------ 2 postgres postgres 512 jul 6 18:50 pg_clog
-rw------- 1 postgres postgres 541 jul 2 09:32 pg_hba.conf
-rw------- 1 postgres postgres 1631 jul 2 09:32 pg_ident.conf
drwx------ 4 postgres postgres 512 jul 2 09:32 pg_multixact
drwx------ 2 postgres postgres 512 jul 22 12:06 pg_stat_tmp
drwx------ 2 postgres postgres 512 jul 6 18:50 pg_subtrans
drwx------ 2 postgres postgres 512 jul 2 09:32 pg_tblspc
drwx------ 2 postgres postgres 512 jul 2 09:32 pg_twophase
-rw------- 1 postgres postgres 4 jul 2 09:32 PG_VERSION
drwx------ 3 postgres postgres 1024 jul 11 19:33 pg_xlog
-rw------- 1 postgres postgres 16701 jul 6 18:28 postgresql.conf
-rw------- 1 postgres postgres 41 jul 22 09:15 postmaster.opts
Configuración de Postgres
Postgres tiene dos archivos de configuración principales, postgresql.conf y pg_hba.conf.

pg_hba.conf, En este archivo definiremos qué hosts tienen acceso a nuestro postgres y cuál será el método de acceso y autenticación, por ejemplo, para permitir el acceso del host 192.168.1.201 a todas las bases de datos incluiremos la siguiente entrada:
###################################
## CONNECT TO ALL DATABASE
###################################
host all all 192.168.1.201/32 md5
postgresql.conf, En este archivo se encuentra prácticamente la totalidad de parámetros de configuración de nuestro servidor, en esta primera parte vamos a modificar los siguientes parámetros, listen_address y vamos a poner
listen_addresses = '*'
De esta forma, postgres escuchará en todos los interfaces, permitiendo conectarnos remotamente (si no queremos que haga bind en todos, podemos poner la IP en la que queremos que escuche)

Iniciar/Detener Postgres
Para iniciar/detener/recargar utilizaremos el comando pg_ctl con las opciones start, stop y reload en función de lo que queramos hacer, por ejemplo:

Para iniciar nuestro postgres haremos lo siguiente, -l hace que el log se escriba en /var/log/postgres
$ pg_ctl start -l /var/log/postgres/postgres.log
servidor iniciándose
Para ver si nuestro postgres está vivo utilizaremos el comando pg_ctl con la opción status
$ pg_ctl status
pg_ctl: el servidor está en ejecución (PID: 19517)
/u01/app/postgres/8.4/db/bin/64/postgres
Para detener nuestro servidor, utilizaremos la opción stop, con el argumento -m fast para un apagado correcto

$ pg_ctl stop -m fast
esperando que el servidor se detenga..... listo
servidor detenido
Las diferentes opciones del apagado son:
  • smart, Salir después que todos los clientes se hayan desconectado
  • fast, Salir directamente, con apagado apropiado
  • immediate, Salir sin apagado completo; se ejecutará recuperación en el próximo inicio

Haciendo un poco de analogía de Oracle quedaría algo así:
  • Posgres: smart, Oracle: normal
  • Postgres: fast, Oracle: immediate
  • Postgres: immediate, Oracle: abort
Para volver a cargar la configuración, debemos hacer un HUP al proceso de postgres utilizando el comando pg_ctl y la opción reload
$ pg_ctl reload
Conectarnos al Servidor
Ya tenemos nuestro servidor funcionando y vamos a conectarnos a él utilizando psql

$ psql -U postgres
Contraseña para usuario postgres:
psql (8.4.1)
Digite «help» para obtener ayuda.

postgres=# help
Está usando psql, la interfaz de línea de órdenes de PostgreSQL.
Digite: \copyright para ver los términos de distribución
\h para ayuda de órdenes SQL
\? para ayuda de órdenes psql
\g o punto y coma («;») para ejecutar la consulta
\q para salir
postgres=# \q
Sistema de Backup
Para nuestro sistema de backup, postgres nos proporciona una utilidad llamada pg_dump que nos permite hacer un volcado de nuestra base de datos, por ejemplo, si queremos exportar la base de datos postgres al archivo postgres-FULL.dump
$ pg_dump -U postgres posgres > /u07/backups/postgres/8.4/postgres-FULL.dump
Contraseña:


 
Conclusión
Hemos visto cómo la instalación de postgres sobre Solaris no tiene mayor problema, y cómo utilizando los project podemos optimizar al máximo el rendimiento de nuestro servidor.

Aunque no hemos entrado mucho en las opciones de postgres y sus comandos, es debido a que en esta primera parte el objetivo era la instalación y su inicio/parada, en las próximas entregas veremos cómo hacer de postgres una gran base de datos de producción.

Además veremos cómo hacer que postgres vuele en nuestra máquina y cómo proteger postgres, hasta entonces ... nos toca espera.

Referencias

No hay comentarios:

Publicar un comentario