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