Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Clonacion DBs
1. Dataguard
2. Rac
3. WebLogic
4. Forms & Reports
5. Replicacion
6. Migracion
7. Cloud Control
8. DGMGRL Broker
9. Particionar Tablas
10.Mask-Data
11.Monitoreos y Graficacion de Servidores de BDs
PostgreSQL
PostgreSQL
Desarrollador(es)
PostgreSQL Global Development Group
www.postgresql.org
Informacin general
9.6.2 (info)
ltima versin estable
9 de febrero de 2017 (6 das)
Gnero Base de datos objeto-relacional (ORDBMS)
Sistema operativo Multiplataforma
Licencia PostgreSQL License1
En espaol No
ndice
[ocultar]
Historia
PostgreSQL ha tenido una larga evolucin, la cual se inicia en 1982 con el proyecto Ingres
en la Universidad de Berkeley. Este proyecto, liderado por Michael Stonebraker, fue uno de
los primeros intentos en implementar un motor de base de datos relacional. Despus de
haber trabajado un largo tiempo en Ingres y de haber tenido una experiencia comercial
con el mismo, Michael decidi volver a la Universidad en 1985 para trabajar en un nuevo
proyecto sobre la experiencia de Ingres, dicho proyecto fue llamado post-ingres o
simplemente POSTGRES.
El proyecto post-ingres pretenda resolver los problemas con el modelo de base de datos
relacional que haban sido aclarados a comienzos de los aos 1980. El principal de estos
problemas era la incapacidad del modelo relacional de comprender "tipos", es decir,
combinaciones de datos simples que conforman una nica unidad. Actualmente estos son
llamados objetos. Se esforzaron en introducir la menor cantidad posible de funcionalidades
para completar el soporte de tipos. Estas funcionalidades incluan la habilidad de definir
tipos, pero tambin la habilidad de describir relaciones - las cuales hasta ese momento
eran ampliamente utilizadas pero mantenidas completamente por el usuario. En Postgres
la base de datos comprenda las relaciones y poda obtener informacin de tablas
relacionadas utilizando reglas. Postgres us muchas ideas de Ingres pero no su cdigo.
La siguiente lista muestra los hitos ms importantes en la vida del proyecto Postgres.
1986: se publicaron varios papers que describan las bases del sistema.
1988: ya se contaba con una versin utilizable.
1989: el grupo publicaba la versin 1 para una pequea comunidad de usuarios.
1990: se publicaba la versin 2 la cual tena prcticamente reescrito el sistema de reglas.
1991: publicacin de la versin 3, esta aada la capacidad de mltiples motores de
almacenamiento.
1993: crecimiento importante de la comunidad de usuarios, la cual demandaba ms
caractersticas.
1994: despus de la publicacin de la versin 4, el proyecto termin y el grupo se disolvi.
Despus de que el proyecto POSTGRES terminara, dos graduados de la universidad,
Andrew Yu y Jolly Chen, comenzaron a trabajar sobre el cdigo de POSTGRES, esto fue
posible dado que POSTGRES estaba licenciado bajo la BSD, y lo primero que hicieron fue
aadir soporte para el lenguaje SQL a POSTGRES, dado que anteriormente contaba con
un intrprete del lenguaje de consultas QUEL (basado en Ingres), creando as el sistema al
cual denominaron Postgres95.
En 2000, ex inversionistas de Red Hat crearon la empresa Great Bridge para comercializar
PostgreSQL y competir contra proveedores comerciales de bases de datos. Great Bridge
auspici a varios desarrolladores de PostgreSQL y don recursos de vuelta a la
comunidad, pero a fines de 2001 cerr debido a la dura competencia de compaas como
Red Hat y pobres condiciones del mercado.
En enero de 2005, PostgreSQL recibi apoyo del proveedor de base de datos Pervasive
Software, conocido por su producto Btrieve que se utilizaba en la plataforma Novell
Netware. Pervasive anunci soporte comercial y participacin comunitaria y logr algo de
xito. Sin embargo, en julio de 2006 dej el mercado de soporte de PostgreSQL.
Caractersticas
Algunas de sus principales caractersticas son, entre otras:
Alta concurrencia
Mediante un sistema denominado MVCC (Acceso concurrente multiversin, por sus siglas
en ingls) PostgreSQL permite que mientras un proceso escribe en una tabla, otros
accedan a la misma tabla sin necesidad de bloqueos. Cada usuario obtiene una visin
consistente de lo ltimo a lo que se le hizo commit. Esta estrategia es superior al uso de
bloqueos por tabla o por filas comn en otras bases, eliminando la necesidad del uso de
bloqueos explcitos...
Claves ajenas tambin denominadas Llaves ajenas o Claves Forneas (foreign keys).
Disparadores (triggers): Un disparador o trigger se define como una accin especfica que
se realiza de acuerdo a un evento, cuando ste ocurra dentro de la base de datos. En
PostgreSQL esto significa la ejecucin de un procedimiento almacenado basado en una
determinada accin sobre una tabla especfica. Ahora todos los disparadores se definen
por seis caractersticas:
El nombre del disparador o trigger
El momento en que el disparador debe arrancar
El evento del disparador deber activarse sobre...
La tabla donde el disparador se activar
La frecuencia de la ejecucin
La funcin que podra ser llamada
La funcin no es correcta
Entonces combinando estas seis caractersticas, PostgreSQL le permitir crear una
amplia funcionalidad a travs de su sistema de activacin de disparadores (triggers).
Vistas.
Integridad transaccional.
Herencia de tablas.
Tipos de datos y operaciones geomtricas.
Soporte para transacciones distribuidas. Permite a PostgreSQL integrarse en un sistema
distribuido formado por varios recursos (p.ej, una base de datos PostgreSQL, otra Oracle,
una cola de mensajes IBM MQ JMS y un ERP SAP) gestionado por un servidor de
aplicaciones donde el xito ("commit") de la transaccin global es el resultado del xito de
las transacciones locales. Ms informacin en ingls en
http://www.theserverside.com/discussions/thread.tss?thread_id=21385#95297 y en
http://java.sun.com/javaee/technologies/jta/index.jsp.
Funciones
Los disparadores (triggers en ingls) son funciones enlazadas a operaciones sobre los
datos.
Las funciones pueden ser definidas para ejecutarse con los derechos del usuario ejecutor
o con los derechos de un usuario previamente definido. El concepto de funciones, en
otros DBMS, son muchas veces referidas como "procedimientos almacenados" (stored
procedures en ingls).
Ventajas
-Integridad referencial
-Afirmaciones (Assertions)
-Disparadores (Triggers)
-Autorizaciones
-Conexin a DBMS
-Transacciones y respaldos
Historial de liberaciones
Primera ltima versin ltima ---
Liberacin
liberacin menor liberacin -
0.01 1995-05-01 0.03 1995-07-21
1.0 1995-09-05 1.09 1996-11-04
6.0 1997-01-29
6.1 1997-06-08 6.1.1 1997-07-22
6.2 1997-10-02 6.2.1 1997-10-17
6.3 1998-03-01 6.3.2 1998-04-07
6.4 1998-10-30 6.4.2 1998-12-20
6.5 1999-06-09 6.5.3 1999-10-13
7.0 2000-05-08 7.0.3 2000-11-11
7.1 2001-04-13 7.1.3 2001-08-15
7.2 2002-02-04 7.2.8 2005-05-09
7.3 2002-11-27 7.3.21 2008-01-07
7.4 2003-11-17 7.4.30 2010-10-04
8.0 2005-01-19 8.0.26 2010-10-04
8.1 2005-11-08 8.1.23 2010-12-16
8.2 2006-12-05 8.2.23 2011-09-26
8.3 2008-02-04 8.3.23 2013-02-07
8.4 2009-07-01 8.4.22 2014-07-24
9.0 2010-09-20 9.0.23 2015-10-08
9.1 2011-09-12 9.1.24 2016-10-27
9.2 2012-09-10 9.2.19 2016-10-27
9.3 2013-09-09 9.3.15 2016-10-27
9.4 2014-12-18 9.4.10 2016-10-27
9.5 2016-01-07 9.5.5 2016-10-27
9.6 2016-09-29 9.6.1 2016-10-27
Soportado por la comunidad
Sin soporte de la
comunidad2
Alternativas Comerciales
Gracias a su licencia BSD, se permite la utilizacin del cdigo para ser comercializado.
Uno de los casos ejemplo es la de Enterprise DB (Postgresql Plus), la cual incluye varios
agregados y una interfaz de desarrollo basada en Java. Entre otras empresas que utilizan
Postgresql para comercializar se encuentra CyberTech (Alemania), con su producto
CyberCluster.
GIS
PostGIS
Extensin que aade soporte de objetos geogrficos a PostgreSQL y permite realizar
anlisis mediante consultas SQL espaciales o mediante conexin a aplicaciones GIS
(Sistema de Informacin Geogrfica).
Replicacin
PgCluster
Replicacin multi maestro.
Slony-I
Replicacin maestro esclavo.
PyReplica
Replicacin maestro esclavo y multi maestro asincrnica.
Herramientas de administracin
PgAdmin3
Entorno de escritorio visual. Instalable en plataformas Linux, FreeBSD, Solaris, Mac OSX y
Windows. Permite conectarse a bases de datos PostgreSQL que estn ejecutndose en
cualquier plataforma.
Facilita la gestin y administracin de bases de datos ya sea mediante instrucciones SQL
o con ayuda de un entorno grfico. Permite acceder a todas las funcionalidades de la
base de datos; consulta, manipulacin y gestin de datos, incluso opciones avanzadas
como manipulacin del motor de replicacin Slony-I
PgAccess
Entorno de escritorio visual.
PhpPgAdmin
Entorno web.
psql
Cliente de consola.
Database Master
Entorno de escritorio visual.
Bsqueda de texto
XML
XML/XSLT soporte
Via XPath extensiones en la seccin contrib.
Usuarios destacados
.org, .info, .mobi y .aero registros de dominios por Afilias.3
La American Chemical Society.
BASF.
IMDb.
Skype.
TiVo.
Penny Arcade.
Sony Online.4
U.S. Departamento de Trabajo.
USPS.
VeriSign.
Pictiger.com
Wisconsin Circuit Court Access con 6 * 180GB DBs replicados en tiempo real.
OpenACS y .LRN.
INEGI.
IFE.
CartoCiudad.5 del IGN de Espaa.
Premios
PostgreSQL ha recibido los siguientes reconocimientos:6
PgAdmin III
pgAdmin III es una aplicacin grfica para gestionar el gestor de bases de datos PostgreSQL, siendo la ms
completa y popular con licencia Open Source. Est escrita en C++ usando la librera grfica multiplataforma
wxWidgets, lo que permite que se pueda usan en Linux, FreeBSD, Solaris, Mac OS X y Windows. Es capaz de gestionar
versiones a partir de la PostgreSQL 7.3 ejecutndose en cualquier plataforma, as como versiones comerciales
de PostgreSQL como Pervasive Postgres, EnterpriseDB, Mammoth Replicator y SRA PowerGres.
pgAdmin III est diseado para responder a las necesidades de todos los usuarios, desde escribir consultas SQL
simples hasta desarrollar bases de datos complejas. El interfaz grfico soporta todas las caractersticas de
PostgreSQL y facilita enormemente la administracin. La aplicacin tambin incluye un editor SQL con resaltado
de sintaxis, un editor de cdigo de la parte del servidor, un agente para lanzar scripts programados, soporte
para el motor de replicacin Slony-I y mucho ms. La conexin al servidor puede hacerse mediante conexin
TCP/IP o Unix Domain Sockets (en plataformas *nix), y puede encriptarse mediante SSL para mayor seguridad.
Contenido
[ocultar]
1 Instalacin
2 Actualizar a una versin ms moderna
2.1 Mtodo rpido
2.2 Mtodo compilado
3 Ver tambin
4 Enlaces externos
Instalacin
Dado que esta aplicacin se encuentra en los repositorios, tan slo tendremos que instalar el paquete
pgadmin3. En el men de aplicaciones no vers que se incluya una entrada para esta aplicacin. Esto es
debido a que hay un error en la elaboracin del paquete. Esto pasa con los paquetes Debian que no se han
adaptado a la poltica de mens de Ubuntu. Lee el artculo Activar el men Debian para ver como se activa el men
Debian y luego vers como aparece la entrada en Aplicaciones -> Debian -> Apps -> Databases.
Mtodo rpido
La ltima versin de pgAdmin hasta el momento es la 1.8.2 la cual no compila en Ubuntu pero si que puedes
instalar una versin 1.8.0 compilada aadiendo este repositorio a la lista:
deb http://ftp5.es.postgresql.org/mirror/postgresql/pgadmin3/release/ubuntu gutsy pgadmin
Los paquetes vienen firmados, por lo que debers aadir la clave pblica correspondiente:
$ wget -q -O - http://www.pgadmin.org/pgp/archive_key_debian_ubuntu.gpg | sudo apt-key add -
Mtodo compilado
Si has elegido el mtodo complicado, lo que haremos es compilar una Ubuntu el paquete de Debian de la ltima
versin.
1.- Eliminamos la versin de pgAdmin III que tenemos instalada:
$ sudo aptitude purge pgadmin3
3.- Actualizamos la base de datos de los paquetes (dar un error de verificacin de clave PGP que puedes
ignorar):
$ sudo aptitude update
6.- Generamos los paquetes compilados para instalar a partir de los fuentes (tarda un rato):
$ sudo apt-get -b source pgadmin3 pgadmin3-data
Grab
El paquete postgresql-server contiene los binarios del servidor DBMS, y postgresql las
utilidades cliente para conectarnos a un servidor, as como documentacin en formato HTML y
las pginas "man".
# chkconfig postgresql on
# /etc/init.d/postgresql start
Grab
# su - postgres
\q to quit
template1=#
Grab
Grab
# vim /var/lib/pgsql/data/pg_hba.conf
Grab
# vim /var/lib/pgsql/data/postgresql.conf
listen_addresses='*'
Grab
El ltimo paso es reiniciar el servicio y comprobar que los cambios se han aplicado
correctamente:
# /etc/init.d/postgresql restart
Grab
# su - postgres
ALTER ROLE
Grab
Comprobar la versin de PostgreSQL instalada
La forma mas cmoda es ejecutando la sentencia SQL SELECT VERSION(), ejemplo:
version
--------------------------------------------------------------------------------------------
---------------
PostgreSQL 8.1.11 on x86_64-redhat-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20070626 (Red
Hat 4.1.2-14)
(1 fila)
Grab
$ LANG=en_US psql -l
List of databases
--------------+----------+----------
(4 rows)
El resultado es un fichero ASCII con todas las sentencias SQL necesarias para restaurar la
BBDD.
SET
SET
SET
COMMENT
REVOKE
REVOKE
GRANT
GRANT
Grab
Para hacer un backup de todas las BBDD podemos utilizar el comando pg_dumpall o realizar
un pequeo script en BASH, ejemplo:
#!/bin/bash
DIR=/var/lib/pgsql/backups
for db in $LIST
do
done
Grab
Activar el modo de compatibilidad con versiones anteriores de PostgreSQL
Para habilitar la compatibilidad con versiones anteriores de PostgreSQL tenemos que editar el
fichero /var/lib/pgsql/data/postgresql.conf y aadir las siguientes variables (mas
informacin en el captulo Version and Platform Compatibility):
add_missing_from = on
array_nulls = on
backslash_quote = safe_encoding
default_with_oids = on
escape_string_warning = on
standard_conforming_strings = off
regex_flavor = advanced
sql_inheritance = on
Grab
array_nulls: This controls whether the array input parser recognizes unquoted
NULL as specifying a null array element. By default, this is on, allowing array values
containing null values to be entered. However, PostgreSQL versions before 8.2 did not
support null values in arrays, and therefore would treat NULL as specifying a normal
array element with the string value "NULL". For backwards compatibility with
applications that require the old behavior, this variable can be turned off.
sql_inheritance: This controls the inheritance semantics. If turned off, subtables are
not included by various commands by default; basically an implied ONLY key word. This
was added for compatibility with releases prior to 7.1.
# su - postgres
Grab
Si al aadir y/o modificar cualquier variable PostgreSQL no arranca tendremos que revisar el
fichero de log /var/lib/pgsql/pgstartup.log para encontrar cualquier warning/error del
tipo:
FATAL: unrecognized configuration parameter "array_nulls"
Grab
NOTA: Para poder gestionar bases de datos PostgreSQL desde Plesk se necesita comprar el addon
"Power Pack"!!
Una vez comprado el addon, el panel de control Plesk permite la gestin de bases de datos
PostgreSQL.
Podemos instalar PostgreSQL en Plesk de dos formas: 1) desde el interfaz web (Home ->
Updates -> PostgreSQL) y 2) desde una shell con el "autoinstaller":
Grab
El siguiente paso es activarlo en el inicio del servidor, arrancar el servicio y asignar una contrasea al
usuario administrador "postgres":
# chkconfig postgresql on
# /etc/init.d/postgresql start
# su - postgres
ALTER ROLE
Grab
Depus tenemos que entrar al interfaz web (Home -> Database Servers) y configurar el
usuario administrador "postgres" con su contrasea, a partir de aqu podremos gestionar
PostgreSQL desde el Plesk. Adems, se instala la herramienta de adminstracin web phpPgAdmin
para los clientes junto con una utilidad muy bsica pg_manage que permite parar, arrancar e
reinciar el servicio PostgreSQL.
Conexin a PostgreSQL desde PHP
Para conectarnos a PostgreSQL desde PHP necesitamos instalar el paquete php-pgsql, que
propociona las extensiones pdo_pgsql.so y pgsql.so:
# /etc/init.d/httpd restart
Grab
LOG: could not connect to Ident server at address "127.0.0.1", port 113: Connection refused
Grab
# vim /var/lib/pgsql/data/pg_hba.conf
(..)
Grab
1) Backup
2) Borrar/mover el contenido de $PGDATA y volver a inicializar con initdb el nuevo formato de
las bases de datos PostgreSQL
3) Restore
# /etc/init.d/postgresql stop
# su - postgres
$ rm -rf $PGDATA
$ initdb
# /etc/init.d/postgresql start
Grab
Si tras actualizar una instacia de PostgreSQL no actualizamos el formato de las bases de datos
al arrancar nos encontraramos con este error:
1. Introduccin
2. Funcionamiento de la Arquitectura
3. Instalacin
4. Configuracin
5. Creacin y Manejo de Base de Datos PostgreSQL
6. PSQL
7. PGAdmin III
8. Seguridad
9. SQL
10. Respaldos y Recuperacin
11. Monitoreo y Estadsticas
12. Rutinas de Mantenimiento
13. Point-in Time Recovery
Introduccin
PostgreSQL es un sistema de gestin de bases de datos objeto-relacional, distribuido
bajo licencia BSD y con su cdigo fuente disponible libremente. Es el sistema de
gestin de bases de datos de cdigo abierto ms potente del mercado y en sus
ltimas versiones no tiene nada que envidiarle a otras bases de datos comerciales.
PostgreSQL utiliza un modelo cliente/servidor y usa multiprocesos en vez de multihilos para garantizar la
estabilidad del sistema. Un fallo en uno de los procesos no afectar el resto y el sistema continuar
funcionando.
A continuacin teneis un grfico que ilustra de manera general los componentes ms importantes en un
sistema PostgreSQL.
Aplicacin cliente: Esta es la aplicacin cliente que utiliza PostgreSQL como administrador de
bases de datos. La conexin puede ocurrir via TCP/IP sockets locales.
Demonio postmaster: Este es el proceso principal de PostgreSQL. Es el encargado de escuchar
por un puerto/socket por conexiones entrantes de clientes. Tambien es el encargado de crear los
procesos hijos que se encargaran de autentificar estas peticiones, gestionar las consultas y
mandar los resultados a las aplicaciones clientes
Ficheros de configuracion: Los 3 ficheros principales de configuracin utilizados por PostgreSQL,
postgresql.conf, pg_hba.conf y pg_ident.conf
Procesos hijos postgres: Procesos hijos que se encargan de autentificar a los clientes, de
gestionar las consultas y mandar los resultados a las aplicaciones clientes
PostgreSQL share buffer cache: Memoria compartida usada por POstgreSQL para almacenar datos
en cach.
Write-Ahead Log (WAL): Componente del sistema encargado de asegurar la integridad de los
datos (recuperacin de tipo REDO)
Kernel disk buffer cache: Cach de disco del sistema operativo
Disco: Disco fsico donde se almacenan los datos y toda la informacin necesaria para que
PostgreSQL funcione
Caractersticas
La ltima serie de produccin es la 9.3. Sus caractersticas tcnicas la hacen una de las bases de datos
ms potentes y robustas del mercado. Su desarrollo comenzo hace ms de 16 aos, y durante este
tiempo, estabilidad, potencia, robustez, facilidad de administracin e implementacin de estndares han
sido las caractersticas que ms se han tenido en cuenta durante su desarrollo. PostgreSQL funciona muy
bien con grandes cantidades de datos y una alta concurrencia de usuarios accediendo a la vez a el
sistema.
Generales
Es una base de datos 100% ACID
Integridad referencial
Tablespaces
Nested transactions (savepoints)
Replicacin asincrnica/sincrnica / Streaming replication - Hot Standby
Two-phase commit
PITR - point in time recovery
Copias de seguridad en caliente (Online/hot backups)
Unicode
Juegos de caracteres internacionales
Regionalizacin por columna
Multi-Version Concurrency Control (MVCC)
Multiples mtodos de autentificacin
Acceso encriptado via SSL
Actualizacin in-situ integrada (pg_upgrade)
SE-postgres
Completa documentacin
Licencia BSD
Disponible para Linux y UNIX en todas sus variantes (AIX, BSD, HP-UX, SGI IRIX, Mac OS X,
Solaris, Tru64) y Windows 32/64bit.
Programacin / Desarrollo
SQL
SQL92,SQL99,SQL2003,SQL2008
Llaves primarias (primary keys) y forneas (foreign keys)
Check, Unique y Not null constraints
Restricciones de unicidad postergables (deferrable constraints)
Columnas auto-incrementales
Indices compuestos, nicos, parciales y funcionales en cualquiera de los metodos de
almacenamiento disponibles, B-tree, R-tree, hash GiST
Sub-selects
Consultas recursivas
Funciones 'Windows'
Joins
Vistas (views)
Disparadores (triggers) comunes, por columna, condicionales.
Reglas (Rules)
Herencia de tablas (Inheritance)
Eventos LISTEN/NOTIFY
Podeis consultar la lista completa en ingles de caractersticas disponibles en todas las versiones en la
direccin http://www.postgresql.org/about/featurematrix
Lmite Valor
Mximo tamao base de dato Ilimitado (Depende de tu sistema de almacenamiento)
Mximo tamao de tabla 32 TB
Mximo tamao de fila 1.6 TB
Mximo tamao de campo 1 GB
Mximo numero de filas por tabla Ilimitado
Mximo numero de columnas por tabla 250 - 1600 (dependiendo del tipo)
Mximo numero de indices por tabla Ilimitado
Historia
El proyecto PostgreSQL tal y como lo conocemos hoy en dia empez en 1996, aunque las bases y el
trabajo en la que se asienta tienen sus comienzos en la decada de los 70. A continuacin teneis una corta
descripcin de la historia de PostgreSQL.
La dcada de los 70 fue una dcada de desarrollos y pruebas de nuevos conceptos en el nuevo mundo de
los gestores de bases de datos.
IBM habia estado trabajando desde 1973 con los primeros conceptos, ideas y teorias sobre bases de
datos relacionales. Su proyecto "System R" fue entre otras cosas la primera implementacin del lenguaje
SQL (Structured Query Language). Este proyecto, sus decisiones de diseo y muchos de los algoritmos
usados, influenciaron muchos de los sistemas de bases de datos relacionales que aparecieron
posteriormente.
Por aquel entonces un profesor de la Universidad de Berkeley, Michael Stonebraker, leyo unos artculos
publicados por IBM sobre "System R" que le hicieron interesarse en el tema. Utilizando el dinero de otro
proyecto que ya tenia asignado, Ingres (INteractive Graphics REtrieval System), Stonebraker empezo a
desarrollar sus ideas sobre bases de datos relacionales. Durante estos aos Ingres mantuvo su cdigo
fuente abierto y permanecio en gran medida similar en conceptos a "System R".
A principio de los 80, Ingres estuvo compitiendo con Oracle por el liderazgo en el mundo de bases de
datos relacionales y su cdigo e implementacin evolucionaron y fueron el origen de otras bases de datos
relacionales, entre ellas podemos citar a Informix, NonStop SQL y Sybase (Microsoft SQL Server fue una
versin licenciada de Sybase hasta su version 6.0).
Michael Stonebraker dejo la Universidad de Berkeley en 1982 para comercializar Ingres pero volvio a la
misma en 1985 con nuevas ideas.
Despues de su vuelta a Berkeley en 1985, Michael Stonebraker lider un nuevo proyecto llamado
Postgres (despues de Ingres) patrocinado por la Defense Advanced Research Projects Agency (DARPA), la
Army Research Office (ARO), la National Science Foundation (NSF), y ESL, Inc. Con este proyecto y
basandose en la experiencia obtenida con Ingres, Stonebraker tenia como meta mejorar lo que habian
conseguido y aprendido en el desarrollo de Ingres. Y aunque se baso en muchas ideas de Ingres, no se
baso en el cdigo fuente del mismo.
Para los interesados en el tema, teneis disponibles una serie de artculos originales y completos en ingles
relacionados con el proyecto Postgres:
En 1994, dos estudiantes de Berkeley, Andrew Yu y Jolly Chen, empezaron a trabajar con el cdigo de
Postgres (versin 4.2) y llamaron al proyecto Postgres95. Hicieron una limpieza general del cdigo,
arreglaron errores en el mismo, e implementaron otras mejoras, entre las que destacan:
La versin 1.0 de Postgre95 vio la luz en 1995, el cdigo era 100% ANSI C, un 25% ms corto en
relacin con la versin 4.2 y un 30-50% ms rpido. El cdigo fue publicado en la web y liberado bajo
una licencia BSD, y ms y ms personas empezaron a utilizar y a colaborar en el proyecto.
En 1996, Andrew Yu y Jolly Chen ya no tenian tanto tiempo para dirigir y desarrollar Postgres95. Algunos
de los usuarios habituales de las listas de correo del proyecto decidieron hacerse cargo del mismo y
crearon el llamado "PostgreSQL Global Development Team".
En un principio este equipo de desarrolladores al cargo de la organizacin del proyecto estuvo formado
por Marc Fournier en Ontario, Canada, Thomas Lockhart en Pasadena, California, Vadim Mikheev en
Krasnoyarsk, Rusia y Bruce Momjian in Philadelphia, Pennsylvania. El nombre fue cambiado de
Postgres95 a PostgreSQL y lanzaron la versin 6.0 en enero de 1997.
Hoy en dia el grupo central (core team) de desarrolladores est formado por 6 personas, existen 38
desarrolladores principales y ms 21 desarrolladores habituales. En total alrededor de 65 personas
activas, contribuyendo con el desarrollo de PostgreSQL. Podeis encontrar ms informacin sobre este
equipo de desarrolladores en http://www.postgresql.org/community/contributors/
Existe tambien una gran comunidad de usuarios, programadores y administradores que colaboran
actvamente en numerosos aspectos y actividades relacionadas con el proyecto. Informes y soluciones de
problemas, tests, comprobacin del funcionamiento, aportaciones de nuevas ideas, discusiones sobre
caractersticas y problemas, documentacin y fomento de PostgreSQL son solo algunas de las actividades
que la comunidad de usuarios realiza.
No tenemos que olvidar tampoco que existen muchas empresas que tambien colaboran con dinero y/
con tiempo/personas en mejorar PostgreSQL. Muchos desarrolladores y nuevas caractersticas estn
muchas veces patrocinadas por empresas privadas.
En los ltimos aos los trabajos de desarrollo se han concentrado mucho en la velocidad de proceso y en
caractersticas demandadas en el mundo empresarial. En este grfico podeis ver cuando las diferentes
versiones de PostgreSQL han visto la luz y las principales caracteristicas en las que se ha centrado el
desarrollo.
Durante los aos de existencia del Proyecto PostgreSQL, el tamao del mismo, tanto en nmero de
desarrolladores, como en nmeros de linea de cdigo, funciones y complejidad del mismo ha ido
aumentando ao a ao. En el siguiente grfico teneis una grfica con la evolucin del nmero de lineas
de cdigo en cada versin de PostgreSQL.
Los datos de este grfico estan generados con CLOC. Contabilizamos como lineas de cdigo a todas las
lineas de cdigo en diferentes lenguaje, ms comentarios, menos lineas en blanco. Los ficheros HTML y
CSS no se cuentan como cdigo.
Usando el modelo de estimacin de costes de software "COCOMOII" (Constructive COst MOdel) podemos
obtener unos datos meramente orientativos pero que nos pueden ayudar a entender la complejidad del
proyecto PostgreSQL y los recursos que se necesitarian para desarrollar un producto similar desde cero.
Descripcin Valor
Nmeros de lineas de cdigo (PG-9.0.0) 969.562
Habilidad de los programadores (alta) 0,6
Complejidad del projecto (alta) 1,24
Precio/hora ($100.000/ao -
$53,3
1.875horas/ao)
Programadores-ao 618,71
Precio por linea de cdigo $65,30
Precio Total $63.316.697
Lineas de cdigo por persona/dia 7
Tiempo de desarrollo del proyecto (aos) 3.6
Nmero medio de programadores 171,4
Ref: http://www.cms4site.ru/utility.php?ecur=1.24&eafcur=0.6&utility=cocomoii...
4. Configuracin
No es la primera vez que algun asuario protesta o esta super preocupado de lo mal y lo
lento que funciona su cluster de base de datos PostgreSQL en un servidor ultimo modelo con muchisima
memoria. Normalmente el problema es que PostgreSQL no ha sido configurado para trabajar con el
volumen de datos y usuarios con el que lo estamos usando. No es una gran ayuda tener un servidor con
varios GBytes de memoria RAM si le hemos dicho a PostgreSQL, por ejemplo, que no utilice ms de
32MBytes.
Tambien tenemos que decir que cualquier base de datos que se este usando activamente, no solo
PostgreSQL, es un elemento dinamico y vivo en el que estamos cambiando los datos constantemente y
donde el tamao de los datos almacenados suele ir creciendo con el tiempo. Esto significa que una
configuracion que funcione bien con ciertos valores hoy, puede que no funcione tan bien despues de unos
meses de uso y que necesite ajustarse para que funcione optimalmente.
pg_hba.conf: Este fichero se utiliza para definir los diferentes tipos de accesos que un usuario
tiene en el cluster.
pg_ident.conf: Este fichero se utiliza para definir la informacin necesaria en el caso que
utilicemos un acceso del tipo ident en pg_hba.conf .
postgresql.conf: En este fichero podemos cambiar todos los parametros de configuracion que
afectan al funcionamiento y al comportamiento de PostgreSQL en nuestra maquina.
Pasamos a continuacin a explicar los cambios mas importantes que podemos hacer en algunos de estos
ficheros.
pg_hba.conf
Este fichero se utiliza para definir como, donde y desde que sitio un usuario puede utilizar nuestro cluster
PostgreSQL. Todas las lineas que empiezen con el caracter # se interpretan como comentarios. El resto
debe de tener el siguiente formato:
Dependiendo del tipo de conexion y del tipo de autentificacion, [IP],[Netmask] y [opciones]pueden ser
opcionales. Vamos a explicar un poco como definir las reglas de acceso. El tipo de conexion puede tener
los siguientes valores, local, host, hostssl y hostnossl. El tipo de metodo puede tener los siguientes valores,
trust, reject, md5, crypt, password, krb5, ident, pam o ldap
Una serie de ejemplos nos ayudaran a comprender mejor como podemos configurar diferentes accesos al
cluster PostgreSQL.
Ejemplo 1 .- Acceso por tcp/ip (red) a la base de datos test001, como usuario test desde el ordenador con
IP 10.0.0.100, y metodo de autentificacion md5:
Esta misma entrada se podria escribir tambien con la mascara de red en notacion CIDR:
Ejemplo 2 .- Acceso por tcp/ip (red) a la base de datos test001, como usuario test desde todos los
ordenadores de la red 10.0.0.0, con mascara de red 255.255.255.0 (254 ordenadores en total) y metodo de
autentificacion md5:
Esta misma entrada se podria escribir tambien con la mascara de red en notacion CIDR:
Ejemplo 3 .- Acceso por tcp/ip (red), encriptado, a todas las bases de datos de nuestro cluster, como
usuario test desde el ordenador con IP 10.0.0.100, y el ordenador 10.1.1.100 y metodo de autentificacion
md5 (necesitamos dos entradas en nuestro fichero pg_hba.conf:
Ejemplo 4.- Denegar el acceso a todos las bases de datos de nuestro cluster al usuario test, desde todos
los ordenadores de la red 10.0.0.0/24 y dar accesso al resto del mundo con el metodo md5:
Asi podriamos seguir jugando con todas las posibilidades que nos brinda este fichero de configuracion.
Por supuesto que las bases de datos y usuarios usados en este fichero tienen que existir en nuestro
cluster para que todo funcione y algunos de los parametros solo se pueden usar si hemos compilado con
las opciones pertinentes en el proceso de instalacion (por ejemplo, hostssl, pam, krb5)
Para poder en produccion los cambios en este fichero tendremos que decirle a PostgreSQL que vuelva a
leerlo. Basta con un simple 'reload' (/usr/local/bin/pg_ctl -D /var/pgsql/data reload) desde la linea de comandos
o con la funcion pg_reload_conf() como usuario postgres desde psql, el cliente PostgreSQL.
[postgres@servidor]# /usr/local/bin/psql
Welcome to psql 8.2.4, the PostgreSQL interactive terminal.
\q to quit
pg_reload_conf
----------------
(1 row)
postgres=#
Para una documentacion detallada sobre el fichero pg_hba.con, pasaros por la seccion Chapter 20. Client
Authentication de la documentacion oficial de PostgreSQL.
postgresql.conf
Los cambios que realicemos en este fichero afectaran a todas las bases de datos que tengamos definidas
en nuestro cluster PostgreSQL. La mayoria de los cambios se pueden poner en produccion con un simple
'reload' (/usr/local/bin/pg_ctl -D /var/pgsql/data reload), otros cambios necesitan que arranquemos de nuevo
nuestro cluster (/usr/local/bin/pg_ctl -D /var/pgsql/data restart ).
Mas informacion sobre todos los parametros que podemos cambiar en este fichero, que afectan y como
se pueden poner en produccion se puede encontrar en la seccion 17. Server Configuration de la
documentacion oficial de PostgreSQL.
A continuacion vamos a ver los parametros mas importantes que deberiamos cambiar si empezamos a
usar PostgreSQL para un uso serio y si queremos sacarle el maximo partido a nuestra maquina. Existen
muchos mas parametros que se pueden y con el tiempo se deberan de ajustar, aqui nos vamos a centrar
en los mas importantes y los cuales deberiamos cambiar antes de empezar a utilizar PostgreSQL de una
manera seria.
max_connections: Numero maximo de clientes conectados a la vez a nuestras bases de datos. Deberiamos
de incrementar este valor en proporcion al numero de clientes concurrentes en nuestro cluster
PostgreSQL. Un buen valor para empezar es el 100:
max_connections = 100
shared_buffers: Este parametro es importantisimo y define el tamao del buffer de memoria utilizado por
PostgreSQL. No por aumentar este valor mucho tendremos mejor respuesta. En un servidor dedicado
podemos empezar con un 25% del total de nuestra memoria. Nunca mas de 1/3 (33%) del total. Por
ejemplo, en un servidor con 4Gbytes de memoria, podemos usar 1024MB como valor inicial.
shared_buffers = 1024MB
work_mem: Usada en operaciones que contengan ORDER BY, DISTINCT, joins, .... En un servidor dedicado
podemos usar un 2-4% del total de nuestra memoria si tenemos solamente unas pocas sesiones
(clientes) grandes. Como valor inicial podemos usar 8 Mbytes.
work_mem = 8MB
maintenance_work_mem: Usada en operaciones del tipo VACUUM, ANALYZE, CREATE INDEX, ALTER TABLE,
ADD FOREIGN KEY. Su valor dependera mucho del tamao de nuestras bases de datos. Por ejemplo, en
un servidor con 4Gbytes de memoria, podemos usar 256MB como valor inicial.
maintenance_work_mem = 256MB
effective_cache_size: Parametro usado por el 'query planner' de nuestro motor de bases de datos para
optimizar la lectura de datos. En un servidor dedicado podemos empezar con un 50% del total de nuestra
memoria. Como maximo unos 2/3 (66%) del total. Por ejemplo, en un servidor con 4Gbytes de memoria,
podemos usar 2048MB como valor inicial.
effective_cache_size = 2048MB
checkpoint_segments: Este parametro es muy importante en bases de datos con numerosas operaciones de
escritura (insert,update,delete). Para empezar podemos empezar con un valor de 64. En grandes
databases con muchos Gbytes de datos escritos podemos aumentar este valor hasta 128-256.
checkpoint_segments = 64
Es muy importante tener en cuenta que al aumentar los valores por defecto de muchos de estos
parametros, tendremos que aumentar los valores por defecto de algunos parametros del kernel de
nuestro sistema. Informacion detallada de como hacer esto se encuentra en la seccion 16.4. Managing Kernel
Resources de la documentacion oficial de PostgreSQL.
En fin, esto es solo un aperitivo de lo que podemos hacer. Con la practica y la experiencia podremos y
tendremos que ajustar otros muchos parametros. Pero esto sera materia de un proximo articulo.
Primeros pasos
Tamao del sistema: Cual es el tamao de las bases de datos que quereis administrar, las medis
en MB, GB, TB?
Carga del sistema: Cuantos usuarios van a utilizar el sistema y que concurrencia podemos
esperar?
Si simplemente quereis probar y "jugar" un poco con PostgreSQL, existen distribuciones binarias en casi
todas las distribuciones de Linux existentes y para sistemas Windows. Con cualquiera de estos paquetes
binarios podeis tener una instalacin bsica y lista para utilizar en cuestin de pocos minutos. Tambien
teneis por supuesto el cdigo fuente disponible y listo para ser compilado/instalado, si preferis este tipo
de instalacin. Pasaros por la seccin de descargas para obtener ms informacin sobre los productos
disponibles.
Si quereis utilizar PostgreSQL de una manera profesional y con sistemas en produccin deberiais
planificar vuestro sistema con ms detalle y aprender como podeis configurar PostgreSQL para sacarle el
mximo provecho. Es importante decir que una de las caracteristicas principales de PostgreSQL es su
facilidad de administracin comparada con muchos otros sistemas de gestin de bases de datos.
Probablemente tengais muchas preguntas, os aconsejo consultar Sobre PostgreSQL, 10 razones para utilizar
PostgreSQL y la seccin de documentacin del servidor. Si teneis alguna pregunta podeis utilizar los foros del
servidor utilizar cualquiera de los servicios disponibles (listas de correos / irc/ etc) en la seccin Comunidad
/ soporte
Ejemplo en Ubuntu
Usa los siguientes comandos en tu terminal para instalar el paquete de postgresql:
Por ejemplo:
Por ejemplo:
Puedes encontrar el nuevo elemento de pgAdmin III del men en tu sistema Ubuntu desde Aplicaciones
Programacin pgAdmin III.
Configura un usuario en PostgreSQL para OpenERP
Cuando la instalacin del software requerido este terminado, debers crear un usuario de PostgreSQL.
Este usuario deber ser el mismo que tu sistema de usuario. OpenERP usar este usuario para
conectarse a PostgreSQL.
Ilustracin demostrando como OpenERP hace uso del usuario de PostgreSQL e interactua con este
Truco
Base de datos
Como se explico antes, sin crear y configurar usuario de PostgreSQL para OpenERP, no podr crear
una base de datos usando el cliente OpenERP.
Primer mtodo
El super usuario predeterminado de PostgreSQL se llama postgres. Deber ingresar con este usuario
la primera vez.
password: XXXXXXXXXX
Make this new user a superuser. Only then you can create a database using OpenERP Client. In short,
openerp is the new user created in PostgreSQL for OpenERP. This user is the owner of all the tables
created by OpenERP Client.
Ahora checa la lista de tablas creadas en PostgreSQL usando los siguientes comandos:
postgres@openerp-desktop:/$ psql -l
Puede encontrar la tabla tempalte1, ejecuta el siguiente comando usando esta tabla:
Usa el siguiente comando para aplicar los permisos de acceso al rol openerp para que la base de
datos la cual ser creada desde el cliente de OpenERP:
template1=# alter role openerp with password 'postgres';
ALTER ROLE
Segundo mtodo
Otra opcin para crear y configurar un usuario en PostgreSQL para el OpenERP es mostrado a
continuacin:
--pwprompt openerp
CREATE ROLE
Nota
Contrasea
Nota que la contrasea es postgres.
Explicacin de opciones:
2. PARA EL SIGUIENTE PASO HACER CLIC SOBRE DOWNLOAD. ESTO SER PARA DESCARGAR EL INSTALADOR
DEL PROGRAMA POSTGRESQL.
8.- AHORA APARECER UNA NUEVA VENTANA, AQU PONDREMOS LA DIRECCIN DE DONDE VAMOS A
GUARDAR LOS DATOS.
9.- PULSAMOS NUEVAMENTE SIGUIENTE, AH TE APARECER UNA VENTANA EN LA QUE NOS PEDIR UNA
CONTRASEA DE USUARIO DE POSTGRESQL, INGRESAREMOS NUESTRA CONTRASEA.
10.- ENSEGUIDA APARECER UNA VENTANA EN LA QUE PEDIR EL PUERTO POR DONDE SE COMUNICARA EL
PROGRAMA, ESTE APARECER POR DEFAULT, ES EL PUERTO 5432, DEJAMOS EL MISMO NMERO DE PUERTO:
11.- AHORA TE PEDIR SI DESEAS CAMBIAR LA CONFIGURACIN REGIONAL, DEJAREMOS LA QUE DA POR
DEFAULT Y HAREMOS CLIC EN SIGUIENTE:
12.- AHORA APARECER UNA VENTANA EN LA CUAL INDICAR QUE EL PROGRAMA EST LISTO PARA
INSTALARSE. POSTERIOR A ESTO HAREMOS CLIC EN SIGUIENTE.
13.- NOS APARECER UNA VENTANA EN LA CUAL OBSERVAREMOS QUE SE EST INSTALANDO POSTRESQL.
14.- FINALMENTE FINIQUITAMOS LA INSTALACIN HACIENDO CLIC EN TERMINAR.
15.-PODEMOS IR AL PROGRAMA HACIENDO CLIC EN INICIO, TODOS LOS PROGRAMAS, BUSCAMOS POSTRESQL
Y POR ULTIMO HACEMOS CLIC EN PGADMINIII.
16.- EL PROGRAMA EST LISTO PARA USARSE.
17.- PARA PODER USAR Postgresql (CONECTAR CON EL SERVIDOR) DEBEMOS INTRODUCIR LA CONTRASEA
QUE NOSOTROS COMO USUARIOS ELEGIMOS DURANTE EL PROCESO DE LA INSTALACIN.
Ahora podr iniciar el servidor de OpenERP. Quizas deber modificar el archivo de configuracin de
OpenERP para sus necesidades las cuales estan normalmente ubicadas en el directorio ~/.openerprc
Instalacin de PostgreSQL en Debian GNU/Linux Wheezy
This entry was posted on 01/03/2013, in Base de datos, Distros GNU/Linux, GULMER, Linux,
Migracin, Software libre and tagged aptitude, Debian, gnu linux, GULMER, Linux, Migracin, PostgreSQL, Software
Este articulo explica como instalar el servidor y un cliente de lineas de comandos de la base de datos
PostgreSQL en Debian Wheezy.
Introduccin
PostgreSQL
PostgreSQL, es un gestor de base de datos relacional, la primera versin del cdigo fue pblico el 1 de
agosto de 1996, liberado bajo la licencia BSD y desarrollado por PostgreSQL Global Development Group.
Debian GNU/Linux
Debian GNU/Linux, es un sistema operativo, liberado bajo la licencia GPL y desarrollado por Proyecto
Debian una comunidad de desarrolladores y usuarios.
Instalacin
Para este caso se instalara el servidor y un cliente de lineas de comandos PostgreSQL de la versin 9.1,
ejecutando el siguiente comando:
# aptitude install postgresql-9.1
Configuracin
Lo primero que se tiene que hacer es cambiarle la contrasea al usuario postgres que se crea luego de
haber instalado el paquete:
# passwd postgres
Acceda a la consola de administracin de PostgreSQL para cambiar la contrasea del usuario postgres
con los siguientes comandos:
# su postgres
postgres@nombre_maquina:/directorio$ psql postgres
postgres=# ALTER ROLE postgres PASSWORD 'CONTRASENA_DEL_USUARIO';
En este archivo puede configurar los modos de autenticacin del cliente PostgreSQL y con que usuario
puede acceder a los datos almacenados en el servidor PostgreSQL.
Para este caso de configuracin usted esta conectndose localmente en el mismo servidor donde esta
instalado PostgreSQL por lo cual la IP local es 127.0.0.1, entonces agregue debajo de la linea # IPv4
local connections: la siguiente instruccin:
host nombre_base_datos usuario_postgresql 127.0.0.1/32 password
Opcionalmente usted puede simplemente unir las direcciones IP especificas a la cual da acceso de la
siguiente forma:
listen_addresses='192.168.3.220 192.168.3.221'
En este archivo puede configurar desde que maquina o mascara de red puede acceder a los datos
almacenados en el servidor PostgreSQL y con que usuario se puede acceder.
Para ejemplo practico que se suponga que esta en una red 192.168.1.1/16 as que quiere darle acceso a
la IP 192.168.3.220, agregue debajo de la linea # IPv4 local connections: la siguiente instruccin:
host nombre_base_datos usuario_postgresql 192.168.2.3/32 md5
Creando usuarios
Para crear usuarios vuelve a entrar como root de PostgreSQL para crear usuarios para conectarse a la base
de datos, en este caso usuario usuario_nomina con su contrasea 123456, con el siguiente comando:
# su postgres
postgres@nombre_maquina:/directorio$ createuser -D -S -R -l usuario_nomina
Este usuario usuario_nomina tiene permiso para no crear base de datos, no ser super usuario, no
crear roles de usuario, se le permite iniciar sesin respectivamente.
Para asignar la contrasea debe conectarse al servidor PostgreSQL, con el siguiente comando:
postgres@nombre_maquina:/directorio$ psql postgres
Esta la sesin conectado altere el usuario asignando una contrasea cifrada, con el siguiente comando:
postgres=# ALTER USER usuario_nomina WITH ENCRYPTED PASSWORD '123456';
ALTER ROLE
Para comprobar que el usuario se creo con xito, ejecute los siguientes comandos:
postgres=# SELECT usename, passwd FROM pg_shadow;
usename | passwd
----------------+-------------------------------------
postgres | md53175bce1d3201d16594cebf9d7eb3f9d
usuario_nomina | md5bad743050fa6b819130855f6cbb357ee
(2 filas)
Luego de iniciar sesin en el servidor como root, ahora usted puede crear una base de datos, con el
siguiente comando:
postgres@nombre_maquina:/directorio$ createdb -Ttemplate0 -O usuario_nomina
-EUTF-8 sistema_nomina
Esta base de datos sistema_nomina se basa en la plantilla de base de datos llamada template0 con la
cual es construida, el usuario dueo de la base de datos es el usuario usuario_nomina previamente
creado, usando el esquema de codificacin de caracteres UTF-8 soportado a ser usado en esta base de
datos respectivamente.
Para los privilegios del usuario usuario_nomina en la base de datos sistema_nomina debe
conectarse al servidor PostgreSQL, ejecute el siguiente comando:
postgres@nombre_maquina:/directorio$ psql postgres
Al estar en la sesin conectado otorgue todos los privilegios al usuario usuario_nomina en la base de
datos sistema_nomina, con el siguiente comando:
postgres=# GRANT ALL PRIVILEGES ON DATABASE sistema_nomina TO usuario_nomina;
Para comprobar que la base datos esta creada, ejecute el siguiente comando:
postgres=# SELECT datname FROM pg_database;
datname
-----------------
template0
postgres
template1
sistema_nomina
(4 filas)
sistema_nomina=> help
Est usando psql, la interfaz de lnea de rdenes de PostgreSQL.
Digite: \copyright para ver los trminos de distribucin
\h para ayuda de rdenes SQL
\? para ayuda de rdenes psql
\g o punto y coma (;) para ejecutar la consulta
\q para salir
sistema_nomina=>
sistema_nomina=> help
Est usando psql, la interfaz de lnea de rdenes de PostgreSQL.
Digite: \copyright para ver los trminos de distribucin
\h para ayuda de rdenes SQL
\? para ayuda de rdenes psql
\g o punto y coma (;) para ejecutar la consulta
\q para salir
sistema_nomina=>
Autentificacion de Usuarios
Autentificacion es el proceso mediante el cual el servidor de la base de datos y el
postmaster se aseguran de que el usario que est solicitando acceso a la base de datos
es en realidad quien dice ser. Todos los usarios que quieren utilizar Postgres se
comprueban en la tabla pg_user para asegurarse que estn autorizados a hacerlo.
Actualmente, la verificacin de la identidad del usuario se realiza de distintas formas:
Desde la shell del usuario
Un demonio que se lanza desde la shell del usuario anota el id original del
usuario antes de realizar un setuid al id del usuario postgres. El id original del
usuario se emplea como base para todo tipo de comprobaciones.
Desde la red
Crear Usuarios
Crear Grupos
Actualmente no hay una forma facil de crear grupos de usuarios. Hay que
aadirlos/actualizarlos uno a uno en la tabla pg_group table. Por ejemplo: jolly=>
insert into pg_group (groname, grosysid, grolist) jolly=> values ('posthackers', '1234',
'{5443, 8261}'); INSERT 548224 jolly=> grant insert on foo to group posthackers;
CHANGE jolly=> Los campos de pg_group son: * groname: El nombre del grupo.
Este campo debe de ser unicamente alfanumrico. No aadas subrayados u otros
signos de puntuacin. * grosysid: El id del grupo. El tipo del campo es int4 y debe de
ser nico para cada grupo. * grolist: La lista de id de usarios que pertenecen al grupo.
Este campo es de tipo int4.
Control de Acceso
Postgres proporciona mecanismos para permitir a los usuarios limitar el acceso que
otros usuarios tendrn a sus datos.
SuperUsuarios de la Base de Datos
Los comandos que borran o modifican la estructura de una clase, como alter,
drop table, y drop index, solo funcionan con el propietario de la clase. Como
hemos dicho antes, estas operaciones no estn permitidas nunca en los catlogos
del systema.
Siguiente
Funciones y Reglas
Las funciones y las reglas permiten a los usuarios insertar cdigo en el servidor de la
base de datos que otros usuarios pueden ejecutar sin saberlo. Ambos mecanismos
permiten a los usuarios alojar caballos de troya con relativa impunidad. La nica
proteccin efectiva es un estrecho control sobre quien puede definir funciones (por
ejemplo, escribir en tablas con campos SQL) y reglas. Tambin se recomienda auditar
seguimientos y alertas en pg_class, pg_user y pg_group.
Funciones
Las funciones escritas en cualquier lenguaje excepto SQL se ejecutan por el servidor
de la base de datos con el mismo permiso que el usuario postgres (el servidor de la
base de datos funciona con el user-id de postgres. Es posible cambiar las estructuras
de datos internas del servidor por los usuarios, desde dentro de funciones de
confianza. Es por ello que este tipo de funciones pueden, entre otras cosas, evitar
cualquier sistema de control de acceso. Este es un problema inherente a las funciones
definidas por los usuarios en C.
Reglas
Como en las funciones SQL, las reglas tamben se ejecutan con la identidad y los
permisos del usuario que llam al servidor de la base de datos.
Caveats
There are no plans to explicitly support encrypted data inside of Postgres (though
there is nothing to prevent users from encrypting data within user-defined functions).
There are no plans to explicitly support encrypted network connections, either,
pending a total rewrite of the frontend/backend protocol.
User names, group names and associated system identifiers (e.g., the contents of
pg_user.usesysid) are assumed to be unique throughout a database. Unpredictable
results may occur if they are not.
Siguiente
Gestin de Disco
Localizaciones Alternativas
Se puede crear una base de datos en una localizacin diferente a la establecida por
defecto durante la instalacin. Recuerde que todos los accesos a base de datos
ocurren realmente a traves del proceso en segundo plano, as que ste debe poder
acceder a cualquier especificacin.
Se crean localizacines alternativas y referencias mediante una variable de entorno
que da el path absoluto hasta la situacin de almacenamiento deseada. Esta variable
de entorno debe estar definida antes de que el proceso en segundo plano sea
arrancado y debe ser modificable mediante la cuenta del administrador de postgres.
Cualquier variable de entorno puede ser utilizada para referirse a una localizacin
alternativa, si bien se recomienda la utilizacin de un nombre de variable con prefijo
PGDATA para evitar confusin y conflicto con otras variables.
En versiones previas de Postgres, tambin estaba permitido utilizar un nombre de
path absoluto para especificar una localizacin de almacenamiento alternativa. Se
prefiere el mtodo de especificacin de variables de entorno, puesto que concede al
administrador del sistema ms flexibilidad en la gestin del almacenamiento en
disco. Si prefiere utilizar paths absolutos, puede hacerlo definiendo
"ALLOW_ABSOLUTE_DBPATHS" y recompilando Postgres. Para hacer esto,
aada cualquiera de estas lneas
#define ALLOW_ABSOLUTE_DBPATHS 1
para definir la variable de entorno que ser utilizada con las rdenes siguientes.
Normalmente, querr definir esta variable en el fichero de inicializacin del super
usuario de Postgres, .profile o .cshrc para asegurar que est definido al arrancar el
sistema. Se puede utilizar cualquier variable de entorno para referirse a una
localizacin alternativa, aunque se prefiere que las variables estn prefijadas con
"PGDATA" para eliminar confusiones y la posibilidad de conflictos con otras
variables, o su reescritura.
Para crear un area de almacenamiento de datos en PGDATA2, asegrese de que
/home/postgres ya existe y puede ser escrito por el administrador de postgres.
Despus desde la linea de rdenes, escriba
% setenv PGDATA2 /home/postgres/data
% initlocation $PGDATA2
Creating Postgres database system directory /home/postgres/data
Para comprobar la nueva localizacin, cree una base de datos test escribiendo
% createdb -D PGDATA2 test
% dropdb test
nombredb=>
Esto le dice al servidor que procese la consulta. Si termina su consulta con punto y
coma, no es necesario que introduzca la secuencia \g. psql procesar automticamente
consultas terminadas en punto y coma. Para leer las consultas de un fichero, en lugar
de introducirlas interactivamente, escriba:
nombredb=> \i fichero
Esta tcnica puede usarse para mover bases de datos a una nueva localizacin y para
renombrar bases de datos existentes..
Bases de datos grandes
Autor
Escrito por Hannu Krosing on 1999-06-19.
Dado que Postgres permite tablas de mayor tamao que el permitido por el sistema de
ficheros, puede resultar problemtico el volcado de una tabla a un fichero, ya que el
fichero resultante seguramente superar el tamao mximo permitido.
Como pg_dump escribe en stdout, puede usar las herramientas *nix para sortear estos
posibles problemas:
Uso de volcados comprimidos:
% pg_dump nombredb | gzip > nombrefichero.dump.gz
la recuperamos con:
% createdb nombredb
% gunzip -c nombrefichero.dump.gz | psql nombredb
o
% cat nombrefichero.dump.gz | gunzip | psql nombredb
Use split:
% pg_dump nombredb | split -b 1m - nombrefichero.dump.
y lo recuperamos con:
% createdb nombredb
% cat nombrefichero.dump.* | pgsql nombredb
Tratamiento de problemas
Un mensaje como ste posiblemente indica que el limite impuesto al tamao de las
zonas de memoria compartidas es menor que rea de buffer que Postgres est
intentando crear. (O puede significar que no dispone de soporte para la memoria
compartida de tipo SysV configurado en su ncleo.) Como arreglo temporal puede
tratar de iniciar postmaster con un nmero de buffers menor de lo normal
(parmetro -B). Sin embargo, debera reconfigurar su ncleo para incrementar el
tamao permitido para la memoria compartida. Este mensaje puede aparecer cuando
trate de iniciar varias sesiones de postmaster en la misma mquina, si el total de
espacio necesario excede el lmite impuesto por el ncleo.
IpcSemaphoreCreate: semget failed (No space left on device) key=5440026, num=16, permissio
Un mensaje como ste no significa que se haya quedado sin espacio en el disco;
significa que la cantidad mxima de semforos permitidos por el ncleo para el SysV
es menor que la cantidad que Postgres intenta crear. Como antes, puede evitar este
problema iniciando el postmaster con un numero de procesos backend menor
(parmetro -N), pero sera mejor que incrementara el lmite impuesto por el ncleo.
La ltima lnea es til para verificar que el cliente est tratando de conectar donde se
supone que debe hacerlo. Si en realidad no hay ningn postmaster ejecutndose all,
el mensaje de error del ncleo ser del tipo de 'Conexin rehusada' o de 'No existe el
fichero o directorio', como los anteriores. (Es particularmente importante tener en
cuenta que 'Conexin rehusada' en este contexto no no significa que el postmaster
haya recibido la peticin de conexin y la haya rechazado; en este caso se produce un
mensaje diferente, como se ver.) Otros mensajes de error, como el de "Connection
timed out" s indican problemas ms importantes, como la falta de conectividad en la
red.
No pg_hba.conf entry for host 123.123.123.123, user joeblow, database testdb
Los mensajes como ste indican que ha contactado con el postmaster, y ste est
dispuesto a hablar con usted, pero no lo har hasta que supere el mtodo de
autorizacin especificado en el fichero pg_hba.conf. Compruebe la clave que est
enviando, o su programa IDENT o Kerberos, si el mensaje de error menciona alguno
de esos tipos de autenticacin.
FATAL 1: SetUserId: user 'joeblow' is not in 'pg_shadow'
No hay base de datos con ese nombre bajo el control de ese postmaster. Ntese que si
no especifica el nombre de la base de datos, se aplica por defecto su nombre de
usuario en Postgres, lo que puede no ser lo correcto.
epuracin de mensajes
El postmaster presenta ocasionalmente mensajes que pueden ser de ayuda en la
solucin de problemas. Si desea ver mensajes de depuracin de postmaster, puede
iniciarlo con la opcin -d y redirigir la salida a un fichero de registro:
% postmaster -d > pm.log 2>&1 &
pg_options
Contribucin de Massimo Dal Zotto
Las funciones usadas para imprimir errores y mensajes de depuracin pueden ahora
usar la utilidad syslog(2). Los mensajes impresos en stdout o stderr son precedidos
por una etiqueta informativa que incluye la fecha y hora y el pid del backend:
#timestamp #pid #message
980127.17:52:14.173 [29271] StartTransactionCommand
980127.17:52:14.174 [29271] ProcessUtility: drop table t;
980127.17:52:14.186 [29271] SIIncNumEntries: table is 70% full
980127.17:52:14.186 [29286] Async_NotifyHandler
980127.17:52:14.186 [29286] Waking up sleeping backend process
980127.19:52:14.292 [29286] Async_NotifyFrontEnd
980127.19:52:14.413 [29286] Async_NotifyFrontEnd done
980127.19:52:14.466 [29286] Async_NotifyHandler done
Ntese que palabra_clave puede ser tambin una abreviacin del nombre de opcin
definido en backend/utils/misc/trace.c.
Vase Usando pg_options para una lista completa de las opciones y sus posible
valores.
Pruebas de regresin
Instruciones y anlisis del test de regresin
Entorno de regresin
Para preparar los tests de regresin, haga make all en el directorio de los tests de
regresin. Esto compila un programa C con funciones extendidas PostgreSQL en un
librera compartida. Se generan algunos guiones (scripts) SQL localizados y archivos
de salida comparativos para los tests que los necesiten. La localizacin reemplaza
macros en los archivos de fuentes con rutas absolutas y nombres de usuario.
Normalmente, los tests de regresin deben ser ejecutados por el usuario postgres ya
que el directorio 'src/test/regress' y subdirectorios son de su propiedad. Si ejecuta los
test de regresin con otro usuario el directorio 'src/test/regress' debe tener permisos de
escritura para ese usuario.
Antes era estrictamente necesario ejecutar el postmaster con la zona horaria del
sistema establecida en PST, pero ya no es necesario. Puede ejecutar los tests de
regresin sobre su configuracin habitual del postmaster. El guin (script) del test
establecer la variable de entorno PGTZ para asegurar que los tests dependientes de
la zona horaria produzcan los resultados esperados. De todas formas, su sistema debe
proporcionar libreras de soporte para la zona horaria PST8PDT, o los tests
dependientes de la zona horaria fallarn. Para comprobar que su equipo soporta esto,
escriba lo siguiente:
setenv TZ PST8PDT
date
La orden "date" de arriba tiene que devolver la hora actual del sistema en la zona
horaria PST8PDT. Si la base de datos PST8PDT no est disponible, entonces el
sistema tiene que devolver la hora en GMT. Si la zona horaria PST8PDT no est
disponible, puede establecer las reglas para esa zona horaria explicitamente.
setenv PGTZ PST8PDT7,M04.01.0,M10.05.03
Estructura de directorios
Esto debera ser una tabla en la seccin anterior.
input/ .... .Archivos fuente que son convertidos, usando 'make all', en
alguno de los archivos .sql en el subdirectorio 'sql'
output/ ... .Archivos fuente que son convertidos, usando 'make all', en
archivos .out en el subdirectorio 'expected'
sql/ ...... .Archivos sql usados para ejecutar los tests de regresin
No necesita escribir "gmake clean" si es la primera vez que est ejecuntado los
tests.
3. Ejecute los tests de regresin. Escriba
cd /usr/src/pgsql/src/test/regress
gmake all
Anlisis de Regresin
Los resultados se encuentran en los archivos del directorio ./results. Estos resultados
pueden ser comparados con los resultados del directorio ./expected usando 'diff'. (El
guin (script) del test hace esto por usted, y deja las diferencias en ./regression.diffs.)
Los archivos pueden no corresponderse de forma exacta. El guin del test informar
deuna diferencia como "failure" (fallo), pero la diferencia puede deberse a pequeas
variaciones entre plataformas en los mensajes de error, comportamiento de la librera
matemica, etc. "Fallos" de este estilo no indican necesariamente un problema con
Postgres.
Por tanto, es necesario examinar las diferencias de cada test "fallido" con el fin de
determinar si existe un problema realmente. Los siguientes puntos intentan
proporcionar una gua para determinar si una diferencia es significativa o no.
Diferencias en polgonos
Varios de los tests incluyen operaciones con coordenadas sobre el callejero de
Oakland/Berkley CA. Los datos de este mapa vienen expresados como polgonos
cuyos vrtices estn representados en pares de nmeros float8 (latitud y longitud
decimal). Inicialmente, se crean y llenan algunas tablas con coordenadas, despus se
crean algunas vistas (Views) haciendo el Join de dos tablas usando el operador de
interseccin de polgonos (##), y despes se realiza un Select sobre la vista. Cuando
comparamos los resultados de diferentes plataformas, las diferencias aparecen en el
segundo o tercer lugar a la derecha del punto decimal. Las instrucciones SQL donde
se dan estos problemas son las siguientes:
QUERY: SELECT * from street;
QUERY: SELECT * from iexit;
Diferencias aleatorias
Hay al menos un caso de test en random.out que esta diseado para producir
resultados aleatorios. Esto causa que random falle el test de regresin cada vez.
Escribir
diff results/random.out expected/random.out
debe producir una o unas pocas lneas de diferencias por esta razn, pero otras
variaciones en punto flotante o en arquitecturas distintas pueden causar ms
diferencias.
Version 6.5.3
Esta es basicamente una limpieza de la version 6.5.2. Hemos aadido un nuevo
pgacces que se perdio en la 6.5.2, e instalado una correcion especifica para NT.
Migracion a v6.5.3
No se requiere un dump/restores para aquellos que esten ejecutando una 6.5.*.
ersion 6.5.2
Esta es basicamente una limpieza de la version 6.5.1. Hemos corregio una variedad
de problemas reportados por usuarios de 6.5.1.
Migracion to v6.5.2
No se requiere un dump/restores para aquellos que esten ejecutando una 6.5.*.
Lista Detallada de Cambios
corregidas las subselect+CASE (Tom)
Aadida configuracion de SHLIB_LINK para los portes de solaris_i386 y solaris_sparc(Daren
Correciones para CASE y WHERE en clausulas "join"(Tom)
Correcion para aborto en BTScan(Tom)
Reparada la comprobacion para UNIQUE redundante e indices PRIMARY KEY(Thomas)
Mejorado para que se compruebe las restricciones en multi-columnas(Thomas)
Correcion para Win32 que tenia problemas con MB habilitado(Hiroki Kataoka)
Permite a yacc de BSD y a bison compilar codigo pl(Bruce)
Corregido el trabajo con SET NAMES
corregidos los int8 (Thomas)
Correccion del consumo de memoria de "vacuum"(Hiroshi,Tatsuo)
Reduccion del consumo total de memoria de "vacuum"(Tom)
Correcion para timestamp(datetime)
Correcciones de problemas en las reglas de paso al analizador sintactico(Tom)
Correccion del problema de cuotas en mkMakefile.tcldefs.sh.in y mkMakefile.tkdefs.sh.in(To
This is to re-use space on index pages freed by vacuum(Vadim)
documentado -x para pg_dump(Bruce)
Correcin para operadores unarios en la regla de paso al analizador sintactico(Tom)
Comentado el FileUnlink de exceso de segmentos durante mdtruncate() (Tom)
Enlazamiento en Irix corregido por Yu Cao >yucao@falcon.kla-tencor.com<
Reparado el error logico en LIKE: no debia devolver un LIKE_ABORT
cuando alcanza el final de un patron antes del final del texto(Tom)
Reparada limpieza incorrecta de montones de memoria reservadas durante aborto de transacci
Version actualizada de pgaccess 0.98
Version 6.5.1
Esta es basicamente una limpieza de la version 6.5. Hemos corregio una variedad de
problemas reportados por usuarios de 6.5.
Migracion to v6.5.1
No se requiere un dump/restores para aquellos que esten ejecutando una 6.5.
ersion 6.5
Esta version marca un avance grande en el conocimiento que el equipo de desarrollo
tiene del codigo fuente que heredamos de Berkeley. Veras que podemos aadir
mayores features mas facilmente, gracias al incremento en tamao y experiencia de
nuestro mundialmente extenso equipo de desarrollo.
He aqui un conciso sumario de los mas notables cambios:
Control de concurrencia multi-version(MVCC en ingles Multi-version concurrency
control)
Tablas temporales
Se garantiza que las tablas temporales tienen nombres unicos durante una sesion
en la base de datos, y que son destruidas al salir de la sesion.
Aceleramiento
Portes
Interfaces
Documentacion
Migracion to v6.5
Un dump/restore utilizando pg_dump es necesario para aquellos que deseen migrar
datos de cualquier version previa de Postgres. pg_upgrade not puede ser utilizado
para actualizar esta version porque la estructura en disco de las tablas ha cambiado
comparada con versiones precedentes.
La nueva caracteristica de Control de Concurrencia Multi-Version (MVCC, en ingles)
puede dar comportamientos un poco diferentes en entornos multiusuarios. Lea y
comprenda la seccion siguiente para asegurar que sus aplicaciones existentes le
proporcionaran el comportamiento que necesita.
Control de Concurrencia Multi-Version
A causa de que las lecturas en 6.5 no bloquean los datos, a pesar del nivel de
aislamiento de transaccion, los datos leidos por una transaccion pueden ser sobre
escritos por otra. En otras palabras, si un registro es devuelto por SELECT eso no
significa que este registro exista realmente en el momento en que es devuelto. (i.e
algunas veces despues de que la sentencia o la transaccion comience) ni tampoco que
el registro este protegido de ser borrado o actualizado por una transaccion en
concurrente antes de que la transccion en curso haga commit o rollback.
Para asegurar la existencia actual de un registro y protegerlo contra actulizaciones
concurrentes se debe utilizar SELECT FOR UPDATE o una sentencia LOCK
TABLE apropiada. Esto deberia ser tenido en cuento cuando se porten aplicaciones
desde versiones precedentes de Postgres y otros entornos.
Tenga todo lo anterior en mente su utiliza triggers contrib/refint.* para integridad
referencial. Ahora se requieren tecnicas adicionales. Un modo es utilizar el comando
LOCK parent_table IN SHARE ROW EXCLUSIVE MODE si una transaccion
va a actualizar/borrar una clave primaria y utilizar el comando LOCK parent_table
IN SHARE MODE si una transaccion va a actualizar/insertar una clave foranea.
Notese que si ejecuta una transaccion en modo SERIALIZABLE entonces debe
ejecutar el comando LOCK anterior antes de la ejecucion de cualquier sentencia
DML (SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO) en la
transaccion.
Mejoras
------------
Aadida la utilidad "vacuumdb"
Se acelera libpq por mejor asignacion de memoria(Tom)
EXPLAIN utiliza todos los indices(Tom)
Implementadas las expresiones CASE, COALESCE, NULLIF(Thomas)
Nuevo formato de salida de pg_dump(Constantin)
Aadida la cadena min()/max() a las funciones(Thomas)
Extendidas nuevo tipo de coersiones para agregaciones(Thomas)
Nueva contribucion moddatetime (Terry)
Actualizacion a pgaccess 0.96(Constantin)
Aadida rutina para byte unico en tipo de caracter "char"(Thomas)
Mejorada la funcion substr()(Thomas)
Mejorado el manejo de multi-byte (Tatsuo)
Control de concurrencia Multi-version /MVCC(Vadim)
Nuevo modo Serialized(Vadim)
Correcion para tablas por encima de 2gigs(Peter)
Nuevo SET TRANSACTION ISOLATION LEVEL(Vadim)
Nuevo LOCK TABLE IN ... MODE(Vadim)
Actualizado el driver ODBC(Byron)
Nuevo tipo de datos NUMERIC(Jan)
Nueva SELECT FOR UPDATE(Vadim)
Manejo de "NaN" e "Infinity" para valores de entrada(Jan)
Mejorado el manejo de date/year(Thomas)
Mejorado el manejo de conexiones con el motor de base de datos(backend)(Magnus)
Nuevas opciones ELOG_TIMESTAMPS y la opcion USE_SYSLOG para ficheros de registro(Massimo)
Nueva opcion TCL_ARRAYS (Massimo)
Nueva INTERSECT y EXCEPT(Stefan)
Nuevo pg_index.indisprimary para restro de claves primarias(D'Arcy)
Nuevas opcion pg_dump para permitir el borrado de tablas antes de su creacion(Brook)
Acelaracion de las rutinas de salida de registro(Tom)
Nuevo nivel de aislamiento de READ COMMITTED (Vadim)
Nuevas tablas/indices TEMP (Bruce)
Se evita el ordenamiento si el resultado ya esta ordenado(Jan)
Nueva optimizacin para la asignacion de memoria(Jan)
Se permite a psql ejecutar \p\g(Bruce)
Se permiten multiples reglas de acciones(Jan)
Aadida funcionalidad LIMIT/OFFSET (Jan)
Mejorado el optimizador cuando se unen un numero grande de tablas(Bruce)
Nueva introduccion a SQL de La Tesis de Doctorado de S. Simkovics(Stefan, Thomas)
Nueva introduccion a procesamiento del motor de base de datos (backend) de la Tesis de Doc
Mejorado el soporte para int8(Ryan Bradetich, Thomas, Tom)
Nuevas rutinas para convertir entre tipos int8 y text/varchar(Thomas)
Nuevos planes arboreos, donde se unen meta-tablas(Bruce)
Habilitadas consultas por la mano derecha por defecto(Bruce)
Se permite que el numero maximo de procesos en servidor (backends) se parametrice en el mo
(--with-maxbackends and postmaster switch (-N backends))(Tom)
GEQO por defecto tenga ahora 10 tablas porque el optimizador se acelera(Tom)
Se permite NULL=Var para MS-SQL portabilidad(Michael, Bruce)
Modificados contrib check_primary_key() y consecuentemente "automatic" or "dependent"(Anan
Se permite que psql \d en una vista muestre la consulta(Ryan)
Se acelera el LIKE(Bruce)
Correciones/prestaciones Ecpg , vease fichero src/interfaces/ecpg/ChangeLog(Michael)
Correciones/prestacines JDBC , vease src/interfaces/jdbc/CHANGELOG(Peter)
Se hace que el operador % tenga precedencia como /(Bruce)
Aadida la nueva opcion postgres -O para permitir cambios en la estructura de tablas del s
Actualizado el script contrib/pginterface/findoidjoins (Tom)
Major aceleracion en vacuum de lineas borradas con indices(Vadim)
Se permitte la ejecucion de diferentes versiones de funciones no-SQL basadas en argumentos
Aadida la opcion -E que muestra las consultas actuales enviadas pro \dt y sus amigos(Masa
Aadido numero de version en los banners de arranque de psql(Masaaki Sakaida)
Nuevo contrib/vacuumlo que elimina objetos grandes no referenciados(Peter)
Nueva inicializacion para tamaos de tablas, asi las tablas no vacuumeadas se ejecutan mej
Mejorados los mensajes de error cuando una conexion es rechazada(Tom)
Soporte para array de campos char() y varchar() (Massimo)
Revision del codigo has para incrementar fiabilidad y prestaciones(Tom)
Actualizacion a PyGreSQL 2.4(D'Arcy)
Cambiadas las opciones de depuracion asi -d4 y -d5 producen diferentes displays de nodos(J
nuevas opciones: pretty_plan, pretty_parse, pretty_rewritten(Jan)
Mejor optimizacion de estadisticas para los accesos a tablas del sistema(Tom)
Mejor manejo de tamao de bloque no por defecto(Massimo)
Mejorado el optmizador de comsumo de memoria GEQO(Tom)
UNION soporta ahora ORDER BY de columnas que no estan en la lista de target(Jan)
Mejoras grandes en libpq++ (Vince Vielhaber)
pg_dump utiliza ahora -z(ACL's) por omision(Bruce)
cache de procesos en servidor (backend), aceleracion de memoria(Tom)
Se hace que pg_dump lo haga todo en una transaccion snapshot(Vadim)
correcion de perdidas de memoria para objetos grandes, correccion para pg_dumping(Tom)
INET escribe ahora respecto a la netmask para comparaciones
Se hace que VACUUM ANALYZE solo utilice un readlock(Vadim)
Se permiten vistas (VIEW) en UNIONS(Jan)
pg_dump puede generar ahora snapshots consistentes en bases de datos activas(Vadim)
Version 6.4
Hay muchas prestaciones nuevas y mejoras en esta version. Gracias a unestros
desarrolladores y mantenedores, casi todos los aspectos del sistema han recibido
alguna atencion desde la version anterior. He aqui un resumen, sumario incompleto:
Las vistas y las reglas son ahora funcionales gracias al extensivo nuevo codigo
en las reglas de re escritura de Jan Wieck. Tambien escribio un capitulo sobre
ello en la Guia del Programador.
Jan tambien contribuyo al segundo lenguaje procedural, PL/pgSQL, para ir con
el original lengaje procedural PL/pgTCL con el que el contribuyo la ultima
version.
Tenemos soporte opcional de caracter multiple-byte de Tatsuo Iisho para
complementar nuestro soporte local.
Las comunicaciones cliente/servidor han sido depuradas, con mejor soporte
para mensajes asincronos e interrupciones, gracias a Tom Lane.
El depurador de sintactico ejecuta ahora coersiones de tipo automatico para
emparejar argumentos a los operadores y funciones disponibles, y para
emparejar columnas y expresiones con columnas destino. Esto utiliza un
mecanismo generico que soporta las prestaciones de extensibilidad de tipo de
Postgres. Hay un nuevo capitulo en la Guia de Usuario que cubre este asunto.
Tres nuevos tipos de datos han sido anadidos. Dos tipos, inet y cidr, soportan
varias formas de trabajo en red IP, subred, y direccionamiento por maquina.
Ahora hay un tipo entero de 8 byte disponible para algunas plataformas. Vease
el capitulo de tipos de datos en la Guia del Usuario para mas detalles. Un
cuarto tipo, serial, se soporta ahora por el depurador de sintactico como una
amalgama de tipo int4, una secuencia, y un indice unico.
Han sido aadidas varias prestaciones mas sintacticas compatibles con SQL92,
incluyendo INSERT DEFAULT VALUES Several more SQL92-compatible
syntax features have been added, including INSERT DEFAULT VALUES
La instalacion y configuracion automatica del sistema ha recibido alguna
atencio, y deberia ser mas robusta para mas plataformas de lo que nunca ha
sido.
Migracion a v6.4
Se requiere un dump/restore utilizando pg_dump o pg_dumpall para aquellas que
desen migrar datos desde cualquier version anterior de Postgres.
Mejoras
------------
Actualizacion de ecpg y ecpglib, vease src/interfaces/ecpg/ChangeLog(Michael)
Se muestra en indice utilizado en un EXPLAIN(Zeugswette)
EXPLAIN invoca una regla de sistema y muestra plan(es) para la reescritura de consultas(Ja
Conocimiento multi-byte de muchos tipos de datos y funciones, via configure(Tatsuo)
Nuevo configure con la opcion --with-mb(Tatsuo)
Nueva opcion initdb --pgencoding(Tatsuo)
Nueva opcion createdb -E multibyte(Tatsuo)
Select version(); ahora devuelve la version de PostgreSQL(Jeroen)
Libpq permite ahora clientes asincronos(Tom)
Se permite la cancelacion desde el cliente de una consulta en el proceso en servidor(backe
Psql cancelas las consultas ahora con Control-C(Tom)
Usuarios de Libpq no necesitan dar consultas dummy para obtener mensajes NOTIFY(Tom)
NOTIFY envia ahora al PID del emisor, asi que puedes decir si eras tu mismo(Tom)
La estructura de PGresult ahora incluye un mensaje de error asociado, si lo hay(Tom)
Se definen los argumentos "tz_hour" y "tz_minute" como date_part()(Thomas)
Se anaden rutinas para convertir entre varchar y bpchar(Thomas)
Se anaden runtinas para permitir el dimensionamiento de
varchar y bpchar dentro de las columnas de destino(Thomas)
Se anade un bit a las etiquetas (flags) oara soportar
zona horaria y minutos en la devolucion de fecha(Thomas)
Se permiten mas variaciones en numeros de coma flotante (por ej. ".1", "1e6")(Thomas)
Se corrigen el analisis sintactico de menores unarios empezando con espacios(Thomas)
Se implementa TIMEZONE_HOUR, TIMEZONE_MINUTE por especificaciones SQL92(Thomas)
Se verifica i se ignora adecuadamente constraints de columna FOREIGN KEY(Thomas)
SE defina USER como sinonimo de CURRENT_USER por especificacines de SQL92(Thomas)
Se habilita HAVING en clausulas pero no se corrije en ningun otro lugar aun.
Se hace el tipo "char" un sinonimo de "char(1)" (actualmente implementado como bpchar)(Tho
Se guarda el tipo de cadena si esta especificado por el manejo de la clausula DEFAULT(Thom
Operaciones de coercion abarcan diferentes tipos de datos(Thomas)
Se permite a algunos indices utilizar columnas de diferentes tipos(Thomas)
Anadidas capcidades para coersiones de tipo automatico(Thomas)
Depuraciones para objetos grandes, de este modo un fichero es truncado en su apertura(Pete
Depuraciones de la lectura de lineas(Tom)
Se permite que psql \f \ tomen los espacios en blanco como delimitadores(Bruce)
Se pasa el pg_attribute.atttypmod al frontal de la aplicacion para las longitudes de los c
Libreria de compatibilidad con Msql en /contrib(Aldrin)
Se elimina el requerimiento de que las clausulas identificadoras ORDER/GROUP BY
estuvieran incluidas en la lista de la busqueda(David)
Se convierten columnas para emparejarlas en las clausulas de UNION(Thomas)
Se elimina fork()/ecec() y solo se hace fork()(Bruce)
Depuraciones en Jdbc(Peter)
Se muestra el estado del proceso en el servidor (backend) en la
linea de comandos de ps(solo funciona en algunas plataformas)(Bruce)
Pg_hba.conf tiene ahora una opcion sameuser en el campo de la base de datos
Se hace que lo_unlink tome el parametro oid, no el int4
Nueva DISABLE_COMPLEX_MACRO para compiladores que no pueden manejar nuestras macros(Bruce)
Libpgtcl maneja los NOTIFY ahora como un evento Tcl, no se necesitan enviar consultas tont
Depuraciones en libpgtcl(Tom)
Anadida una opcion -error al comando pg_result de libpgtcl(Tom)
Anadido parche locale, vease docs/README/locale(Oleg)
Correccion para pg_dump con ella la sintaxis de CONSTRAINT y CHECK es correcta(ccb)
Nuevo codigo contrib/lo para eliminar grandes objetos huerfanos(Peter)
Nuevp comando psql "SET CLIENT_ENCODING TO 'encoding'" para prestaciones
multi.byte, vease /doc/README.mb(Tatsuo)
codigo /contrib/noupdate para revocar permisos de actualizacion en una columna
Libpq puede ser compilada ahora en win32(Magnus)
Anadido PQsetdbLogin() en libpq
Nuevo tipo entero 8-byte, comprobado por el configure del soporte para OS(Thomas)
Mejor soporte para nombres entrecomillados de tabla/columnas(Thomas)
Se rodean los nombres de tabla y columnas con dobles comillas en pg_dump(Thomas)
PQreset() trabaja ahora con contrasenas(Tom)
Handle case of GROUP BY target list column number out of range(David)
Se permite UNION en las subconsultas
Anadido auto-dimensionamiento a la pantalla a los comandos \d?(Bruce)
Se utiliza UNION para mostrar todos los resultados de \d? en una consulta(Bruce)
Se anade la prestacion de busqueda de campo \d?(Bruce)
Pg_dump utiliza menos peticiones \connect(Tom)
Se hace que la opcion -z de pg_dump trabaje mejor, se documenta en la pagina de manual(Tom
Se anade la clausula HAVING con total soporte para subconsultas y uniones(Stephan)
Texto completo de las rutinas de indexado en contrib/fulltextindex(Maarten)
Los ids de transacciones se almacenan ahora en memoria compartida(Vadim)
Nuevo PGCLIENTENCODING cuando ejecutan el comando COPY(Tatsuo)
Soporte para la sintaxis SQL92 "SET NAMES"(Tatsuo)
Soporte para LATIN2-5(Tatsuo)
Anadido el caso UNICODE los test de refresion(Tatsuo)
Depuracion de gestor de bloqueos, nuevos modos de bloqueos para LLL(Vadim)
Se permite el uso de indice en clausulas OR(Bruce)
Se permite "SELECT NULL ORDER BY 1;"
La explicacion VERBOSE del plan lo imprime, y ahora imprime en bonito el plan al
fichero de log del postmaster(Bruce)
Se anaden indices al display para el comando \d(Bruce)
Se permite el GROUP BY en funciones(David)
Nuevo pg_class.relkind para obejtos grandes(Bruce)
Nuevo modo de enviar libpq mensajes NOTICE a diferentes localizaciones(Tom)
Nuevo comando de escritura \w para psql(Bruce)
Nuevo /contrib/findoidjoins escanea columnas oid para encontrar relaciones de union(Bruce)
Se permite que sean considerados indices compatibles binarios cuando se verifican
indices validos para una clausula de restriccion conteniendo una constante(Thomas)
Nuevo codigo ISBN/ISSN en /contrib/isbn_issn
Se permite NOT LIKE, IN, NOT IN, BETWEEN, y NOT BETWEEN constraint(Thomas)
Nuevo sistema de reescritura corrige muchos problemas con reglas y vistas(Jan)
* Reglas en trabajos relacionados
* Cualificaciones de eventos en trabajos de inserciones/actualizaciones/borrados
* Nueva variable OLD para referirse a CURRENT, CURRENT se eliminara en un futuro
* Las reglas de actualizacion se pueden referir a NEW y OLD en la regla cualificac
* Inserciones/actualizaciones/borrados en vistas de trabajo
* Reglas multiples de accion se soportan ahora, rodeadas entre parentesis
* Usuarios normales pueden crear vistas/reglas en las tablas en las que tengan per
* Las reglas y las vistas heredan los permisos del creador
* No hay reglas a nivel de columna
* No hay reglas de ACTUALIZACION NUEVA/VIEJA (UPDATE NEW/OLD)
* Nuevas vistas de sistema pg_tables, pg_indexes, pg_rules y pg_views
* Solo se puede ejecutar una accion en las reglas de SELECT
* Re escritura total revisada, tal vez para la 6.5
* manejo de subselects
* manejo de agregaciones en vistas
* manejo de inserciones dentro de una seleccion desde una vista ahora funciona
Los indices del sisteme ahora son multi-clave(Bruce)
Los tipos Oidint2, oidint4, y oidname types se eliminan(Bruce)
Se utiliza cache del sistema para mas busquedas en tablas del sistema(Bruce)
Nueva lenguaje de programacion en el proceso en servidor(backend) PL/pgSQL en backend/pl(J
El nuevo tipo de datos SERIAL, auto crea la secuencia/indice(Thomas)
Se permite la comprobacion de declaraciones sin recompilar(Massimo)
Mejoras en el bloqueo de usuario(Massimo)
Nuevo comando setval() para configurar el valor de una secuencia(Massimo)
Auto eliminacion del fichero de socket de unixsi no hay un postmaster ejecutandose(Massimo
Paquete de traceo condicional(Massimo)
Nuevo comando UNLISTEN(Massimo)
Psql y libpq se compilan ahora bajo win32 utilizando win32.mak(Magnus)
Lo_read ya no almacena rastros NULL (Bruce)
Los identificadores son truncados ahora internamente a 31 caracteres(Bruce)
Opciones de createuser estan disponibles ahora en la linea de comando
Anadido soporte para codigo de enteros de 64-bit, configuracion comprobada, tipos de int8(
Se previene la perdida de un descriptor a causa de un COPY fallido(Bruce)
Nuevo comando pg_upgrade(Bruce)
Directorios Updated /contrib (Massimo)
Nueva setencia CREATE TABLE DEFAULT VALUES disponible(Thomas)
Nueva sentencia INSERT INTO TABLE DEFAULT VALUES disponible(Thomas)
Nueva prestacin DECLARE y FETCH(Thomas)
Estructuras internas de libpq ahora no se exportan (Tom)
Se permiten indices con mas de 8 claves(Bruce)
Se elimina el teclado ARCHIVE, que ya no se utiliza(Thomas)
La opcion -n de pg_dump para suprimir comillas alrededor de los identificadores
se deshabilita las columnas del sistema para las vistas(Jan)
nuevos tipos INET y CIDR para direcciones de red(TomH, Paul)
No mas comillas en las salidas de psql
pg_dump ahora vuelca las vistas(Terry)
nuevo SET QUERY_LIMIT(Tatsuo,Jan)
Referencias:
http://www.postgresql.org/docs/current/interactive/monitoring-stats.html
http://www.postgresql.org/docs/current/interactive/runtime-config-statistics.html
Ejemplos:
-- conexiones actuales
SELECT datname,usename,current_query FROM pg_stat_activity ;
-- consultas activas
SELECT datname,usename,current_query
FROM pg_stat_activity
WHERE current_query != '<IDLE>' ;
-- consultas en espera
SELECT datname,usename,current_query
FROM pg_stat_activity
WHERE waiting = true;
Monitorizacin
Vie, 18/02/2011 - 15:07 rafaelma
Existen numerosos programas que nos pueden ayudar a realizar la monitorizacin de nuestros sistemas
PostgreSQL. A continuacin teneis los mas usados en el mundo de programas de cdigo abierto.
Ad Hoc: vmstat, iostat, sar, ps, top, iotop, htop, etc en la linea de comandos de vuestro sistema
operativo, e informacin interna de vuestra instalacion postgreSQL via las vistas y tablas de
sistema en la base de datos.
Preventiva: "Nagios" para detectar y alertar sobre posibles problemas y "Munin" para crear
grficas histricas con las tendencias y uso de nuestros sistemas.
Los elementos a monitorizar son todos aquellos que nos puedan dar informacin sobre como nuestro
sistema est funcionando y comportandose. Tendremos que monitorizar los componentes de la
infraestructura necesaria para que nuestro sistema funcione, los servidores que estamos utilizando, el
uso de los recursos que se estn utilizando y la informacin interna en la base de datos que nos de datos
sobre como se est usando PostgreSQL.
Algunos de los elementos ms importantes que se suelen monitorizar son los siguientes:
Ademas de estos elementos, suelen existir caractersticas especficas a cada sistema que cada
administrador deber identificar y monitorizar de la mejor manera posible.
Monitorizacin Ad Hoc
Como ya hemos comentado, este tipo de monitorizacin se utiliza generalmente para investigar una
situacion puntual, en la que entramos en el sistema, recogemos los datos deseados por un periodo de
tiempo y pasamos a su posterior anlisis para intentar encontrar una explicacin a la situacin o
problema que estamos intentado resolver.
A continuacin teneis una breve introduccin a las herramientas del sistema operativo usadas ms a
menudo en esta monitorizacin. Todas estas herramientas se pueden usar con multitud de opciones y
parmetros, para obtener informacin detallada sobre los mismos usar el comando "man programa"
vmstat: Este comando se suele usar para obtener, entre otras cosas, informacin sobre el uso de
memoria, swap, I/O total y cpu del sistema. La primera fila del resultado por defecto da los valores
medios desde la ltima vez que se arranco el sistema. Es un programa que te da informacin global e
instantanea del sistema en un momento determinado.
En sistemas debian/ubuntu este programa esta incluido en el paquete procps y si no esta instalado se
puede instalar con el siguiente comando:
$ vmstat -n 1 10
El tamao de bloque por defecto es 1024 bytes (1Kb) y el significado de las distintas columnas es el
siguiente:
iostat: Este comando se suele utilizar para obtener informacin sobre la entrada/salida de datos de todos
los dispositivos, particiones y sistemas de ficheros NFS. Por defecto, el primer resultado da los valores
medios desde la ltima vez que se arranco el sistema. Es un programa que te da informacin sobre el I/O
del sistema para todos los dispositivos en un momento determinado.
En sistemas debian/ubuntu este programa est incluido en el paquete sysstat y si no esta instalado se
puede instalar con el siguiente comando:
$ iostat -k -p 1 2
El tamao de bloque por defecto usado por este programa es 512 bytes. El parmetro -k nos cambia el
valor de bloque a 1024 bytes (1Kb). El significado de las distintas columnas es el siguiente:
sar: Este programa se suele utilizar para recolectar y grabar informacin sobre nuestro sistema durante
un periodo de tiempo.
En sistemas debian/ubuntu este programa est incluido en el paquete sysstat y si no esta instalado se
puede instalar con el siguiente comando:
La recoleccin de datos se llama desde cron (/etc/cron.d/sysstat), y por defecto no est activado. Para
activar la recoleccin de datos una vez instalado deberemos cambiar un parmetro en el fichero
/etc/default/sysstat y arrancar el servicio:
ENABLE="TRUE" en /etc/default/sysstat
$ sudo /etc/init.d/sysstat restart
Un resultado tpico de ejecutar este comando despues de un tiempo desde que se activa la recoleccin de
datos podria ser el siguiente:
$ sar
ps: Este programa nos da informacin sobre los procesos que se estn ejecutando en nuestro sistema. En
el caso de procesos PostgreSQL nos puede dar informacin muy valiosa sobre cuantos procesos
PostgreSQL se estn ejecutando y que estn haciendo.
Un resultado tpico de ejecutar este comando para obtener los procesos PostgreSQL del sistema,
ordenados por el momento en que empezaron a ejecutarse, podria ser el siguiente:
postgres 862 .... 07:59 0:00 postgres: postgres postgres [local] idle in transaction
postgres 1921 .... 09:22 0:00 postgres: postgres postgres 127.0.0.1(39475) idle
postgres 21074 .... 14:14 0:04 postgres: postgres pgbench [local] COMMIT
postgres 21073 .... 14:14 0:04 postgres: postgres pgbench [local] UPDATE waiting
Los que nos suelen interesar en este caso son los procesos creados por conexiones de clientes a nuestro
servidor PostgreSQL. Estos procesos se muestran con el siguiente formato:
Como podeis ver, podemos obtener informacin sobre que usuario est utilizando el cliente para
conectarse, a que base de datos se est conectando, desde que mquina y puerto (o socket [local]) se ha
conectado y que est haciendo. Los valores de la actividad que est realizando podrn ser:
Adems podemos obtener informacin sobre como esta funcionando PostgreSQL internamente a travs
de las vistas y tablas de sistema en la base de datos. En sucesivos artculos iremos viendo que tipo de
informacin contienen y como interpretar estas vista/tablas de sistema.
Para que muchas de estas vistas/tablas funcionen debemos tener activados estos parmetros en nuestro
sistema, track_counts, track_functions, track_activities, bien en el fichero postgresql.conf o definidos con SET /
ALTER DATABASE en la sesin o base de datos de la que queremos obtener informacin.
Existen muchas vistas y tablas internas pero las que se usan mas comunmente para obtener informacin
de PostgreSQL son las siguientes:
pg_roles: Informacin sobre todos los roles y usuarios definidos en la base de datos.
rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolconnlimit | rolpassword | rolvaliduntil |
rolconfig | oid
----------+----------+------------+---------------+-------------+--------------+-------------+--------------+-------------+---------------
+-----------+-----
postgres | t |t |t |t |t |t | -1 | ******** | | | 10
(1 row)
pg_database Informacin sobre todas las bases de datos definidas en nuestro sistema.
datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid |
dattablespace | datacl
-----------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------
+---------------+-------------------------------------
(4 rows)
pg_locks: Informacin sobre los bloqueos activos en nuestras bases de datos. Vista complicada de
entender pero muy valiosa en ciertas situaciones.
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid |
mode | granted
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+------
+------------------+---------
(23 rows)
pg_stat_activity: Informacin sobre todos los procesos clientes conectados a la base de datos.
iting | current_query
-------+----------+---------+----------+----------+------------------+-------------+-------------+-------------------------------
+-------------------------------+-------------------------------+---------+-----------------------------------------------------------------------
(4 rows)
datid | datname | numbackends | xact_commit | xact_rollback | blks_read | blks_hit | tup_returned | tup_fetched | tup_inserted |
tup_updated | tup_deleted
-------+-----------+-------------+-------------+---------------+-----------+----------+--------------+-------------+--------------+-------------
+-------------
(4 rows)
pg_stat_user_tables: Informacin de uso de todas las tablas de usuario en una base de datos
relid | schemaname | relname | seq_scan | seq_tup_read | idx_scan | idx_tup_fetch | n_tup_ins | n_tup_upd | n_tup_del |
n_tup_hot_upd | n_live_tup | n_dead_tup | last_vacuum | last_autovacuum | last_analyze |
last_autoanalyze
-------+------------+------------------+----------+--------------+----------+---------------+-----------+-----------+-----------+---------------
+------------+------------+-------------------------------+-------------------------------+-------------------------------
+-------------------------------
(4 rows)
pg_stat_user_indexes: Informacin de uso de todos los ndices de usuarios en una base de datos
-------+------------+------------+------------------+-----------------------+----------+--------------+---------------
pg_statio_user_tables: Informacin de acceso a disco y memoria cache de todas las tablas de usuario en
una base de datos.
-------+------------+------------------+----------------+---------------+---------------+--------------+-----------------+----------------
+----------------+---------------
(4 rows)
pg_statio_user_indexes: Informacin de acceso a disco y memoria cache de todos los ndices de usuario
en una base de datos.
-------+------------+------------+------------------+-----------------------+---------------+--------------
(3 rows)
-------------------+-----------------+--------------------+---------------+------------------+-----------------+---------------
(1 row)
Monitorizacin preventiva
Como hemos comentado al principio, este tipo de monitorizacin se utiliza para detectar interrupciones
de servicios, alertar sobre posibles problemas y crea grficos con tendencias y datos histricos sobre
nuestros sistemas. Los dos programas de cdigo abierto mas utilizados para este tipo de monitorizacin
son:
Nagios: Se utiliza para detectar interrupciones de servicios y alertar sobre posibles problemas o
situaciones que necesitan una atencin especial por parte de los administradores del sistema. Su
instalacin y configuracin se escapa al objetivo de este documento. Ms adelante escribiremos
un artculo sobre como utilizar Nagios.
Munin: Se utiliza para crear grficas histricas con las tendencias y uso de nuestros sistemas.
Imprescindible para ver como nuestros sistemas se estn utilizando en el tiempo y si existen
tendencias en el uso que van a requerir nuestra intervencin en el futuro. Su instalacin y
configuracin se escapa al objetivo de este documento. Ms adelante escribiremos un artculo
sobre como utilizar Munin.
Aqu teneis algunos ejemplos de lo que se puede hacer con este programa:
Ms informacin
Consideraciones Preliminares
Antes de comenzar debemos tener en cuenta a que plataformas est destinado este White Paper:
En este documento, ud. encontrar los caminos para monitorear un servidor Postgresql
utilizando las herramientas incorporadas en el sistema operativo ms, algunas adicionales que
pueden ser descargas gratuitamente desde el sitio pgfoundry.org (repositorio oficial de Postgresql).
Para entender de manera cabal este White Paper, le aconsejamos tener conocimientos bsicos
de programacin sobre bash (GNU/Linux y derivados de Unix) y batch en Windows. Tambin
deber conocer muy pequeos conceptos de expresiones regulares en Perl o Python, pero no sern
obligatorios en un principio.
Objetivos de la monitorizacin
Por lo que deducimos que tenemos tres grupos: actividad del motor, comportamiento del
servidor e investigacin de consultas.
Los procesos son tareas que se ejecutan con una cuota de tiempo en el procesador. Cada
proceso, puede tener hilos de ejecucin internos, simulando tener varios procesos hijos. Los
procesos pueden consumir rangos de memoria y tiempos de procesamiento determinados en la
configuracin del sistema operativo y desde las aplicaciones o herramientas que los lanzan.
Los procesos tienen asignados una prioridad. Es esta la que le indica al sistema operativo
cuanto tiempo y cantidad de recursos de procesador le asignar. En el caso especfico de
plataformas Unix o derivadas, este valor puede ir de -20 a 20, siendo la menor, la ms prioritaria.
En Windows, desde el Administrador de Tareas, ctfmon.exe o tasklist desde la lnea de comandos,
podremos observar 6 niveles de prioridades que van desde 'Tiempo Real' a 'Baja'.
Existen herramientas especficas en Postgresql para la efectivizacin de este tipo de tests, entre
ellos el ms popular es PgBench. Sin embargo, y gracias al auge de los lenguajes de scripting, es
muy sencillo disear un bench que incluya las particularidades de nuestro sistema.
PgBench requiere primero una creacin de una relacin (pgbench_branches), por lo que el
primer comando a ejecutar es 'pgbench -U<usuario> -i <base>' . Luego, simplemente quitamos la
opcin -i. Podemos indicar cantidad de conexiones (-c num), forma de comprometer una consulta (-
M [extended|simple|prepared]), cantidad de transacciones por cliente (-t num), duracin en
segundos (-T num_segundos), entre otras.
Existe otra herramienta (benchmark.py), la cual esta disponible de manera totalmente libre en
nuestro track (desarrollos.siu.edu.ar/trac/postgresql).
Para hacer ms legible el presente documento, dividiremos el monitoreo de los procesos desde
el SO y desde la base, as como tambin las herramientas especficas para cada plataforma.
Con respecto a los tests, utilizaremos unidades de testeo con herramientas propias de
Postgresql.
Existen una serie de comandos de los que el usuario debe estar familiarizado con su salida:
ps
lsof
free
iostat
mpstat
sar (si lo tiene)
htop o top
vmstat
/etc/init.d/postgres status o service postgres status (de acuerdo a la distribucin)
netstat
pgrep
awk y perl (bsico)
Tuberas y redirecciones.
Permisos de usuarios (muchas veces si el usuario no tiene permisos, no podr ver los
procesos)
Comandos
Esto indica que el servidor est corriendo. Si observamos en ms detalle nos esta diciendo:
El PID 4526 nos est informando el proceso principal que se abri contra el cluster. Tambin
nos esta informando la ruta de la ubicacin fsica del PGDATA.
El PID 4622 es el proceso de escritura sobre la base.
El PID 4623 es el proceso que escribe sobre la WAL.
El PID 4624 es el proceso de autovacuum y el 4625 es el recolector de estadsticas. Estos
dos procesos puede ser desactivados, pero no es recomendable hasta el momento.
El PID 4739 es un cliente abierto. Nos est indicando tambin sobre que base y que usuario
se estn utilizando. Incluido a esto, tambin nos informa que se est accediendo localmente.
Viendo ms de cerca los procesos, podemos aadir mayores opciones al comando 'ps', para que
nos muestre informacin ms detallada.
# ps u C postgres C postmaster
Esto nos dar informacin ms precisa y extensa, lo que incluye el tiempo de consumo en CPU.
Los parmetros C permiten filtran por ocurrencias (postmaster es un alias que qued por
compatibilidad con versiones anteriores y se suele utilizar para identificar la conexin al PGDATA).
Adems este comando nos permite hacer cosas algo ms avanzadas como por ejemplo:
Vamos a ir un paso ms all de los procesos. Una de las cosas ms importantes que debemos
saber es a que archivos est accediendo un determinado proceso. En el ejemplo siguiente, se decidi
obtener el listado de todos los archivos que estn siendo accedidos por el proceso de escritura WAL.
Se le aadi un filtro 'head' para fines de legibilidad.
Saber cuantos archivos consume el servidor de base de datos es importante para tener en cuenta
el parmetro del kernel (maxfiles, openfiles). Este parmetro establece el mximo de archivos
abiertos. Esto es de suma importancia en ambientes crticos.
Una de las formas con la que podemos saber cuantos archivos est accediendo el servidor
postgres, es tecleando:
Esto es simplemente el total de ocurrencias que filtra la expresin regular de Perl. Esta lnea no
es lo suficientemente inteligente como para diferenciar entre distintos clusters (recordar que
podemos tener dos clusters en una mquina, lo que el conteo debera hacerse por separado).
Debemos tener en cuenta que hay procesos que son netamente del servidor, por lo que no son
conexiones clientes.
Una de las cosas que ms afecta el rendimiento de las bases de datos, son los procesos I/O. Por
lo tanto, cuanto ms logremos disminuir la latencia en estos procesos, menores sern los tiempos de
respuesta. Es por eso que siempre es recomendable configurar un RAID para una base de datos.
La herramienta iostat no permitir ver las estadsticas de escritura y lectura en disco. Puede que
algunas versiones de Linux no incluyan las herramientas de stat, por lo que debemos instalarlas
ejecutando:
# iostat d 2
De este grfico podemos observar que: el servidor tiene 3 discos (de los cuales 1 es el que est
siendo escrito), el porcentaje de iowait (es la espera para poder escribir y leer y a mayor porcentaje,
indicar necesidad de contar con ms recursos en almacenamiento separados o RAID).
Si bien iostat y lsof son comandos muy tiles, puede que no sean tan intuitivos a primera vista.
Existe una herramienta en particular que es muy sencilla y que permite ver los recursos consumidos
en I/O por proceso. Es iotop, una herramienta desarrollada en Python y pueden encontrarla en su
sitio web http://guichaz.free.fr/iotop. Esta herramienta requiere que tengamos Python, kernel
superior a 2.6 e instalado el paquete python-pkg-resources (en debian y derivados). Requiere
adems algunos parmetros en el kernel activados.
Cuando el servidor se queda sin memoria o el proceso de postgres requiere ms memoria RAM
de la que el SO le puede otorgar a las aplicaciones, el SO comienza a 'swapear' (anglicismo que
indica que se comenz a utilizar el archivo de intercambio para trabajos que no pueden ser
ejecutados en RAM por falta de espacio o cuota asignada). Este mecanismo, por lo general, arroja
muy malos tiempos de respuesta por lo que debemos evitar en todo momento que el servidor se vea
obligado a 'swapear'.
Los comandos free y vmstat nos permitirn ver el espacio libre de memoria RAM y el uso de la
particin virtual o Swap.
La imagen anterior fue ejecutada con el comando 'free ; vmstat 1 1'. Se recomienda utilizar
watch para que muestre los resultados de manera constante y dinmica.
Del primer prrafo del resultado del comando anterior, nos interesa la lnea 'Swap'. Si
verificamos el valor 'used' est en 0, por lo que indica que hasta el momento todos los procesos
estn usando la RAM.
Tambin vemos que el total de la memoria RAM es de 605000 MB, teniendo libres 308880.
EL segundo prrafo corresponde al comando 'vmstat', el cual nos indica que no hay actividad
en la swap (si 0, so 0).
Otra de las cosas que nos interesa saber es la actividad del procesador. El comando para esto es
'mpstat'.
Tanto top como htop son muy amigables, por lo que no deberan tener mayores inconvenientes
en la lectura de sus resultados.
Hemos configurado el servidor para que pueda escuchar sobre el puerto 5432, pero adems le
establecimos que pueda escuchar desde otro host (esto ltimo agrega que el puerto no slo esta
creado sino habilitado para recibir y comunicarse con otros clientes en otras terminales).
La forma manual de investigar acerca de los procesos es buscando dentro de la carpeta /proc.
En dicha carpeta encontraremos, por PPID, la informacin de cada proceso.
Por ejemplo:
Esta lnea de comando simplemente muestra los contenidos del archivo stat dentro de cada
directorio de /proc/<pid>.
Para conocer el contenido de los archivos de /proc, lea el link [1] que se adjunta al final de la
documentacin.
Otra de las tareas importantes es monitorear el espacio libre que queda en el disco. Si el disco
se llena, los datos no se corrompern pero el servidor entrar en el estado PANIC y caer, por lo que
es muy til tener en cuenta o monitorear constantemente estos valores, en especial si utilizamos
PITR o particiones separadas para los archivos de la WAL.
El comando df h nos mostrar todas las particiones montadas y el espacio que se est
utilizando de cada una de ellas. Para saber el tamao actual del directorio que contiene los archivos
de la WAL podemos utilizar du h /ruta/a/la/WAL.
Existen otras herramientas privativas y libres para la medicin estadstica de los recursos.
Como otra recomendacin, se encuentra elevar el valor por defecto de la variable del motor
default_statistics_target. Un valor recomendado para un servidor en produccin es superior a 100.
Luego de eso, se puede establecer un nmero mayor o menor de acuerdo a la importancia de la
tabla.
En cuanto a los logs, por lo general, en un sistema en produccin variarn de acuerdo a una
situacin en especial. El nico recaudo a tener es que a medida que el nivel de mensajes que se
almacenan son ms detallados y a valores ms bajos (DEBUG[1-5]) ms sobrecarga a nivel de
procesamiento y mayor espacio de almacenamiento se ver afectado. Por ello, siempre se
recomienda que el almacenamiento de logs se haga separado del almacenamiento de la base y los
servidores de aplicacin. Esto adems permite que el sistema de ficheros a utilizar sea el ms
sencillo (caso ext2-3, FAT).
Iopp es una herramienta desarrollada en postgres que sirve para medir las estadsticas de i/o
por proceso (http://git.postgresql.org/gitweb?p=iopp.git;a=blob_plain;f=iopp.c;hb=HEAD).
Requiere ser compilada con gcc, las indicaciones se hallan en el mismo rbol del git. Asimismo, se
requiere tener compilado el kernel de linux con el soporte para el archivo /proc/<pid>/io. Nuevas
versiones de kernel, soportan esta opcin de manera automtica.
Otra herramienta sencilla de instalar es pgstat. Desarrollada en python, puede ser descargada
del PgFoundry y slo requiere descomprimir y ejecutar, indicando a travs de parmetros la base y
el usuario. Est en versin beta an, pero es utilizable. Personalmente realic algunas
modificaciones en este aplicativo, pueden escribirme al mail personal en caso de estar interesados
(ya que al momento de escribir este documento, los cambios no fueron aprobados an por el autor).
La herramienta grfica ms estable para el monitoreo es PgAdmin. Para acceder a esta opcin
debemos ir al men Tools->Server Status. Ah podremos ver la actividad de las conexiones, los
bloqueos y las transacciones. Desde all mismo podremos seleccionar backends y cancelar sus
consultas o terminarlos. Se puede establecer inclusive el intervalo en segundos.
Existe una herramienta que recientemente adhiri un plug-in para recoleccin de estadsticas
(collectd). En el momento que se escribi este documento la ltima versin es la 4.8.0. Para
descargar la misma utilizamos wget:
# wget http://ipv4.collectd.org/files/collectd-4.8.0.tar.gz
# gzip d collectd-4.8.0.tar.gz
# tar xvf collectd-4.8.0.tar
Le recomiendo leer el link [2] para obtener detalles ms avanzados de cmo configurar este
servicio. Para la compilacin se necesita el compilador gcc y las libreras libdbd-pg-perl y libperl-
dev, asi como las libreras por estndar de gcc. Cuando ejecutemos ./configure (que por defecto
tratar de compilar con todos los plugins), debemos verificar que la lnea postgresql yes est en la
salida. Caso contrario puede que aparezca un dependency failed o un error que no permita su
compilacin.
Las tablas-vistas que nos proveen informacin de escritura y lectura de bloques son:
pg_stat_*
pg_statio*
Las consultas sobre el catlogo se realizan a travs de SQL, y slo debemos considerar que
existen tipos de datos especficos para la relacin entre las mismas (OID).
Asimismo poseemos funciones especiales para la administracin de los backends, desde al base
de datos, permitiendo as, una administracin ms cabal simplemente desde cualquier cliente.
Contabilizar conexiones:
SELECT SUM(n_tup_ins),
SUM(n_tup_upd), SUM(n_tup_del)
FROM pg_stat_all_tables;
SELECT SUM(seq_scan),
SUM(seq_tup_read), SUM(idx_scan),
SUM(idx_tup_fetch)
FROM pg_Stat_all_tables;
Visualizar bloqueos:
Sumarizacin de I/O en bloques (bloques son de 8k), si desea saber en cantidad de Kb,
multiplique por 8:
SELECT SUM(heap_blks_read) * 8
FROM pg_statio_user_tables;
SELECT SUM(idx_blks_read)
FROM pg_statio_user_tables;
SELECT SUM(toast_blks_read)
FROM pg_statio_user_tables;
SELECT SUM(tidx_blks_read)
FROM pg_statio_user_tables;
select pg_database_size(name);
select pg_tablespace_size(name);
SELECT pg_stat_get_backend_pid(s.backendid)
as procpid,
pg_stat_get_backend_activity(s.backendid)
as current_query
FROM
(SELECT pg_Stat_get_backend_idset()
as backendid) AS s;
FROM pg_class
WHERE relname = 'tabla';
Para indices:
Monitorear estado de las tuplas por esquema (preferentemente utilice la opcin \x en psql):
SELECT schemaname ,
sum(seq_scan) as Seq_Scan,
sum(seq_tup_read) as Tuplas_seq_leidas,
sum(idx_scan) as Indices_scaneados ,
sum(idx_tup_fetch) as tuplas_x_indices_fetchs,
sum(n_tup_ins) as tuplas_insertadas, sum(n_tup_upd) as tuplas_actualizadas,
sum(n_tup_del) as tuplas_borradas,
sum(n_tup_hot_upd) as tuplas_actualizadas_hot,
sum(n_live_tup) as tuplas_vivas,
sum(n_dead_tup) as tuplas_muertas
FROM pg_stat_all_tables
WHERE schemaname !~ '^pg.*'
GROUP BY schemaname;
La siguiente consulta obtiene los datos necesarios para calcular los accesos a disco, tambin
podremos obtener una sumarizacin de las tuplas vivas y muertas de toda la base:
SELECT
max(xact_commit) as commits,
max(xact_rollback) as rollbacks,
max(blks_read)::text
|| '/' || (max(blks_read)*8)::text || 'kbs'
as bloques_leidos,
max(blks_hit),
max(numbackends) as numbackends,
sum(seq_scan) as seq_scans,
sum(seq_tup_read) as seq_tup_reads,
sum(idx_scan) as idx_scans,
sum(idx_tup_fetch) as idx_fetchs,
sum(n_tup_ins) as tup_ins,
sum(n_tup_upd) as tup_upds,
sum(n_tup_del) as tup_dels,
max(c.locks) as locks,
max(d.sess) as active,
sum(k.dead) as dead_tup,
sum(k.live) as live_tup
FROM pg_stat_database a, pg_stat_user_tables b,
(SELECT xp.n_dead_tup as dead,
xp.n_live_tup as live
FROM
(SELECT c.relname as nombre
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_roles r
ON r.oid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n
ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND n.nspname <> 'pg_catalog'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
) xx JOIN pg_stat_all_tables xp
ON xx.nombre = xp.relname
) k,
(SELECT count(*) as locks from pg_locks) c,
(SELECT count(*) as sess
FROM pg_stat_activity
WHERE current_query !~ '.*<IDLE>*') d
WHERE datname = '<nuestra_base>';
La vista pg_stats, contiene las estadsticas por columna, por lo que filtraremos por tabla.
Arroja:
Esta vista contiene los datos de cada columna, y es importante ya que nos indicar la frecuencia
de determinados valores en las columnas, pudiendo inferir directamente en el plan de ejecucin. El
caso ms comn es cuando un valor determinado tiene una frecuencia superior a 0.3, en cuyo caso
el planeador preferir accesos por Seq_scan debido a la repeticin de datos.
Esta vista utiliza los valores de la tabla pg_statistic y es mucho ms accesible que esta ultima
en trminos de consultas.
Esta vista nos puede mostrar el estado de cada relacin, incluidos sus ltimos mantenimientos,
tuplas actualizadas, estimacin de tuplas muertas y vivas, etc.
Tambin poseemos las vistas para los ndices, que nos pueden indicar cuales son los ndices
ms utilizados o, lo que es ms til, los menos utilizados (pg_stat_user_indexes,
pg_statio_user_indexes).
Existen una serie de variables que mejoran la recoleccin de estadsticas (adems obviamente
de realizar usualmente ANALYZE a la base).
Existen otras variables que pueden ser de utilidad tambin: log_parser_stats, log_planner_stats,
log_executor_stats y log_statement_stats. Por defecto estn en off. Las variables al ser activadas
acarrean mayor necesidad de procesamiento del recolector, por lo que afectan directamente al
rendimiento del servidor. Si log_statement_stats est en on, las otras deben estar en off, debido a
que esta contiene las otras. El resto son configuraciones por mdulo.
Esta opcin genera bastante overhead, as que es recomendable activarla cuando estamos en
proceso de afinamiento de determinadas consultas o del servidor.
Otra de ellas es default_statistics_target, por defecto est en un valor de 10, pero en produccin
se recomienda un valor de 100 en produccin.
Archivado de Logs
Los archivos de logs suelen ser molestos porque consumen ms I/O a medida que necesitamos
ms nivel de informacin.
Sin embargo, tenerlos bajo control es indispensable ya que son los nicos testigos de un error o
una situacin a la que posiblemente no podamos reproducir fcilmente en un ambiente aislado.
log_destination: este valor indica a que salida van dirigidos los mensajes.
log_filename: nombre del archivo de log. Este podr utilizar un formato compatible con
POSIX (%Y=ao, %m= mes, %d=da , etc.)
La rotacin de un log, es la accin de llegar a un lmite establecido y empezar a loguear en un archivo vaco o nuevo.
log_line_prefix: esta variable indica como va a estar formateada la salida del log. PgFouine
requiere que establezcamos esta variable para analizar el log.
log_statement: esto indica que tipo de sentencias irn al log (ddl, mod, all).
Tal como dijimos antes, la herramienta ms popular de revisin de logs es PgFouine. Est
escrito en PHP, por lo que requiere la instalacin del paquete php5-cli (Debian y derivados).
La desventaja que tiene PgFouine es que requiere tocar la salida de los logs, por lo que al
principio puede parecer incomodo.
PgFouine tiene varias opciones, las que podremos ver ejecutando 'pgfouine.php' en la linea de
comando. La ejecucin bsica seria : 'pgfouine.php -file <archivo_log> -logtype stderr'. La opcin
logtype deber corresponder a la que tenemos en el postgresql.conf (log_destination). Previo a esto
debemos preformatear la salida (log_line_prefix) a: '%t [%p]: [%l-1] ' si utilizamos stderr.
Monitorizacin6
Contenido
[ocultar]
1
Introducci
n
2 Saber si
la base de
datos esta
en marcha
3 Usando
herramient
as
estandard
de Unix
4
Determina
ndo el uso
de disco
4.1
Ejemplos
5 Saber los
usuarios
conectados
6
Estadstica
s
6.1
Configurac
in de la
recoleccin
de
estadsticas
6.2
Visualizar
las
estadsticas
7
Visualizaci
n de locks
8 Ver los
ficheros de
log
9 Tablas de
sistema
Introduccin
A continuacin describimos las tareas bsicas de monitorizacin del agente de base de datos PostgreSQL.
pg_ctl status
pg_ctl: el servidor est en ejecucin (PID: 4567)
C:/Archivos de programa/PostgreSQL/8.2/bin/postgres.exe "-D" "C:/Archivos de
programa/PostgreSQL/8.2/data"
Como vemos el mensaje que nos muestra es que el sistema esta el servidor est en ejecucin.
Si el sistema no estaria inicializado nos daria el siguiente mensaje
En el ejemplo anterior se puede ver cmo postgres esta actualmente recogiendo estadsticas,lanzando el
procedo vacuumm, etc...
Ejemplos
Visualizar el uso de disco de cualquier tabla:
En la tabla nos muestra los usuarios conectados, los select ejecutados, la terminal, el puerto, etc.
Estadsticas
El statistics collector de Postgres s un subsistema que permite la recoleccin y presentacin de
informes sobre la actividad del servidor.
Actualmente, el recolector de estadsticas puede El collector puede realizar las siguientes tareas:
Contar accesos a tablas e ndices em trminos de filas individuales o en bloques de disco.
Seguimiento del nmero de filas en cada tabla, y las horas de los timos vacuum y analyze para cada
tabla.
Contarel nmero de llamdas a las user-defined functions y el tiempo total empleado en cada una.
Determinar el comando exacto que est siendo ejecutando por otro servidor.
Nombre de
Descricin
la vista
pg_stat_ac Una lnea para cada proceso, que muestra la base de datos OID, el nombre de base de
tivity datos, la ID del proceso, el usuario OID, el nombre de usuario, la consulta actual, el
estado de espera de consulta, la hora en que la transaccin y la consulta actual se
iniciaron, hora en que se inici el proceso, la direccin del cliente y nmero de
puerto. Las columnas que se presentan los datos sobre la consulta actual estn
disponibles a menos que el parmetro track_activities haya sido desactivado.
Adems, estas columnas son slo visibles si el usuario que examina la vista es un
super-usuarioel usuario propietario del proceso que presenta.
Una fila nica, mostrando las estadsticas de todo grupo del background writer: el
nmero de checkpoints previstos, checkpoints pedidos, buffers escritso por los
checkpoints y loas escanners de limpieza y el nmero de veces background writer
pg_stat_bg
deteuvo un escanner de limpieza porque haba escrito demasiados bfferes. Tambin
writer
incluye estadsticas sobre el pool de buffers compartidos, incluyendo los buffers
escritos por backends (es decir, no por el background writer) y los buffers totales
asignados.
Una fila por base de datos, que muestra el OID de la base de datos , el nombre de
base de datos, el nmero de procesos activos del servidor conectado a la base de
pg_stat_da datos, el nmero de transacciones finalizadas y retrocedidas en esa base de datos, el
tabase total de bloques de disco ledos, y el total de buffers bloqueados (es decir, las las
solicitudes de lectura bloqueadas encontrando e bloque ya existente el buffer de la
cach), el nmero de filas devueltas, buscadas, insertadas, actualizadas y eliminadas.
Para cada tabla de la base de datos actual (incluyende tablas TOAST), el nmero oid
de la tabla, el esquema y el nombre de tabla, el mero de scans secuenciales
iniciados, el nmero de filas en vivo obtenidos por exploraciones secuenciales, el
nmero de ndice de exploraciones iniciadas (sobre todos los ndices que pertenecen a
la tabla ), el nmero de filas buscadas en directo por scans de ndices, el nmero de
pg_stat_all
filas inserradas, actualizadas y eliminadas, el nmero updates de filas que fueron
_tables
HOT (es decir, sin actualizacin por separado del ndice), el nmero de filas de vivas
y muertas, la ltima vez que se pas el porceso vacuum en la tabla manualmente,la
ltima vez que se pas el porceso vacuum en la tabla por demonio Autovacuum, la
ltima vez que fue analizada de forma manual, y la ltima vez que fue analizada por
el demonio Autovacuum.
pg_stat_sy
Igual que pg_stat_all_tables, a excepcin que slo se muestran las tablas de sistema.
s_tables
pg_stat_us
Igual que pg_stat_all_tables, a excepcin que slo se muestran las tablas del usuario.
er_tables
Por cada ndice en la base de datos actual, la tabla y el ndice OID, esquema,la tabla y
pg_stat_all el nombre del ndice, el nmero de ndice de index scan en ese ndice, el nmero de
_indexes registros retornados por los index scans, y el nmero de filas buscadas en vivo por
simples index scnas usando dicho ndice.
pg_stat_sy Igual que pg_stat_all_indexes, a excepcin que slo se muestran las ndices de las
s_indexes tablas de sistema
pg_stat_use Igual que pg_stat_all_indexes, a excepcin que slo se muestran los ndices de las
r_indexes tablas del usuario.
Para cada tabla de la base de datos actual (incluyendo tablas TOAST), el OID de la
tabla, esquema y nombre de la tabla, el nmero de bloques disco ledos de la tabla,
pg_statio_ nmero de visitas de bffer, el nmero de bloques de disco ledos y las visitas de
all_tables buffer de la tabla, el nmero de bloques de disco de ledos visitas de buffer de la tabla
TOAST auxiliar (si existe) y el nmero de bloques de disco ledos y las visitas al
buffer para el ndice de la tabla TOAST.
pg_statio_s Igual que pg_statio_all_tables, a excepcin que slo se muestran las tablas de
ys_tables sistema.
pg_statio_
Igual que pg_statio_all_tables, a excepcin que slo se muestran las tablas del
user_table
usuario.
s
Para cada ndice de la base de datos actual, el OID de la table y el ndice, el esquema,
pg_statio_
el nombre del ndice de la tabla y el ndice, el nmero de bloques de disco ledos y las
all_indexes
visitas al buffer para ste ndice.
pg_statio_s Igual que pg_statio_all_indexes, a excepcin que slo se muestran ndices de las
ys_indexes tablas de sistema.
pg_statio_
Igual que pg_statio_all_indexes, a excepcin que slo o se muestran ndices de las
user_index
tablas del usuario.
es
pg_statio_ Para cada objeto secuencia en la base de datos actual, el OID de la secuencia, el
all_sequen esquema y el nombre de la secuencia, el nmero de bloques de disco ledos y las
ces visitas al buffer en esa secuencia .
pg_statio_s Igual que pg_statio_all_sequences, a excepcin que slo se muestran secuencias del
ys_sequenc sistema. (Actualmente , no existen secuendias del sistema, por lo que la vista estar
es vaca)
pg_statio_
Igual que pg_statio_all_sequences, a excepcin que slo se muestran secuencias del
user_seque
usuario.
nces
Para todas las funciones monitorizadas, el OID de la funcin, el esquema, el nombre,
pg_stat_us
el nmero de llamadas,el tiempo total, el tiempo propio. El tiempo propio es la
er_functio
cantidad de tiempo empleado por la funcin por si misma, el total incluye el tiempo
ns
empleado en las funciones que llamdas. Los tiempos se presentan en milisegundos.
La vistas pg_statio_ sn bsicamente tiles para determinar la efectividad del buffer cache. Cuando el
nmero de lecturas de disco es mucho menor que el nmero de visitas a la cache, significa que la cache
esta leyendo satisfactoriamente la mayora de las consultas sin invocar una llamada al kernel.
Existe otra forma de acceder a las estadticas mediante llamadas a funciones que realizan consultas a las
mismas vistas comentadas en el punto anterior. Se puede obtener ms informacin sobre dichas
funciones en la Tabla 26-2. de la documentacin oficial de Postgres.
Por ejemplo, para obtener todas las consultas realizadas y su PID por todos los procesos del servidor:
procpid | current_query
---------
+----------------------------------------------------------------------------------
----------------
15973 | <IDLE>
15974 | <IDLE>
21652 | SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
: pg_stat_get_backend_activity(s.backendid) AS current_query
: FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
21704 | <IDLE>
21755 | SELECT \r
: garticul.nomart, gcomforh.delega, gcomforh.depart,\r
: gcomforl.orden, gdeparta.reflec, gcomforl.codart,\r
: (SELECT MAX(codean)\r
: FROM gartiean\r
: WHERE gcomforl.codart = gartiean.codart\r
: AND gcomforl.varlog = gartiean.varlog\r
: AND gcomforl.udmcom = gartiean.coduni\r
: AND gartiean.estado = 'A') AS codean\r
:
: INTO TEMP tmp_impeti_1_0001\r
: FROM gcomforh\r
: INNER JOIN (\r
: gcomforl LEFT JOIN garticul ON gcomforl.codart =
garticul.codigo\r
: ) ON gcomforh.cabid = gcomforl.cabid\r
: INNER JOIN gdeparta ON gcomforh.delega = gdeparta.delega AND
gcomforh.depart = gdeparta.depart\r
: WHERE \r
:
: gcomforh.docser = '04'\r
:
: ORDER BY 1, 2, 3
21768 | <IDLE>
Visualizacin de locks
Otra herramienta til para monitorizar la actividad de la base de datos es la tabla de sistema pg_locks.
Permite al administrador de la bbdd ver los bloqueos que provocan transacciones abiertas.
La tabla contiene una fila por lock active, modo de lock solicitado i transaccin. Para ms informacin,
visitar la documentacin
2007-09-10 09:20:03 LOG: database system was shut down at 2007-09-06 13:33:43 Hora
estndar romance
2007-09-10 09:20:03 LOG: checkpoint record is at 0/DB50088
2007-09-10 09:20:03 LOG: redo record is at 0/DB50088; undo record is at 0/0;
shutdown TRUE
2007-09-10 09:20:03 LOG: next transaction ID: 0/262151; next OID: 221208
2007-09-10 09:20:03 LOG: next MultiXactId: 1; next MultiXactOffset: 0
2007-09-10 09:20:03 LOG: database system is ready
2007-09-10 09:21:29 ERROR: syntax error at or near "nomtra" at character 938
2007-09-10 09:21:29 STATEMENT: --
***********************************************************************************
*
-- DEISTER WebStudio XSQL-SELECT Mon Sep 10 09:21:30 CEST 2007 Engine: postgres
--
***********************************************************************************
*
SELECT
capuntes.oid AS rowid,
capuntes.apteid, capuntes.fecha, capuntes.asient, capuntes.orden,
capuntes.jusser, capuntes.docser, capuntes.proyec, cproyect.nompro,
capuntes.seccio,
cseccion.nomsec, capuntes.sistem, capuntes.diario, cdiarios.nomdia,
capuntes.cuenta,
ccuentas.nombre, capuntes.codaux, ccuentas.estado, capuntes.ctaaux,
cctaauxl.desval,
capuntes.codcon, cconcept.coment, cconcept.opedeb, cconcept.opehab,
capuntes.concep,
capuntes.debe, capuntes.haber, capuntes.divdeb, capuntes.divhab,
capuntes.moneda,
cmonedas.desmon, capuntes.cambio, capuntes.fecval, capuntes.contra,
ccuentas2.nombre nomtra, capuntes.origen, capuntes.punteo,
capuntes.loteid,
capuntes.cosaut,
capuntes.empcode, capuntes.dimcode1, capuntes.dimcode2,
capuntes.cantid1, capuntes.cantid2,
capuntes.user_created, capuntes.date_created, capuntes.user_updated,
capuntes.date_updated,
cempresa.empname, cempresa.divemp, cmonedas_loc.desmon desmon_loc,
ccuentas.tipcta, ccuentas.codaux cta_codaux, ccuentas.ctaper,
cenllote.tabname, cenllote.colname,
FROM capuntes
LEFT JOIN cproyect ON capuntes.proyec = cproyect.codigo
LEFT JOIN cseccion ON capuntes.seccio = cseccion.codigo
LEFT JOIN ccuentas ON capuntes.cuenta = ccuentas.codigo
LEFT JOIN cctaauxl ON capuntes.codaux = cctaauxl.codaux AND
capuntes.ctaaux = cctaauxl.ctaaux
LEFT JOIN ccuentas ccuentas2 ON capuntes.contra = ccuentas2.codigo
LEFT JOIN cmonedas ON capuntes.moneda = cmonedas.codigo
LEFT JOIN cdiarios ON capuntes.diario = cdiarios.codigo
LEFT JOIN cconcept ON capuntes.codcon = cconcept.codigo
LEFT JOIN cenllote ON capuntes.loteid = cenllote.loteid
LEFT JOIN (
cempresa LEFT JOIN cmonedas cmonedas_loc ON cempresa.divemp =
cmonedas_loc.codigo
) ON capuntes.empcode = cempresa.empcode
--
=================================================================================
-- Query condition ($0) + non xml security filters
--
=================================================================================
WHERE (1=1) AND (1=0)
2007-09-10 12:24:18 LOG: received fast shutdown request
2007-09-10 12:24:18 LOG: aborting any active transactions
2007-09-10 12:24:18 LOG: shutting down
2007-09-10 12:24:18 LOG: database system is shut down
2007-09-10 12:24:19 LOG: logger shutting down
Tablas de sistema
El esquema information_schema contiene informacin sobre todos los objetos definidos en una bbdd. A
continuacin se listarn las vistas presentes en el information esquema. Para ms detalles visitar la
Documentacin
information_schema_catalog_name
administrable_role_authorizations
applicable_roles
attributes
check_constraint_routine_usage
check_constraints
column_domain_usage
column_privileges
column_udt_usage
columns
constraint_column_usage
constraint_table_usage
data_type_privileges
domain_constraints
domain_udt_usage
domains
element_types
enabled_roles
foreign_data_wrapper_options
foreign_data_wrappers
foreign_server_options
foreign_servers
key_column_usage
parameters
referential_constraints
role_column_grants
role_routine_grants
role_table_grants
role_usage_grants
routine_privileges
routines
schemata
sequences
sql_features
sql_implementation_info
sql_languages
sql_packages
sql_parts
sql_sizing
sql_sizing_profiles
table_constraints
table_privileges
tables
triggers
usage_privileges
user_mapping_options
user_mappings
view_column_usage
view_routine_usage
view_table_usage
views
El esquema information_schema es el definido por el estandard SQL, y por tanto no contiene
informaccin relativa a caractersticas propias de Postgres. Estas caractersticas se encuentran las tablas
de catlogo del sistema:
Nombre de
Descripcin:
catlogo
pg_aggregate Las funciones de agregado
pg_am Mtodos de acceso de ndice
pg_amop mtodo de acceso de los operadores
pg_amproc mtodode acceso de los procedimientos
pg_attrdef valores por defecto de columna
pg_attribute columnas de la tabla (los "atributos")
pg_authid identificadores de autorizacin (roles)
pg_auth_members Identificador de las relaciones de autorizacin de miembros
pg_cast modelos (datos de las conversiones de tipos)
pg_class tablas, ndices, secuencias, puntos de vista (las "relaciones")
las restricciones de verificacin, limitaciones nicas, restricciones de clave
pg_constraint
principal, las restricciones de claves forneas
pg_conversion codificacin de la informacin de conversin
pg_database bases de datos dentro de esta base de datos de clster
pg_depend dependencias entre los objetos de base de datos
pg_description descripciones o comentarios sobre los objetos de bases de datos
pg_enum enum etiqueta y el valor de las definiciones
pg_foreign_data_wr
definiciones envoltura externa de datos
apper
pg_foreign_server definiciones de servidores externos
pg_index informacin adicional de ndices
pg_inherits jerarqua de herencia de mesa
pg_language Lenguajes para la escritura de funciones
pg_largeobject objetos de gran tamao
pg_listener apoyo a la notificacin asncrona
pg_namespace esquemas
pg_opclass mtodo de acceso de las clases de operador
pg_operator operadores
pg_opfamily mtodo de las familias el acceso del operador
pg_pltemplate templates a para las lenguas de procedimiento
pg_proc funciones y procedimientos
pg_rewrite Reglas de reescriturade consultas
pg_shdepend Dependencias de objetos compartidos
pg_shdescription los comentarios sobre los objetos compartidos
pg_statistic estadsticas planificador
pg_tablespace de tablas dentro de esta base de datos de clster
pg_trigger Disparadores
pg_ts_config configuraciones de bsqueda de texto
pg_ts_config_map asignaciones de seal configuraciones de bsqueda de texto '
pg_ts_dict diccionarios de bsqueda de texto
pg_ts_parser analizadores de bsqueda de texto
pg_ts_template bsqueda de plantillas de texto
pg_type tipos de datos
pg_user_mapping asignaciones de los usuarios a los servidores de extranjeros
Los usuarios permitidos para el establecimiento de la conexin a la base de datos son controlados por un archivo
sencillo en el directorio raz de su base de datos, llamado pg_hba.conf. En cuanto corre initdb para la creacin del
clster de la base de datos, es creado un fichero pg_hba.conf con los valores por omisin.
Los permisos que existen por omisin dependen de cmo fue invocado initdb. Por omisin, los nuevos clsters son
creados con el tipo trust con el cual, cualquier usuario local puede conectarse a la base de datos. Sin embargo, algunos
empaquetadores de PostgreSQL pueden cambiar esto. Por ejemplo, si usa 'service initdb' en Red Hat para crear el
clster, ste llama a initdb de la siguiente manera:
initdb --pgdata='$PGDATA' --auth= 'ident sameuser'
El cual usa el no particularmente popular mtodo ident para averiguar si un usuario est permitido conectarse, lo cual
suele ser frustrante para quienes no son conscientes de ello.
Una instalacin tpica recomendada para el acceso desde la red de la base de datos toma la direccin local LAN y slo
permite los clientes que se autentiquen usando una contrasea encriptada a travs de MD5. La siguiente entrada en en
el pg_hba.conf ilustrar algo como esto:
# TIPO BASE_DE_DATOS USUARIO CIDR-DIRECCIN MTODO
host all all 192.168.1.0/24 md5
Esto slo permite conectarse a los clientes con las direcciones IP de la red 192.168.1.0 -- 192.168.1.255 y slo si
proveen la contrasea correcta para el usuario. Observe que un acceso de la red como ste puede establecerse slo si
est permitido en el parmetro listen_addresses de postgresql.conf.
Las contraseas de los usuarios de la base de datos son aplicadas cuando se crea el usuario con CREATE ROLE y
pueden ser modificadas con la orden ALTER ROLE. createuser puede ser una herramienta muy til para ayudar en este
sentido.
Hay una pequea trampa aqu: puesto que para la creacin de un nuevo rol se requiere que la conexin a la base de
datos sea como un superusario, cmo se pueden empezar a crear usuarios? Un enfoque comn es comenzar con un
pg_hba.conf que confa slo a los usuarios que se conectan localmente:
# Slo conexiones locales para el socket de Unix
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
Si la base de datos est configurada de esta forma, cualquiera logueado en el sistema puede ahora conectarse al
servidor a su voluntad, as que no desea conservar esta configuracin por mucho tiempo. Lo que puede hacer ahora es
usar la orden ALTER ROLE para asignar una contrasea fuerte al superusuario postgres. Una vez que lo haya hecho,
puede detener el servicio (pg_ctl stop), cambiar todos los "trust" por "md5", agregar su rango o bloque de red completo a
pg_hba.conf, y cambiar el parmetro listen_address de postgresql.conf. Cuando lo inicie nuevamente, ya tendr una
cuenta de superusuario de la cual conoce la contrasea, con la cual puede crear las cuentas para sus usuarios
regulares.
Contents
[hide]
1
Ejempl
os
1.1
Ejempl
o1
1.2
Ejempl
o2
1.3
Ejempl
o3
1.4
Ejempl
o4
2
Autenti
cacin
LDAP
3
Artculo
s
relacion
ados
Ejemplos
Ejemplo 1
Acceso por tcp/ip (red) a la base de datos test001, como usuario test desde el ordenador con IP 10.0.0.100, y mtodo
de autentificacin md5:
host test001 test 10.0.0.100 255.255.255.255 md5
Esta misma entrada se podra escribir tambin con la mscara de red en notacin CIDR:
host test001 test 10.0.0.100/32 md5
Ejemplo 2
Acceso por tcp/ip (red) a la base de datos test001, como usuario test desde todos los ordenadores de la red 10.0.0.0,
con mascara de red 255.255.255.0 (254 ordenadores en total) y mtodo de autentificacin md5:
host test001 test 10.0.0.0 255.255.255.0 md5
Esta misma entrada se podra escribir tambin con la mascara de red en notacin CIDR:
host test001 test 10.0.0.0/24 md5
Ejemplo 3
Acceso por tcp/ip (red), encrptado, a todas las bases de datos de nuestro cluster, como usuario test desde el ordenador
con IP 10.0.0.100, y el ordenador 10.1.1.100 y mtodo de autentificacin md5 (necesitamos dos entradas en nuestro
fichero pg_hba.conf):
hostssl all test 10.0.0.100 255.255.255.255 md5
hostssl all test 10.1.1.100 255.255.255.255 md5
Ejemplo 4
Denegar el acceso a todos las bases de datos de nuestro cluster al usuario test, desde todos los ordenadores de la red
10.0.0.0/24 y dar acceso al resto del mundo con el mtodo md5:
host all test 10.0.0.0/24 reject
host all all 0.0.0.0/0 md5
Autenticacin LDAP
Postgresql nos permite comprobar los usuarios contra un sistema LDAP, aunque si bien esto es posible, hay que tener
en cuenta que el usuario igualmente debe existir en la base datos.
Parmetros que hay que considerar al realizar una peticin de autenticacin a un servidor de LDAP:
Parmetros Descripcin
ldapserver IP o dominio del servidor ldap a conectarse.
ldapprefix El nombre de usuario.
ldapsuffix El sufijo que continua al nombre de usuario, que concluira para formar el dn.
ldapport Puerto al que se va a conectar al servidor ldap, en caso de no ser especificado se utiliza el
puerto por default, 389.
ldaptls Debe setearse en 1 si se quiere que la peticin de autenticacin hacia el servidor ldap se
realize utilizando encriptacin TLS.
Programar Tareas
Contents
[hide]
1
General
idad
2
Crontab
2.1
Sintaxis
bsica
2.2
Editand
o
nuestro
fichero
crontab
2.3
Conteni
do de
un
fichero
crontab
2.4
/etc/cro
ntab
contien
e
instrucc
iones
para
que
cron
ejecute
los
scripts
de los
director
ios
3 At
3.1
Especifi
cacione
s
3.2
Opcion
es
Generalidad
Veremos como podemos configurar nuestro sistema operativo para realizar tareas peridicas de una manera muy
cmoda. Tenemos dos mecanismos bsicos para programar tareas:
-.crontab: nos permite programar tareas que queremos repetir de forma peridica.
-.at: nos permite realizar una tarea a una hora determinada pero slo una vez.
Crontab
El comando crontab (cron) nos permite programar tareas y/o ejecutar comandos peridicamente a ciertas horas, ciertos
das de la semana, del mes, del ao, etc. Con este comando, cada administradorBD puede definir sus propias tareas
programadas.
Sintaxis bsica
* crontab -l Mostrar las tareas programadas por el usuario.
* crontab -e Editar el fichero crontab. Con esto editaremos el fichero de configuracin de crontab de cada usuario
para poder modificar las tareas programadas.
* crontab -r Eliminar el fichero crontab corriente.
* crontab -u <usuario> Aplicar una de las opciones anteriores para un usuario determinado. Slo root puede
hacerlo.
# Hacer una copia de seguridad del directorio documentos cada da a las 00:00
0 0*** tar -czf docs-`date -I`.tar.gz ~/documentos/
(el smbolo ~ es equivalente a $HOME, y a /home/usuario/)
# Hacer una copia de seguridad de la Base de datos cada da a las 07:30 y 21:30
30 7 * * 1-5 /var/respaldos/scripts/mantenimiento_postgresql.sh
30 21 * * 1-5 /var/respaldos/scripts/mantenimiento_postgresql.sh
* m: minuto [0-59].
* h: hora [0-23].
* dom: da del mes [1-31].
* mon: mes [1-12].
* dow: da de la semana [0-7] (0 7 es Domingo).
* user: usuario.
* command: comando.
A la hora de expresar los minutos, horas, das, meses y ao, podemos utilizar listas: 3,23,43; rangos de tiempo: 1-5;
pasos: 2-6/2 (= 2,4,6); y * (cualquier valor).
/etc/crontab contiene instrucciones para que cron ejecute los scripts de los
directorios
* /etc/cron.hourly
* /etc/cron.daily
* /etc/cron.weekly
* /etc/cron.monthly
Agregando una lnea para cada tarea que queramos programar. Podemos hacernos nuestros scripts y hacer que
crontab los ejecute para tener tareas programadas ms complejas.
En caso de necesitar reiniciar el servicio puede realizarlo:
gilbertoc@gilbertoc:~$ service crond restart
O
gilbertoc@gilbertoc:~$ /etc/init.d/crond restart
At
Este comando nos permite ejecutar tareas a una cierta hora solamente una vez.
* <hora><dia> Para especificar la fecha por completo.
Especificaciones
* now + <intervalo> Donde intervalo es: <n> (minutos|horas|das|semanas|mes).
Opciones
* -l Para mostrar la lista de tareas que tenemos programadas.
* -d <num_tarea> Para eliminar la tarea que queramos. Cada tarea tiene asociado un nmero que podemos ver
con la opcin anterior.
Ejemplo 1:
$ at 5:30pm
o bien
$ at 17:30
Una vez que hayamos ejecutado esto nos aparecer el prompt de at para que introduzcamos nuestros comandos o
tareas que queramos que se ejecuten a esa hora:
at> gmessage "Comienza la salva de datos!!"
Una vez hayamos terminado de introducir los comandos, presionaremos Control + D para salir de at.
Ejemplo 2:
Programar tareas para dentro de 3 horas:
$ at now + 3 hours
Cambie <NameOfTheFile> por algo. Una idea es usar el nombre de la base de datos.
(Asegrese de que no haya espacios despus de la palabra BACKUP_FILE cualquier
espacio har que esta configuracin no funcione). Setting es la primera parte del nombre del
archivo seguida de la fecha en que se cre el archivo con la extensin .backup
Cambie la configuracin <PassWord> anterior a la contrasea correcta para los usuarios de
copia de seguridad. (Asegrese de que no haya espacios despus de la palabra
PGPASSWORD cualquier espacio har que este ajuste no funcione.) Descripcin de
pgPassword
Cambie <HostName> a direccin IP o nombre DNS del servidor que aloja Postgresql.
Cambiar <UserName> al usuario de copia de seguridad asegrese de que este usuario tiene
acceso a la base de datos con fines de copia de seguridad
Cambie <DATABASENAME> al nombre de la base de datos que se est realizando una copia
de seguridad.
Guarda el archivo
Crear tarea para el programador de tareas de MS
Una vez que haya elegido el contexto de seguridad para ejecutar la tarea, se recomienda
cambiar la seguridad del directorio donde se ejecuta la copia de seguridad y los archivos se
almacenan, ya que un nombre de usuario de alto nivel y una contrasea se almacenan en
texto sin formato.
Usando .pgpass y pgdumpall, mismo archivo
Para lograr una copia de seguridad automatizada en un entorno de Windows, hice lo siguiente.
Crear un archivo .pgpass
(Llam a mi pgpass.conf) y lo puso en algn lugar seguro. Lo tengo en un subdirectorio bajo el
script que ejecuta la copia de seguridad.
Bloquear el archivo .pgpass
Utilizando los permisos de NTFS, deshabilite el acceso a este archivo para todos excepto para
que el usuario pg se ejecute como
(Si ejecuta pg en la cuenta del sistema, debe configurarlo para que utilice sus propias
credenciales de usuario)
Crear un script para llamar a pg_dumpall
Mina se ve as:
SET PGPASSFILE = C: \ foo \ bar \ PG_BACKUP \ PGPASSFILE \ pgpass.conf
"C: \ Archivos de programa \ PostgreSQL \ 8.2 \ bin \ pg_dumpall.exe" -U scfcu_postgres> C: \
foo \ bar \ PG_BACKUP \ db.out current
Es importante tener en cuenta la primera lnea, que establece dinmicamente la variable de
entorno PGPASSFILE. Esto se libera una vez finalizado el script, de modo que slo este
proceso slo para el momento en que se ejecuta tiene inicio de sesin automtico. La
segunda lnea es un comando pg_dumpall muy bsico, con un nombre de usuario pasado (-
U) y el nombre de archivo de salida (db.out), as como la base de datos a la copia de
seguridad (en este caso 'actual')
Crear una tarea programada
He creado una tarea programada en Windows para ejecutar cada noche a las 11:00 PM. El
comando es
C: \ Windows \ System32 \ cmd.exe / c "C: \ foo \ bar \ PG_BACKUP \ pg_backup.bat"
Y comienza en el directorio
C: \ foo \ bar \ PG_BACKUP
Una vez que todo est configurado, pg_dumpall se ejecutar automticamente cada noche y
descargar un archivo en este directorio. En este punto, lo mejor es utilizar cualquier
solucin de copia de seguridad que est utilizando actualmente para realizar copias de
seguridad de todo el sistema (incluido ese directorio) y esperamos obtener una copia fuera
del sitio tambin. Si alguna vez necesita restaurar, puede utilizar el archivo db.out que ha
copiado. Mientras usted permanezca dentro del mismo nmero de versin durante dumpall y
restaure, todo debe ser magnfico.
Me tom un poco de tiempo para averiguar cmo pasar automticamente la contrasea de
forma segura (o tan seguro como se puede obtener en las ventanas). Esto no es a prueba de
balas, pero hemos estado corriendo esto desde hace algn tiempo en un db que contiene toda
la informacin de la mina de datos para una unin de crdito de 3 sucursales. Esperemos que
esto le ayudar a conseguir que va, y recortar que la interaccin del usuario molestos al
hacer copias de seguridad en Windows.
Rutinas de mantenimiento y monitoreo
Explain
Salidas
NOTICE: QUERY PLAN: plan
Descripcin
Este comando muestra el plan de ejecucin que el planificador Postgres genera para la consulta dada. El plan de
ejecucin muestra la manera en que sern escaneadas las tablas referenciadas; ya sea escaneo secuencial plano,
escaneo por ndice, etc. En el caso que se referencian varias tablas, los algoritmos de unin que sern utilizados para
agrupar las tuplas requeridas de cada tabla de entrada.
La opcin VERBOSE emite la representacin interna completa del rbol del plan, en vez de un resumen (y lo enva al
archivo log del postmaster tambin). Usualmente esta opcin es nicamente til para la correccin de errores (debug)
de Postgres.
Ejemplo 1. Para mostrar un plan de consulta para una consulta simple sobre una tabla con una nica columna de tipo
int4:
EXPLAIN SELECT * FROM foo;
NOTICE: QUERY PLAN:
*.Costo inicio estimado (tiempo inicial que toma devolverse la primer tupla)
*.Costo total estimado (tiempo total para devolver todas las tuplas: por ejemplo, si se limita el nmero de tuplas
a devolver con una clusula
LIMIT, el planificador realiza una interpolacin apropiada entre los dos costos finales para estimar cul de
los planes es realmente el menos
costoso.)
*.Nmero estimado de filas escaniadas (Se cumple solamente si la ejecucin de la consulta es completa.)
*.Cantidad estimado de filas de salida.
El costo estimados es (disk pages read * seq_page_cost) + (rows scanned * cpu_tuple_cost). Por defecto,
seq_page_cost is 1.0 y cpu_tuple_cost is 0.01. Valor costo estimado es (2,24 * 1.0) + (4 * 0.01) = 2.28
seq_page_cost (floating point)
La suposicin del planificador sobre el costo medido en unidades de captura de pginas de disco. Por defecto es
1.0.
Ejemplo 3. Para terminar, la misma tabla con un ndice para lograr una condicin equijoin en la consulta, EXPLAIN
mostrar lo siguiente para una consulta que utilice una funcin de agregacin:
EXPLAIN SELECT sum(i) FROM foo WHERE i = 4;
NOTICE: QUERY PLAN:
Resumen
Explain es la presentacin del costo estimado de ejecucin de la consulta, que es la suposicin del planificador sobre el
tiempo que tomar correr la consulta (medido en unidades de captura de pginas de disco). Muestran dos nmeros: el
tiempo inicial que toma devolverse la primer tupla, y el tiempo total para devolver todas las tuplas. Para la mayora de
las consultas lo que importa es el tiempo total, pero en algunos casos como una sub-consulta EXISTS el planificador
escoger el menor tiempo inicial en vez del menor tiempo total (ya que en todo caso el ejecutor se detendr despus de
obtener la primer tupla). Tambin, si se limita el nmero de tuplas a devolver con una clusula LIMIT, el planificador
realiza una interpolacin apropiada entre los dos costos finales para estimar cul de los planes es realmente el menos
costoso.
Uso de Vacuum
El vacuum es el proceso en el cual se eliminan definitivamente tuplas marcadas para borrar y hay
una reorganizacin de datos a nivel fsico.
Puede realizar vacuum utilizando el comando externo 'vacuumdb' y el cual puede recibir parmetros para realizar los
diferentes tipos de vaciamiento:
FREEZE
FULL
ANALYZE
S/Parametros de tipo
Este comando es muy til para automatizar vaciamientos a travs de cualquier sincronizador de tareas (ya sea el cron
de *nix u otro de Windows).
Asimismo, existe la opcin del Autovacuum, cuya funcionalidad es ir realizando de manera paulatina la mantencin de
nuestra base. Previamente y antes de activar esta funcionalidad, es recomendable leer sobre las consideraciones a
tener en cuenta, para no degradar la performance de nuestro servidor.
Usando Munin
Contents
[hide]
1 Qu
es
Munin?
2
Instalan
do
munin
3
Fichero
s de
configu
racin
4
Configu
rando el
servidor
5
Configu
rando
un nodo
6
Configu
rando el
usuario
de
acceso
para la
interfaz
web
7
Arranca
ndo
munin
8
Accedie
ndo a la
informa
cin
9
Plugins
para
Postgre
SQL
9.1
Instalac
in de
los
plugins
9.2
Descrip
cin de
Qu es Munin?
Munin es un programa de monitorizacin de servidores que genera estadsticas sobre su funcionamiento de los
recursos de nuestros servidores, como memoria, disco duro y servicios. Utiliza las herramientas RRDTool para generar
grficas de rendimiento de los parmetros del sistema analizados. Utiliza una interfaz web para mostrar las grficas
generadas, permite trabajar de forma distribuida, mostrando la informacin de varios servidores. Para ello se instala en
una SERVER la parte servidora de Munin y en el resto la parte cliente, que mandar los datos recopilados al servidor
para que ste los muestre. Est hecho en perl y permite el uso de plugins, lo cual lo hace realmente verstil.
Instalando munin
Munin est incluido en el depsito oficial de diferentes distribuciones:
root@lolo:~# apt-get install munin # si vamos a emplear el equipo como servidor
O
root@lolo:~# yum install munin
Munin puede usarse para monitorizar uno o varios equipos, por lo que munin-node debe instalarse en los equipos de los
cuales se recopilarn los datos y munin en el equipo que actuar a modo de servidor y que provee de servicio web.
Ficheros de configuracin
Munin cuenta con varios ficheros y directorios que hay que conocer.
Configurando un nodo
Editamos el fichero /etc/munin/munin-node.conf:
#
# Example config-file for munin-node
#
log_level 4
log_file /var/log/munin/munin-node.log
port 4949
pid_file /var/run/munin/munin-node.pid
background 1
setseid 1
host *
user root
group root
setsid yes
ignore_file ~$
ignore_file \.bak$
ignore_file %$
ignore_file \.dpkg-(tmp|new|old|dist)$
ignore_file \.rpm(save|new)$
Arrancando munin
Munin se ejecuta cada cinco minutos como un trabajo del cron. Los scripts estn en /etc/cron.d/ y se pueden modificar
para que ejecute lecturas cada minuto y as realizar pruebas.
Iniciar el cliente en todas las mquinas:
root@lolo:~# /etc/init.d/munin-node start
Accediendo a la informacin
Introducimos en el navegador la direccin de htmldir, en este caso file:///var/www/munin/
http://localhost/munin (si contamos con un servidor web).
Para Centos
root@lolo:~# yum install perl-DBD-Pg
- Statistics Monitoring -
log_parser_stats = on
log_planner_stats = on
log_executor_stats = on
log_statement_stats = off
Instalar plugins de Munin es muy sencillo. Lo nico que tienes que hacer es copiarlos a /usr/share/munin/plugins/
Para Centos
Descompactando el archivo: muninpgplugins-0.2.2.tar.gz
root@lolo:~# tar xvzf muninpgplugins-*.tar.gz
root@lolo:~# cd plugins
Para Debian
root@lolo:~# apt-get install munin-plugins-extra
ejemplo1
[pg_*]
user postgres
y esperamos a que empiece a recopilar informacin para leer los logs a ver si todo funciona en condiciones, O bien de
forma directa,
root@lolo:~# /usr/share/munin/plugins/postgres_activate_lock
Usando Nagios
Contents
[hide]
1 Por
qu
usar
Nagios?
2
Configu
rar el
servidor
de
monitor
eo
2.1
Requisit
os
2.2
Instalac
in
(como
usuario
root)
2.2.1
Crear
un
usuario
nagios
2.2.2
Instalar
nagios
2.3
Configu
racin
2.3.1
Editar
el
archivo
/usr/loc
al/nagio
s/etc/ob
jects/co
ntacts.c
fg
2.3.2
Configu
rar la
interfas
e web
2.4
Instalar
los
plugins
de
Por qu usar Nagios?
Nagios es un sistema open source de monitoreo de redes ampliamente utilizado, que vigila los equipos (hardware) y
servicios (software) que se especifiquen, alertando cuando el comportamiento de los mismos no sea el deseado.
Instalar nagios
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.0.6.tar.gz
gunzip -dc nagios-3.0.6.tar.gz | tar xvf -
cd nagios-3.0.6
./configure --with-command-group=nagios
make all
make install
make install-init
make install-config
make install-commandmode
Configuracin
Editar el archivo /usr/local/nagios/etc/objects/contacts.cfg
Este cambio es para indicar a que correo se notificarn las alertas configuradas.
reemplazar nagios@localhost por el correo del administrador
Iniciar Nagios
cd /etc/init.d
chkconfig --add nagios
chkconfig nagios on
En este momento ya es posible ingresar a Nagios, abriendo el navegador de internet y poniendo como direccin:
http://localhost/nagios
Ingrese como usuario nagiosadmin y como clave la que indico cuando configuraba la interfase web.
Si instalo en la misma mquina que va a ser monitoreada pasar a la instalacin del plugin para PostgreSQL, de lo
contrario contine con la siguiente seccin.
Debemos indicarle a Nagios que vamos a monitorear otra maquina editando el archivo /usr/local/nagios/etc/nagios.cfg
Agregar la siguiente linea en la seccion OBJECT CONFIGURATION FILE(S):
cfg_file = /usr/local/nagios/etc/objects/dbhost.cfg
Para instalar chequeos se debe crear una entrada por cada servicio que vayamos a monitorear en el archivo
/usr/local/nagios/etc/nrpe.cfg similar a (deben agregados en la seccion COMMAND DEFINITIONS):
command[check_postgres_locks]=/usr/local/nagios/libexec/check_postgres_locks -w 2 -c 3
define service{
use generic-service
host_name dbserver
service_description CPU Load
check_command check_nrpe!check_load
}
define service{
use generic-service
host_name dbserver
service_description Current users
check_command check_nrpe!check_users
}
define service{
use generic-service
host_name dbserver
service_description Total Processes
check_command check_nrpe!check_total_procs
}
define service{
use generic-service
host_name dbserver
service_description Zombie Processes
check_command check_nrpe!check_zombie_procs
}
Monitoreo de bloqueos
Mirando el link pg_locks nos muestra que bloqueos han sido otorgados y que procesos estn
esperando por estos. Una buena consulta para empezar a mirar los problemas inherentes a los
bloqueos:
SELECT relname,pg_locks.*
FROM pg_class,pg_locks
WHERE relfilenode=relation AND NOT GRANTED;
Revisando cuales son los procesos que estan manteniendo o esperando los bloqueos, es fcil si utiliza la referencia en
pg_stat_activity
No necesitamos una copia de seguridad del sistema de archivos perfectamente coherente como
punto de partida. Cualquier incoherencia interna en la copia de seguridad ser corregida por
la repeticin de registro (esto no es significativamente diferente de lo que sucede durante la
recuperacin del accidente). Por lo tanto, no necesitamos una capacidad de instantnea del
sistema de archivos, simplemente tar o una herramienta similar de archivado.
Puesto que podemos combinar una secuencia indefinidamente larga de archivos WAL para la
reproduccin, la copia de seguridad continua se puede lograr simplemente continuando con
el archivo de los archivos WAL. Esto es particularmente valioso para las bases de datos
grandes, donde puede no ser conveniente tomar una copia de seguridad completa con
frecuencia.
No es necesario volver a reproducir las entradas WAL hasta el final. Podramos detener la
repeticin en cualquier momento y tener una instantnea consistente de la base de datos
como era en ese momento. Por lo tanto, esta tcnica admite la recuperacin de punto a
tiempo: es posible restaurar la base de datos a su estado en cualquier momento desde que se
realiz la copia de seguridad de base.
Si alimentamos continuamente la serie de archivos WAL a otra mquina que se ha cargado con
el mismo archivo de respaldo de base, tenemos un sistema de espera en caliente: en
cualquier momento podemos abrir la segunda mquina y tendr una copia casi actual de la
base de datos.
Al archivar datos WAL, necesitamos capturar el contenido de cada archivo de segmento una
vez que se llena, y guardar esos datos en algn lugar antes de que el archivo de segmento se
recicle para su reutilizacin. Dependiendo de la aplicacin y del hardware disponible, podra
haber muchas formas diferentes de "guardar los datos en algn lugar": podramos copiar los
archivos de segmento a un directorio montado en NFS en otra mquina, escribirlos en una
unidad de cinta Una forma de identificar el nombre original de cada archivo), o agruparlos y
grabarlos en CD, o cualquier otra cosa. Para proporcionar flexibilidad al administrador de
bases de datos, PostgreSQL intenta no hacer ninguna suposicin sobre cmo se realizar el
archivado. En lugar de ello, PostgreSQL permite al administrador especificar un comando de
shell que se ejecutar para copiar un archivo de segmento completado a donde sea necesario.
El comando podra ser tan simple como un cp, o podra invocar un script de shell complejo -
todo depende de usted.
ndice
1. Introduccin
1. Failover cluster
2. Sobre PostgreSQL
3. Sobre pgpool-II
4. Sobre Debian GNU/Linux
2. Arquitectura del sistema
3. Instalacin de paquetes y configuracin de dependencias
4. Configuracin de PostgreSQL
5. Configuracin de pgpool-II
6. Pruebas de replicacin
7. Recuperacin en lnea
8. El Write-Ahead Log
1. Procedimiento completo
2. Primera fase
3. Segunda fase
4. Tercera fase
5. Pasos finales
6. Scripts necesarios
1. wal_archiving
2. pgpool-failover
3. pgpool-failback
4. base-backup
5. pgpool-recovery-pitr
6. pgpool_remote_start
9. Comandos de PCP
10.Simulacin de cada y recuperacin de un nodo
11.Alta disponibilidad de pgpool-II
1. El proyecto Linux High Availability
2. Instalacin de Heartbeat
3. Configuracin de Heartbeat
4. Simulacin de la cada del servicio
12.Herramientas de monitorizacin
1. pg_osmem y pg_buffercache
2. pg_top
3. ps
4. pgd
5. iotop
13.Optimizacin de PostgreSQL
1. Autovacuum y cargas de datos
2. Procesos errantes
14.FAQ (Frequently Asked Question)
15.Bibliografa
Introduccin
Failover cluster
Sobre PostgreSQL
PostgreSQL es la base de datos relacional de cdigo abierto ms avanzada del mundo. Distribuida bajo
licencia BSD (del ingls, Berkeley Software Distribution), lleva ms de 15 aos desarrollndose y su
arquitectura goza de una excelente reputacin por su fiabilidad, integridad de datos y correctitud.
PostgreSQL dispone de versiones para prcticamente todos los sistemas operativos y cumple totalmente
con ACID (del ingls, Atomicity, Consistency, Isolation, Durability). Tiene soporte para claves extranjeras,
joins, vistas, disparadores y procedimientos almacenados (en mltiples lenguajes de programacin).
Incluye la mayora de los tipos de datos de SQL92 y SQL99 y, asimismo, soporta el almacenamiento de
grandes objetos binarios, como imgenes, sonidos y vdeos. Tiene interfaces de programacin nativas
para C/C++, Java, .Net, Perl, PHP, Python, Ruby, Tcl y ODBC, entre otros, y una excepcional
documentacin.
PostgreSQL ofrece sofisticadas caractersticas tales como control concurrente multiversin (MVCC), point
in time recovery (PITR), tablespaces, replicacin asncrona, transacciones anidadas (savepoints), copias
de seguridad en caliente/en lnea, un sofisticado planificador/optimizador de consultas y write ahead
logging para ser tolerante a fallos de hardware. Soporta juegos de caracteres internacionales,
codificaciones de caracteres multibyte, Unicode y realiza ordenaciones dependiendo de la configuracin
de idioma local, de la diferenciacin de maysculas y minsculas y del formato. Es altamente escalable
tanto en la cantidad bruta de datos que puede manejar como en el nmero de usuarios concurrentes que
puede atender. Hay sistemas activos en produccin con PostgreSQL que manejan ms de 4 terabytes de
datos.
Sobre pgpool-II
pgpool-II habla los protocolos de frontend y backend de PostgreSQL, y pasa las conexiones entre ellos.
De ese modo, una aplicacin de base de datos (frontend) cree que pgpool-II es el verdadero servidor de
PostgreSQL, y el servidor (backend) ve a pgpool-II como uno de sus clientes. Debido a que pgpool-II es
transparente tanto para el servidor como para el cliente, una aplicacin de base de datos existente puede
empezar a usarse con pgpool-II casi sin ningn cambio en su cdigo fuente.
pgpool-II funciona sobre Linux, Solaris, FreeBSD y la mayora de las arquitecturas UNIX. Windows no
est soportado. Las versiones de PostgreSQL soportadas son de la 6.4 para arriba. Para usar la
paralelizacin de consultas es necesaria la versin 7.4 o superior.
Debian GNU/Linux es un sistema operativo libre (el conjunto de programas bsicos y utilidades que hacen
que un ordenador funcione). Debian utiliza el ncleo Linux y las herramientas bsicas de GNU. Para esta
instalacin se utilizar el sistema operativo Debian Lenny para la arquitectura x86_64 (AMD64/EM64T),
partiendo de una instalacin bsica, sin ninguna tarea seleccionada en el selector de tareas del instalador.
El sistema de ficheros elegido ser XFS. La misma instalacin puede obtenerse con Debian Etch y el
repositorio de backports.
Esta configuracin nos permite obtener alta disponibilidad de todos los servicios y recursos en las dos
mquinas destinadas a este clster. El diagrama de la arquitectura resultante sera el siguiente:
PostgreSQL 8.3.x
pgpool-II 2.2.x
Heartbeat 2.x
Antes de empezar, instalaremos un conjunto de paquetes bsico para cualquier sistema, as como una
serie de utilidades que nos harn falta para la gestin y el mantenimiento del clster:
apt-get install ntp openssl file psmisc sysstat bzip2 unzip nmap dstat rsync wget ccze tcpdump pciutils dnsutils host
rsync lo usaremos para la recuperacin en lnea de nodos, ntp para mantener el reloj del sistema
sincronizado. El prototipo inicial de este clster se prob en una mquina con dos instancias de Xen y una
base de datos de prueba creada con pgbench. Ms tarde se configur una versin de preproduccin sobre
sendos Intel Quad Core con 8 GB de RAM y la versin final del clster se configur sobre dos nodos con
doble Intel Quad Core cada uno y 16 GB de RAM. La base de datos final ocupa algo ms de 30 GB y se
encuentra sobre dos discos SAS de 15.000 RPM en RAID 1.
A efectos de este artculo, a continuacin se presenta un resumen de los datos de configuracin que se
usarn:
Nodo 1
Hostname: pgsql1.dominio.com
Direccin IP de administracin: 192.168.0.3
Nodo 2
Hostname: pgsql2.dominio.com
Direccin IP de administracin: 192.168.0.4
Mscara de red de 24 bits.
Direccin IP del router: 192.168.0.1
pgpool-II
Direccin IP de servicio: 192.168.0.2
Puerto de gestin: 9898
Puerto de servicio: 9999
Los conceptos utilizados en esta descripcin se irn explicando a lo largo del artculo. Es preciso que las
entradas correspondientes a los datos anteriores existan en el fichero /etc/hosts:
Empezaremos configurando PostgreSQL en ambos nodos pero pgpool-II slo en el nodo pgsql1. Los
comandos debern ejecutarse como root o mediante sudo, a menos que se indique lo contrario
(normalmente comandos que se ejecutarn con el usuario postgres).
Una vez resueltas las dependencias, empezaremos instalando PostgreSQL en ambos nodos:
La instalacin por defecto de PostgreSQL en Debian ya nos deja un sistema gestor de base de datos
funcionando. Finalmente, descargamos pgpool-II, lo descomprimimos e instalamos en /opt/pgpool2:
cd /usr/local/src
wget http://pgfoundry.org/frs/download.php/2191/pgpool-II-2.2.2.tar.gz
cd pgpool-II-2.2.2
./configure --prefix=/opt/pgpool2
make
make install
cd /usr/local/src/pgpool-II-2.2.2/sql/pgpool-recovery
make
make install
A partir de aqu, todas las bases de datos que creemos heredarn las funciones existentes en template1.
Configuracin de PostgreSQL
Tal y como se ha dicho anteriormente, los siguientes pasos aplican a ambas instancias de PostgreSQL en
los nodos pgsql1 y pgsql2.
Empezaremos editando la configuracin de PostgreSQL para permitir el acceso incondicional del usuario
pgpool2, que ser nuestro usuario de base de datos del clster. Por incondicional nos referimos al uso del
modo trust, que permite la validacin del usuario sin necesidad de contrasea. Esto es un requerimiento
de pgpool-II para el tipo de configuracin del clster que tendremos al final del artculo, por lo cul
deberemos prestar especial atencin a los filtros de acceso por IP que configuremos tanto en los
servidores PostgreSQL como en el cortafuegos de los nodos.
Comenzaremos, como usuario postgres, aadiendo el usuario de base de datos (role) pgpool2, sin
contrasea:
su - postgres
Para facilitar el trabajo en este artculo lo hemos dado de alta como superusuario. En realidad, si creamos
la base de datos en todos los nodos como superadministrador postgres y le otorgamos propiedad al
usuario pgpool2, ste puede ser un usuario con el role ms bsico (no superusuario, sin capacidad de
crear bases de datos).
Al igual que durante la creacin del usuario pgpool2, para facilitar este artculo se permite el acceso a
todas las bases de datos a dicho usuario. En un entorno de produccin sera preciso restringir dicho
acceso a la base de datos que se vaya a usar.
Asimismo, si se quiere acceder directamente a la base de datos sin pasar por pgpool-II, por ejemplo para
realizar pruebas de rendimiento o para su monitorizacin, debern aadirse las direcciones IP de los
clientes desde los que se conecten dichas aplicaciones. En este caso, si se desea, y siempre y cuando las
direcciones IP de origen sean diferentes, puede cambiarse el mtodo de autenticacin a MD5 y crearse el
usuario pgpool2 con contrasea.
A continuacin activamos el archivado del Write-Ahead Log (WAL) de PostgreSQL, pues nos har falta
para poder usar PITR (Point-In-Time Recovery) desde pgpool-II. Editamos el fichero de configuracin
/etc/postgresql/8.3/main/postgresql.conf y cambiamos los dos siguientes parmetros:
archive_mode = on
Ya que slo haremos uso de la caracterstica de PITR cuando vayamos a recuperar un nodo cado o aadir
uno nuevo, por defecto hemos configurado el parmetro archive_command para que no haga nada (exit
0). Esto lo hacemos debido a que la activacin o desactivacin del archivado de ficheros WAL requiere de
un reinicio del servidor, pero la alteracin del comando o script que realiza la tarea de archivar el fichero
WAL rotado por PostgreSQL tan slo requiere de una recarga de la configuracin.
As, PostgreSQL se comportar como si no estuviera archivando ficheros de log, generando dichos
ficheros (de 16 MB cada uno) con normalidad en /var/lib/postgresql/8.3/main/pg_xlog y rotndolos a
partir del octavo que almacene.
Acto seguido crearemos el directorio /var/lib/postgresql/pg_xlog_archive, directorio donde archivaremos
(copiaremos) los ficheros WAL cuando lo necesitemos, y le daremos permisos para el usuario postgres:
Por ltimo, indicaremos a PostgreSQL que escuche en todas las interfaces pues, por defecto, slo lo hace
en el localhost. Editamos el fichero /etc/postgresql/8.3/main/postgresql.conf y cambiamos la siguiente
directiva:
listen_addresses = '*'
/etc/init.d/postgresql-8.3 restart
Configuracin de pgpool-II
La configuracin de pgpool-II la realizaremos nicamente en el nodo pgsql1, pues slo en ese host lo
tenemos instalado.
pgpool-II proporciona una interfaz de gestin desde la cul el administrador puede recoger el estado de
pgpool-II y finalizar los procesos de pgpool-II a travs de la red. El fichero pcp.conf es un fichero de
nombres de usuario y contraseas usado para autenticarse con la interfaz. Todos los comandos requieren
que pcp.conf se haya configurado. Tras la instalacin de pgpool-II se crea un fichero
/opt/pgpool2/etc/pcp.conf.sample de ejemplo. Configurar ese fichero es tan sencillo como cambiarle el
nombre al fichero y aadir el usuario y contrasea deseados.
usuario:
En este artculo se usar root como nombre de usuario. Para generar la suma MD5 de nuestra contrasea
podemos usar la utilidad pg_md5:
/opt/pgpool2/bin/pg_md5 -p
password: <password>
34b339799d540a72bf1c408c0e68afdd
Luego creamos un fichero de configuracin para pgpool-II a partir del que viene como ejemplo:
Deberemos editar el fichero para configurarlo a nuestra medida. Para este artculo se configurarn las
siguientes funcionalidades:
Pool de conexiones.
Replicacin.
Balanceo de carga.
Empezaremos con una configuracin bsica para arrancar pgpool-II e iremos aadiendo funcionalidades.
Editamos el fichero /opt/pgpool2/etc/pgpool.conf para dejarlo tal y como sigue:
listen_addresses = '*'
port = 9999
pcp_port = 9898
socket_dir = '/var/run/postgresql'
pcp_socket_dir = '/var/run/postgresql'
backend_socket_dir = '/var/run/postgresql'
pcp_timeout = 10
num_init_children = 32
max_pool = 4
child_life_time = 300
connection_life_time = 0
child_max_connections = 0
client_idle_limit = 0
authentication_timeout = 60
logdir = '/var/run/postgresql'
replication_mode = false
load_balance_mode = false
replication_stop_on_mismatch = false
replicate_select = false
print_timestamp = true
master_slave_mode = false
connection_cache = true
health_check_timeout = 20
health_check_period = 60
health_check_user = 'pgpool2'
failover_command = ''
failback_command = ''
insert_lock = false
ignore_leading_white_space = true
log_statement = false
log_connections = false
log_hostname = false
parallel_mode = false
enable_query_cache = false
pgpool2_hostname = 'pgsql1'
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'pgpool'
system_db_password = ''
backend_hostname0 = '192.168.0.3'
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = '192.168.0.4'
backend_port1 = 5432
backend_weight1 = 1
enable_pool_hba = false
recovery_user = 'pgpool2'
recovery_password = ''
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
Todas las directivas de configuracin vienen explicadas en la pgina web de pgpool-II. Como aspectos a
destacar de la anterior configuracin tenemos los siguientes:
Mediante la directiva listen_addresses hacemos que, inicialmente, pgpool-II escuche en todas las
interfaces.
Mediante las directivas logdir, socket_dir, pcp_socket_dir y backend_socket_dir, configuramos,
respectivamente, que el pid y todos los sockets de los diferentes procesos que forman pgpool-II
se guarden en el directorio por defecto de Debian para PostgreSQL, /var/run/postgresql.
Activamos el pool de conexiones (directiva connection_cache) pero dejamos todas las dems
funcionalidades desactivadas (replication_mode, load_balance_mode, replicate_select y
master_slave_mode).
Mediante las directivas health_check_timeout, health_check_period y health_check_user,
configuramos la comprobacin de estado de los servidores PostgreSQL para que se haga con el
usuario de base de datos pgpool2, cada 60 segundos y con un tiempo mximo de espera de 20
segundos.
Dejamos todos los lmites de conexiones, nmero de procesos, tiempos de espera y similares a
sus valores por defecto.
#! /bin/sh
PATH=/opt/pgpool2/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/opt/pgpool2/bin/pgpool
PIDFILE=/var/run/postgresql/pgpool.pid
if [ -f /opt/pgpool2/etc/default/pgpool2 ] ; then
. /opt/pgpool2/etc/default/pgpool2
fi
OPTS=""
OPTS="$OPTS -d"
fi
. /lib/lsb/init-functions
is_running() {
pidofproc -p $PIDFILE $DAEMON >/dev/null
d_start() {
if is_running; then
else
fi
d_stop() {
status=$?
return $?
case "$1" in
start)
d_start
log_end_msg $?
;;
stop)
d_stop
log_end_msg $?
;;
status)
is_running
status=$?
else
fi
exit $status
;;
restart|force-reload)
;;
try-restart)
$0 restart
else
exit 0
fi
;;
reload)
exit 3
;;
*)
exit 2
;;
esac
# sourced by /opt/pgpool2/etc/init.d/pgpool2
PGPOOL_SYSLOG_FACILITY=local0
PGPOOL_LOG_DEBUG=no
/opt/pgpool2/etc/init.d/pgpool2 start
Podremos observar el correcto arranque del daemon (o los errores en caso contrario) monitorizando el
syslog, por ejemplo mediante el uso del comando tail:
A partir de este momento deberamos de ser capaces de conectarnos al puerto 9999 de la direccin IP de
administracin del nodo pgsql1 (la direccin IP de servicio no estar disponible hasta que configuremos la
alta disponibilidad con Heartbeat):
Si deseamos monitorizar las conexiones a los nodos de PostgreSQL, podemos activar las directivas
log_connections y log_disconnections en los ficheros de configuracin
/etc/postgresql/8.3/main/postgresql.conf de cada nodo, reiniciando PostgreSQL para que los cambios
surjan efecto.
Debido a que no tenemos ni replicacin ni balanceo de carga activados , pgpool-II slo se habr
conectado al servidor PostgreSQL del nodo maestro, hecho que habremos podido comprobar
monitorizando el fichero de log de PostgreSQL en /var/log/postgresql/postgresql-8.3-main.log.
Tras haber comprobado que ya podemos conectarnos, vamos a proceder a activar la replicacin y el
balanceo de carga editando el fichero /opt/pgpool2/etc/pgpool.conf y cambiando las directivas siguientes:
replication_mode = true
load_balance_mode = true
replication_stop_on_mismatch = true
/opt/pgpool2/etc/init.d/pgpool2 restart
Pruebas de replicacin
En el paquete postgresql-contrib-8.3 podemos encontrar una utilidad llamada pgbench. Esta utilidad
permite, en primer lugar, inicializar una base de datos con una serie de tablas sencillas y, en segundo
lugar, realizar pruebas de rendimiento sobre servidores PostgreSQL mediante la ejecucin de una cierta
cantidad de consultas de varios tipos y con una concurrencia parametrizable.
A partir de este momento trabajaremos desde un tercer equipo, actuando ya como cliente del clster. Por
comodidad, daremos de alta las entradas del fichero /etc/hosts mencionadas anteriormente en el artculo,
igual que hicimos en ambos nodos del clster. El primer paso consistir en crear la base de datos
bench_replication:
Como usuario postgres, en ambos nodos podremos usar psql para ver las bases de datos y verificar que
se han creado:
$ su - postgres
$ psql -l
List of databases
-------------------+----------+-----------
(4 rows)
Vamos a proceder ahora a rellenar las bases de datos con tablas e informacin de pruebas mediante el
uso de pgbench:
LOG: pid 4363: statement: create table branches(bid int not null,bbalance int,filler char(88)) with (fillfactor=100)
LOG: pid 4363: statement: create table tellers(tid int not null,bid int,tbalance int,filler char(84)) with (fillfactor=100)
LOG: pid 4363: statement: create table accounts(aid int not null,bid int,abalance int,filler char(84)) with (fillfactor=100)
LOG: pid 4363: statement: create table history(tid int,bid int,aid int,delta int,mtime timestamp,filler char(22))
LOG: pid 4363: statement: alter table branches add primary key (bid)
LOG: pid 4363: statement: alter table tellers add primary key (tid)
LOG: pid 4363: statement: alter table accounts add primary key (aid)
Con un sencillo script vamos a contar el nmero de registros insertados en cada instancia de PostgreSQL
sin pasar por pgpool-II, de modo que podamos verificar que la replicacin se ha realizado correctamente:
#!/bin/sh
PGSQL=/usr/bin/psql
HEAD=/usr/bin/head
TAIL=/usr/bin/tail
CUT=/usr/bin/cut
IP_LIST="192.168.0.3 192.168.0.4"
PORT=5432
for ip in $IP_LIST
do
do
COUNT=`$PGSQL -h $ip -p $PORT -U pgpool2 -d bench_replication -c "SELECT count(*) FROM $t" | $HEAD -n 3 | $TAIL -n
1`
echo $COUNT
done
done
exit 0
Para poder ver cmo se balancean las consultas, teniendo activada la directiva log_statement = 'all' en
/etc/postgresql/8.3/main/postgresql.conf de ambos PostgreSQL, podemos utilizar el siguiente script para
ver qu consultas aparecen en el log de cada nodo:
#!/bin/sh
PGSQL=/usr/bin/psql
HEAD=/usr/bin/head
TAIL=/usr/bin/tail
CUT=/usr/bin/cut
IP_LIST="192.168.0.3"
PORT=9999
for ip in $IP_LIST
do
do
COUNT=`$PGSQL -h $ip -p $PORT -U pgpool2 -d bench_replication -c "SELECT count(*) FROM $t" | $HEAD -n 3 | $TAIL -n
1`
echo $COUNT
done
done
exit 0
En media, deberan haberse ejecutado dos (de las cuatro) consultas SELECT en cada una de las bases de
datos, si bien esto no tiene porqu ser siempre as.
A continuacin pasaremos a ejecutar el benchmark bsico de pgbench, de modo que podamos apreciar el
comportamiento del clster bajo continuas inserciones, actualizaciones y consultas. Desde la consola
ejecutaremos:
[..]
scaling factor: 1
number of clients: 1
Recuperacin en lnea
El procedimiento de recuperacin en lnea de un nodo (del ingls, online recovery) permite volver a
conectar nodos cados al clster. Es requisito, por lo tanto, que el nodo est desconectado o cado (del
ingls, dettached) antes de ejecutar este procedimiento (ver comandos pcp ms adelante).
El Write-Ahead Log
A partir de su versin 8, PostgreSQL almacena todas las operaciones que alteran los datos y los
metadatos de la base de datos en forma de logs binarios en el directorio /var/lib/postgresql/8.3/pg_xlog.
Estos logs se escriben y sincronizan en disco antes de que se alteren los ficheros de las tablas (de ah su
nombre, Write-Ahead Log o WAL) y su funcin principal es la recuperacin a un estado consistente de
forma automtica (de ah su nombre, Point-In-Time Recovery o PITR) en caso de fallo del sistema por
rotura de un disco, muerte de un proceso, etc. Su funcionamiento es anlogo al del journaling de un
sistema de ficheros. Cada uno de estos ficheros tiene un tamao de 16 MB y PostgreSQL los rota y
reutiliza automticamente (almacena un mximo de 8 ficheros por defecto). El uso de estos logs binarios
viene activado por defecto en PostgreSQL, pero no su archivado (copia a otra ubicacin).
Debido a la forma en que se realiza la recuperacin en lnea de un nodo con pgpool-II, en realidad no es
necesario tener una copia de todos los ficheros del WAL que se vayan generando, de ah que se use un
comando nulo durante la operacin rutinaria del servidor. Adems, el archivado de ficheros del WAL
habitualmente supone un importante impacto en el rendimiento del servidor.
Para este artculo suponemos suficiente el uso de pg_dump una vez al da como mecanismo de copias de
seguridad de los datos, luego no se estar haciendo uso de WAL y PITR como mecanismo de backup, sino
que se utilizar nicamente para la recuperacin online de un nodo. Por lo tanto, durante la operacin
normal del clster, ste debe estar activo pero con un comando de archivado nulo que no haga copia
alguna de los ficheros de log rotados, tal que:
archive_mode = on
sto es as debido a que no puede activarse o desactivarse el uso de ficheros WAL por parte de
PostgreSQL sin reiniciar el servicio (accin que queremos evitar en la medida de lo posible), mientras que
cambiar el comando que se usa para el archivado de dichos ficheros requiere tan slo una solicitud de
recarga de la configuracin al daemon de PostgreSQL. Segn se especifica en la documentacin en lnea
de PostgreSQL, es necesario que todo comando de archivado devuelva el valor 0 en caso de ejecucin
correcta y cualquier otro valor en caso contrario, de ah que se haya optado por un simple "exit 0".
Procedimiento completo
Una vez introducidos los conceptos a utilizar, acto seguido se detalla el procedimiento completo de
restauracin de un nodo cado. Como paso previo activaremos el comando de archivado de ficheros WAL
en el nodo maestro. Para ello, editaremos el fichero de configuracin
/etc/postgresql/8.3/main/postgresql.conf y cambiaremos el valor de la directiva archive_command,
segn sigue:
archive_mode = on
/etc/init.d/postgresql-8.3 reload
En el nodo a recuperar, donde PostgreSQL debe estar parado, dejaremos la configuracin original
(comando de archivado nulo), pues no es necesario para una PITR. El siguiente paso es hacer una
llamada al comando pcp_recovery_node, tal que:
Un timeout de 5 segundos.
Sobre el puerto 9898.
Al primer nodo del clster, "pgsql1", actuando en estos momentos como maestro.
Solicitando la recuperacin del segundo nodo (el conteo empieza por el 0).
Debido a que parten de una llamada a un procedimiento almacenado de base de datos, todas las
acciones que se realizan a raz de esta llamada se ejecutan como usuario de sistema postgres. Divididas
en tres fases, se detallan a continuacin.
Primera fase
En primer lugar, este script genera un fichero llamado recovery.conf, que sita dentro del directorio
PG_DATA (/var/lib/postgresql/8.3/main en Debian). Este fichero se crea en esa ubicacin para que sea
transferido al nodo a recuperar ms adelante en este mismo script. Cuando el servidor PostgreSQL del
nodo a recuperar arranque y realice una recuperacin PITR, leer ese fichero y ejecutar el valor de la
variable restore_commandtantas veces como sea necesario para obtener los ficheros WAL que le
permitirn llegar desde el punto en la bitcora donde finaliz la copia de seguridad online hasta el
momento en el cual se dejaron de atender peticiones (segunda fase de la recuperacin online de un
nodo). El origen de esos ficheros WAL ser el directorio /var/lib/postgresql/pg_xlog_archive del nodo
maestro, que es donde el comando de la directiva archive_command copia los ficheros WAL que se van
rotando.
Durante la ejecucin de este script, pgpool-II sigue antendiendo peticiones de los clientes, de ah que se
inicie un backup online de PostgreSQL antes de empezar la copia. De este modo, las diferencias entre
ambos nodos cuando el script haya terminado su ejecucin sern tan slo los ficheros WAL generados
durante su ejecucin, que habrn sido archivados en un directorio aparte
(/var/lib/postgresql/pg_xlog_archive) para evitar que ms de 8 rotaciones de logs durante la ejecucin
del script sobreescriban ficheros WAL (en el caso de mucha actividad en el servidor o de tener un
volumen de datos a copiar muy grande, o de ambas).
En segundo lugar, este script indica a PostgreSQL que se va a iniciar una copia de seguridad online
mediante la ejecucin de la consulta SELECT pg_start_backup('etiqueta') en un nodo maestro. Esto, a su
vez, fuerza un CHECKPOINT. Un checkpoint es un punto en la secuencia del log de transacciones a partir
del cual todos los ficheros de datos han sido actualizados para reflejar la informacin en el log o bitcora.
Todos los ficheros de datos sern escritos en disco. Un checkpoint acta como punto de inicio para una
recuperacin PITR. Es decir, un checkpoint ms un conjunto de ficheros WAL es todo lo que se necesita
para recuperar una base de datos PostgreSQL a un estado consistente, mediante el mecanismo de PITR.
En tercer lugar, el script realiza una copia del directorio /var/lib/postgresql/8.3/main desde el nodo
maestro al nodo a recuperar mediante el uso de varias sentencias rsync.
Por ltimo, el script indica a PostgreSQL que ya ha terminado el backup online mediante la ejecucin de
la sentencia SELECT pg_stop_backup(). Tras la anotacin del punto donde finaliza el backup, el puntero
de insercin del fichero de log actual se desplaza al siguiente fichero de log, de modo que el fichero
actual puede rotarse y archivarse, completndose as la copia de seguridad.
Segunda fase
Una vez finalizada la copia del directorio base, pgpool-II deja de atender las peticiones de los clientes,
quedando stas acumuladas en una cola de peticiones pendientes de atender, y finaliza las que
estuvieran en ejecucin (durante un tiempo mximo definido en la directiva
client_idle_limit_in_recovery).
pgpool-II ejecuta SELECT pgpool_remote_start('target', 'PGDATA') en el nodo maestro. Esto produce una
llamada al script /var/lib/postgresql/8.3/main/pgpool_remote_start. Los valores de los dos parmetros de
la llamada se obtienen del fichero /opt/pgpool2/etc/pgpool.conf. El primero de la directiva
backend_hostname correspondiente al nodo a recuperar; y el segundo de la directiva
backend_data_directory correspondiente al nodo a recuperar. El nombre del script a recuperar est
incluido en el cdigo fuente del fichero /usr/local/src/pgpool-II-2.2.2/sql/pgpool-recovery y, si se desea
cambiar, debe alterarse antes de compilar e instalar.
Este script arranca PostgreSQL en el nodo que se est recuperando mediante una llamada al binario
/usr/bin/pg_ctlcluster, y PostgreSQL hace una recuperacin PITR al arrancar. El tiempo de espera para el
arranque no ser superior a lo que indique la directiva recovery_timeout (en segundos) del fichero
/opt/pgpool2/etc/pgpool.conf.
Una vez finalizado el proceso de PITR, el nodo de PostgreSQL recuperado acepta conexiones de nuevo.
pgpool-II se conecta al nuevo nodo y, a partir de este momento, el nodo forma parte del clster de
nuevo. El clster opera de nuevo con normalidad, todas las bases de datos son accesibles de nuevo y se
procesan las peticiones acumuladas durante la segunda y tercera fases de la recuperacin en lnea.
Pasos finales
Una vez finalizada la recuperacin, y habiendo comprobado el correcto funcionamiento del clster con su
nuevo nodo, procederemos a desactivar el comando de archivado de ficheros WAL del nodo maestro,
alterando el fichero de configuracin /etc/postgresql/8.3/main/postgresql.conf y dejando el valor nulo exit
0 del parmetro, tal y como estaba antes de iniciar el procedimiento y solicitaremos una recarga de la
configuracin.
En este momento, nuestro clster acaba de finalizar la operacin llamada failback, es decir, se ha
recuperado de una operacin de failover que se inici al detectar que uno de los nodos no estaba
disponible. pgpool-II permite configurar sendos scripts para que sean ejecutados al iniciarse y finalizar,
respectivamente, los eventos de failover y failback. Estas directivas se encuentran en el fichero de
configuracin /opt/pgpool2/etc/pgpool.conf y son las siguientes:
failover_command = ''
failback_command = ''
En el apartado siguiente se ofrecen ejemplos de scripts que realizan todas las tareas descritas
anteriormente.
Scripts necesarios
En este apartado se muestran varios scripts que son necesarios para realizar la recuperacin en lnea de
un nodo. La documentacin de pgpool-II describe los pasos especficos a seguir, que varan dependiendo
de la versin de PostgreSQL que estemos usando y de las herramientas de sistema de que dispongamos,
pero deja a discrecin del administrador de sistemas su implementacin. Como en muchos casos, no hay
una nica solucin que se ajuste a todos los casos.
pgpool-failover
wall_archiving
base-backup
pgpool-recovery-pitr
pgpool_remote_start
pgpool-failback
El script wall_archiving lo ejecutaremos manualmente antes de empezar la recuperacin del nodo y tras
finalizar la misma, bien como usuario root, bien como usuario postgres.
El script pgpool_remote_start recibe slo los dos ltimos. Los tres scripts se ejecutan en algn nodo
maestro del cual pgpool-II tenga constancia y est activo (conste como attached), y corren como usuario
postgres.
Por ltimo, los scripts pgpool-failover y pgpool-failback, tambin ejecutados como usuario postgres,
reciben un conjunto de parmetros, en el orden elegido por el usuario, de entre los siguientes:
Los valores %m (identificador del nuevo nodo maestro) y %M (identificador del nodo maestro antiguo)
tienen mucho valor cuando el nodo que cae (durante un failover) es el nodo maestro y pgpool-II decide,
a partir de aquel momento, considerar otro nodo (antes esclavo) como nuevo nodo maestro.
En todos los casos, los parmetros pasados por pgpool-II al script que se est llamando se reciben como
parmetros de la manera habitual, tratndose como en cualquier otro caso y de la forma pertinente
dependiendo del lenguage de scripting utilizado.
wal_archiving
El proceso de activacin y desactivacin del comando de archivado puede automatizarse mediante scripts
de Bash, Perl o similar, e incluso integrarse dentro de la primera y ltima fases de la recuperacin. En
realidad, es una cuestin de gustos ms que otra cosa. Personalmente, prefiero tenerlos por separado y
ejecutarlos manualmente. A continuacin se muestra un script de Bash que realiza dicha funcin:
#!/bin/sh
SED=/bin/sed
PSQL=/usr/bin/psql
PGDIR="/etc/postgresql/8.3/main"
PGCONF="postgresql.conf"
UNAME=/bin/uname
HOST=`$UNAME -n`
case "$1" in
start)
echo "done."
;;
stop)
echo "done."
;;
status)
;;
*)
exit 1
;;
esac
exit 0
$ /var/lib/postgresql/8.3/main/wall_archiving
$ /var/lib/postgresql/8.3/main/wal_archiving status
archive_mode = on
$ /var/lib/postgresql/8.3/main/wal_archiving start
$ /var/lib/postgresql/8.3/main/wal_archiving stop
pgpool-failover
En el caso de haber ms de un nodo secundario, lo arriba expuesto no vara pues slo hay un nodo
maestro. El siguiente script enva dos entradas al syslog, que luego pueden ser capturadas por una
herramienta de monitorizacin como Zabbix o Nagios, las cuales enviaran las alertas pertinentes. Este es
un acercamiento que utilizo normalmente, alternativo al tradicional envo de una notificacin por correo
electrnico.
#! /bin/sh
BASENAME=`/usr/bin/basename $0`
ID=`/usr/bin/id -un`
# $1 = node id
# $2 = host name
# $3 = port number
$LOGGER "Failover of node $1 at hostname $2. New master node is $5. Old master node was $6."
exit 0
pgpool-II ejecuta este script como usuario postgres al final del proceso, una vez se ha completado la
degeneracin del nodo.
pgpool-failback
pgpool-II ejecuta el script configurado como usuario postgres una vez concluido el procedimiento de
failback, es decir, la recuperacin en lnea de un nodo en tres pasos. Del mismo modo que el caso del
failover, a continuacin se muestra un sencillo script de Bash que aade una entrada al syslog, de modo
que pueda ser capturada por una herramienta de monitorizacin de logs que enve las alertas
pertinentes.
#! /bin/sh
BASENAME=`/usr/bin/basename $0`
ID=`/usr/bin/id -un`
# $1 = node id
# $2 = host name
# $3 = port number
$LOGGER "Failback of node $1 at hostname $2. New master node is $5. Old master node was $6."
exit 0
base-backup
De entre todas las tareas a realizar por parte del script base-backup, la nica que est sujeta a variacin
en su implementacin es la copia inicial de todo el directorio de datos de PostgreSQL ($PG_DATA, que en
Debian es /var/lib/postgresql/8.3/main) desde el nodo maestro al nodo a recuperar.
En el caso del script que se presenta a continuacin, la herramienta elegida es rsync sobre un tnel SSH
con un par de claves pblica/privada DSA de 1024 bits sin contrasea. Esta eleccin se basa en dos
puntos:
La eficiencia de rsync (impacto sobre los discos frente al tiempo necesario), si bien el uso de un
canal cifrado ralentiza el proceso.
La mayor parte de los datos a copiar ya existirn en el nodo a recuperar. Podemos considerar que
esta premisa ser falsa nicamente en el caso de que el motivo de la cada del nodo hubiera sido
la rotura de los discos.
#!/bin/sh
PSQL=/usr/bin/psql
SCP=/usr/bin/scp
SSH=/usr/bin/ssh
BASENAME=`/usr/bin/basename $0`
HOSTNAME=`/bin/hostname`
ID=`/usr/bin/id -un`
PG_HOME=/var/lib/postgresql
SRC_DATA=$1
DST_HOST=$2
DST_DATA=$3
exit 0
pgpool-recovery-pitr
El nico propsito de este script es forzar la rotacin de un fichero WAL (y su consecuente archivado al
directorio /var/lib/postgresql/pg_xlog_archive). El script pgpool-recovery-pitr se ejecuta una vez se han
dejado de atender nuevas peticiones de clientes (que quedan en una cola de peticiones pendientes de
atender) y se han atendido las que estaban en curso (o se ha llegado al timeout y se han desechado).
#! /bin/sh
PSQL=/usr/bin/psql
BASENAME=`/usr/bin/basename $0`
ID=`/usr/bin/id -un`
exit 0
pgpool_remote_start
#! /bin/sh
SSH=/usr/bin/ssh
BASENAME=`/usr/bin/basename $0`
ID=`/usr/bin/id -un`
DST_HOST=$1
DST_DIR=$2
exit 0
Comandos de PCP
pgpool-II proporciona una interfaz de control desde la consola mediante la cual el administrador puede
recoger el estado de pgpool-II y gestionar sus procesos a travs de la red. Todos los comandos PCP
siguen el mismo patrn:
El nmero de nodo es necesario slo en algunos comandos. Todos los comandos se encuentran en
/opt/pgpool2/bin, por lo que se eliminar esta ruta en todos los ejemplos (queda a discrecin del usuario
aadir dicho directorio al PATH o preceder los comandos con la misma). El hostname ser siempre el de
la mquina donde se est ejecutando pgpool-II y el puerto el 9898. El usuario y la contrasea sern los
definidos en el fichero /opt/pgpool2/etc/pcp.conf.
A continuacin se muestra el funcionamiento de algunos de estos comandos, utilizados para la gestin del
clster explicado en el artculo.
Para saber el nmero de nodos controlados por pgpool-II (activos o no), podemos ejecutar el siguiente
comando:
Nos devolver un nmero entero mayor o igual que cero. Es til a la hora de crear scripts. Para saber el
estado de un nodo podemos usar el siguiente comando:
El ltimo parmetro ser el nmero de nodo del cul se desea informacin. Tngase en cuenta que se
empieza a contar por el cero. La salida del comando ofrece cuatro campos, en este orden:
/etc/init.d/postgresql-8.3 stop
En estos instantes, lo ms probable es que pgpool-II an no se haya dado cuenta de que ese nodo est
cado. Bien podemos esperar a que se ejecute un health check (cada 60 segundos o segn se haya
configurado la directiva health_check_period) o podemos forzarlo manualmente lanzando una consulta
SQL de tipo INSERT, UPDATE o DELETE. En cualquier caso, veremos aparecer las siguientes lneas en el
/var/log/syslog:
ERROR: pid 27928: health check failed. 1 th host 192.168.0.4 at port 5432 is down
LOG: pid 27928: failover_handler: do not restart pgpool. same master node 0 was selected
psql -h 192.168.0.4 -p 9999 -U pgpool2 -d bench_replication -c "UPDATE ACCOUNTS SET abalance = 1009 WHERE aid = 10"
Como puede observarse en el log, para llevar a cabo el proceso de failover, pgpool-II tan slo tiene que
degenerar el nodo cado y, tal y como informa, no es necesario reinicio alguno. A efectos prcticos, lo
nico que se ha perdido es la capacidad de balancear la carga. ste es el caso ms sencillo posible al que
podemos enfrentarnos.
Ahora, para iniciar la recuperacin del nodo pgsql2, realizaremos los siguientes pasos (segn lo explicado
anteriormente en este artculo):
El siguiente comando instruye a pgpool-II que inicie el proceso de recuperacin del nodo 1 (pgsql2):
LOG: pid 27964: starting recovery command: "SELECT pgpool_recovery('base-backup', '192.168.0.4', '/var/lib /postgresql/8.3/main')"
LOG: pid 27964: all connections from clients have been closed
LOG: pid 27964: send_failback_request: fail back 1 th node request from pid 27964
LOG: pid 27928: failover_handler: do not restart pgpool. same master node 0 was selected
Tal y como podemos ver en el log, pgpool-II realiza las siguientes acciones:
Para ello, instalaremos otra copia de pgpool-II en el nodo pgsql2, con una configuracin casi idntica a la
del ya instalado, y utilizaremos Heartbeat para detectar la cada completa de un nodo (no slo del
servidor de PostgreSQL en dicho nodo) y la gestin de dicho evento. A partir de este momento, entra en
juego una nueva direccin IP, la 192.168.0.2, que es la direccin IP que ambos nodos compartirn y que
Heartbeat se encargar de gestionar, de modo que slo uno de los nodos (aquel actuando como maestro)
tenga configurada dicha direccin IP en un momento dado. Esta direccin IP es conocida como direccin
IP de servicio.
Los pasos a seguir para instalar pgpool-II en pgsql2 son los mismos que en pgsql1:
Los ficheros de configuracin y el script de arranque pueden copiarse desde pgsql1 a pgsql2. El nico
fichero que precisar algunas modificaciones ser /opt/pgpool2/etc/pgpool.conf. A continuacin se
presentan los valores que habr que cambiar en pgsql2:
listen_addresses = '192.168.0.2'
pgpool2_hostname = 'pgsql2'
backend_hostname0 = '192.168.0.4'
backend_hostname1 = '192.168.0.3'
[cdigo 58]
Hay que tener en cuenta que, si en algn momento el nodo pgsql2 pasase a ser el nodo maestro,
entonces los ndices de los nodos se invertiran, ya que en el pgpool-II de pgsql2 los nodos estn
configurados al revs (pgsql1 pasara a ser el nodo 1 y pgsql2 sera el nodo 0).
El proyecto Linux High Availability
El objetivo fundamental del proyecto Linux-HA es desarrollar una solucin de alta disponibilidad
(clustering) para Linux que proporcione y promocione la fiabilidad, la disponibilidad y la calidad de
servicio o usabilidad (RAS, en sus siglas en ingls) a travs del esfuerzo de una comunidad de
desarrolladores.
El programa Heartbeat es uno de los componentes principales del proyecto. Fcilmente portable, corre en
todos los Linux conocidos, as como en FreeBSD y Solaris. Heartbeat es una de las implementaciones
principales del estndar Open Cluster Framework (OCF).
Heartbeat fue la primera pieza de software que se escribi para el proyecto Linux-HA. Puede llevar a cabo
la deteccin de la cada de nodos, las comunicaciones y la gestin del clster en un solo proceso.
Actualmente soporta un modelo de dependencias muy sofisticado para clsteres de N nodos, y es muy
til y estable. La unidad de gestin de Heartbeat es el recurso. Los recursos pueden ser, por ejemplo,
direcciones IP o servicios (aplicaciones). Los siguientes tipos de aplicaciones son tpicos ejemplos:
Un recurso es la unidad bsica de la alta disponibilidad. Un recurso es un servicio o facility el cul pasa a
tener alta disponibilidad mediante el gestor de recursos del clster de alta disponibilidad.
Un recurso es una abstraccin que puede ser de diferentes tipos. Puede ser algo muy concreto, como un
volumen de disco o un lector de tarjetas, o puede ser ms abstracto, como una direccin IP, un conjunto
de reglas de firewall o un servicio de software (como un servidor web o un servidor de base de datos).
Las operaciones bsicas que los recursos deben soportar son las siguientes:
Ntese que los recursos del tipo R1 (versin 1 de Linux-HA) deben soportar status, mientras que los del
tipo R2 (versin 2) deben soportar la operacin monitor.
El gestor de recursos del clster de alta disponibilidad intenta conseguir que todos los recursos estn
disponibles para los usuarios asegurndose de que estn ejecutndose en alguno de los nodos del clster.
El gestor de recursos de Heartbeat R1 (y muchos otros gestores de recursos en clster) ana diversos
recursos en grupos, llamados ResourceGroups. En ese caso, cada grupo es iniciado, detenido o movido en
su conjunto por el gestor de recursos del clster.
Instalacin de Heartbeat
Pasamos ahora a la instalacin y configuracin de la alta disponibilidad con Heartbeat. El primer paso
ser instalarlo en ambos nodos:
Llegados a este punto, es preciso introducir dos nuevos conceptos de uso frecuente con Heartbeat,
direccin IP de servicio y direccin IP de administracin.
Una direccin de servicio es una direccin que es gestionada por el sistema de HA, y que es movida por
el clster all donde los servicios correspondientes se estn ejecutando. Estas direcciones de servicio son
direcciones a travs de las cuales los clientes y usuarios de los servicios en HA acceden a dichos
servicios. Tpicamente se almacenan en DNS con nombres conocidos.
Es importante que la direccin de servicio no sea gestionada por el sistema operativo, sino que sea el
software de HA el nico que la maneje. Si se le da una direccin administrativa al sistema de HA para que
la gestione, sto causar problemas pues se confundir al sistema de HA y el sistema operativo y el
sistema de HA se pelearn por el control de esta direccin.
El agente de recursos IPaddr2 es capaz de levantar una interfaz desde cero, incluso si no se ha
establecido ninguna direccin base (la versin anterior necesitaba de una direccin base en cualquier
interfaz, pues tan slo era capaz de aadir o eliminar direcciones a interfaces ya levantados). Adems, no
existe lmite en el nmero de direcciones IP por interfaz que IPaddr2 puede gestionar.
En cambio, una direccin administrativa es una direccin que est permanentemente asociada a un nodo
especfico del clster.
Tales direcciones son muy tiles, y se recomienda encarecidamente que una direccin de este tipo sea
reservada para cada nodo del clster, de manera que el administrador de sistemas pueda acceder al nodo
del clster incluso si no hay servicios ejecutndose. Para la mayora de sistemas, una direccin de este
tipo es obligatoria.
Asimismo, se recomienda que se reserve una de estas direcciones para cada interfaz, de modo que se
puedan testear las interfaces incluso cuando no estn activas.
Si lo deseamos, para facilitar las pruebas o en vistas al futuro, podemos configurar la direccin de
servicio en el fichero /etc/network/interfaces siempre y cuando no incluyamos su autoconfiguracin (en
forma de directiva auto o allow-hotplug). El fichero /etc/network/interfaces del nodo pgsql1 podra
quedar tal y como sigue:
auto lo
# Direccin administrativa
allow-hotplug eth0
address 192.168.0.3
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
# Direccin de servicio
address 192.168.0.2
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
Configuracin de Heartbeat
Vamos ahora a editar los tres ficheros de configuracin de Heartbeat. Tomaremos los ficheros de ejemplo
de /usr/share/doc/heartbeat y los modificaremos a nuestro gusto. Empezaremos con el fichero ha.cf:
cd /etc/ha.d/
cp /usr/share/doc/heartbeat/ha.cf.gz /etc/ha.d/
gunzip ha.cf.gz
Editamos el fichero /etc/ha.d/ha.cf y lo configuramos a nuestro gusto, por ejemplo tal y como sigue:
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth0
auto_failback off
Nos aseguramos, una vez ms, de que los nodos pgsql1 y pgsql2 existen en el fichero /etc/hosts de
ambos hosts pgsql1 y pgsql2:
Esto indica a Heartbeat que el nodo maestro es pgsql1 y que debe gestionar dos recursos:
El orden es muy importante. Primero se especifica el hostname del nodo que consideramos maestro.
Segundo, los recursos. El orden de los recursos tambin es crtico, pues Heartbeat los iniciar en orden
de izquierda a derecha, y los detendr en orden de derecha a izquierda (y no queremos que intente
arrancar el servicio pgpool2antes de disponer de la direccin IP en la cual pgpool-II debe escuchar).
Heartbeat buscar el script de arranque del servicio que debe gestionar en /etc/init.d y en
/etc/ha.d/resource.d. Siempre y cuando no creemos los enlaces en los directorios /etc/rcX.d, tanto da
que lo coloquemos en uno u otro, pues el sistema operativo no lo arrancar automticamente. Entonces,
creamos un enlace dbil al script de arranque pgpool2 para que Heartbeat pueda encontrarlo:
cd /etc/ha.d/resource.d
ln --symbolic /opt/pgpool2/etc/init.d/pgpool2
De este modo pgpool2 no se arrancar al iniciarse el nodo, sino que ser Heartbeat quien lo arranque si
detecta que as tiene que hacerlo, es decir, si decide que ste nodo debe asumir el papel de maestro.
auth 1
1 sha1 57ef7ac02cf6aef7e13131622598f94778fb07d6
Para obtener la clave SHA1 de la contrasea en texto plano que querramos usar, utilizaremos el comando
sha1sum:
57ef7ac02cf6aef7e13131622598f94778fb07d6 -
Authkeys es obligatorio que sea accesible slo por el usuario root y que tenga permisos 600. Los dems,
664. Les damos los permisos adecuados a los ficheros:
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility daemon
entity logd
useapphbd no
sendqlen 256
recvqlen 256
Repetiremos los anteriores pasos para el nodo pgsql2. Los ficheros de configuracin sern idnticos en
ambos nodos, sin diferencia alguna, por lo que podemos copiar los ficheros de configuracin desde pgsql1
a pgsql2 sin problemas.
Ahora ya estamos listos para iniciar la alta disponibilidad. Debido a que el logd puede estar iniciado con
una configuracin por defecto, vamos a asegurarnos primero de que Heartbeat est completamente
parado en ambos nodos:
/etc/init.d/heartbeat stop
Es posible que debamos esperar a algn timeout. Ahora, con una diferencia mxima de 120 segundos
(directiva initdead en /etc/ha.d/ha.cf), ejecutaremos el script de inicio, primero en pgsql1 y despus en
pgsql2:
/etc/init.d/heartbeat start
Podemos monitorizar el arranque de ambos Heartbeats a travs del fichero de log /var/log/ha-log. En el
nodo pgsql1 debera aparecernos la siguiente (o parecida) informacin en dicho log:
logd[4197]: WARN: Consider setting non-default value in /proc/sys/kernel/core_pattern (or equivalent) for maximum supportability
logd[4197]: WARN: Consider setting /proc/sys/kernel/core_uses_pid (or equivalent) to 1 for maximum supportability
heartbeat[4272]: info: logfile and debug file are those specified in logd config file (default /etc/logd.cf)
heartbeat[4272]: WARN: Consider setting non-default value in /proc/sys/kernel/core_pattern (or equivalent) for maximum supportability
heartbeat[4272]: WARN: Consider setting /proc/sys/kernel/core_uses_pid (or equivalent) to 1 for maximum supportability
heartbeat[4273]: info: glib: UDP Broadcast heartbeat started on port 694 (694) interface eth0
heartbeat[4273]: info: glib: UDP Broadcast heartbeat closed on port 694 interface eth0 - Status: 1
heartbeat[4273]: info: Starting "/usr/lib/heartbeat/ipfail" as uid 107 gid 111 (pid 4294)
ipfail[4294]: info: Status update: Node pgsql2 now has status active
IPaddr[4472][4529]: INFO: eval ifconfig eth0:0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255
logd[3793]: WARN: Consider setting non-default value in /proc/sys/kernel/core_pattern (or equivalent) for maximum supportability
logd[3793]: WARN: Consider setting /proc/sys/kernel/core_uses_pid (or equivalent) to 1 for maximum supportability
heartbeat[3868]: info: logfile and debug file are those specified in logd config file (default /etc/logd.cf)
heartbeat[3868]: WARN: Consider setting non-default value in /proc/sys/kernel/core_pattern (or equivalent) for maximum supportability
heartbeat[3868]: WARN: Consider setting /proc/sys/kernel/core_uses_pid (or equivalent) to 1 for maximum supportability
heartbeat[3869]: info: glib: UDP Broadcast heartbeat started on port 694 (694) interface eth0
heartbeat[3869]: info: glib: UDP Broadcast heartbeat closed on port 694 interface eth0 - Status: 1
heartbeat[3881]: info: Starting "/usr/lib/heartbeat/ipfail" as uid 107 gid 111 (pid 3881)
Podemos observar como Heartbeat se ha encargado de asociar la direccin IP 192.168.0.2 al primer alias
disponible de la interfaz eth0, es decir, eth0:0. Tambin podremos observar como pgpool-II est
levantado y es capaz de servir conexiones.
En el syslog podremos observar que ha establecido la conexin con ambos servidores de PostgreSQL y
est esperando peticiones:
A continuacin vamos a simular la cada del nodo maestro, pgsql1. Si estamos trabajando con dos
mquinas, esto es tan sencillo como desconectar dicho nodo de la red. En el caso de este artculo, se us
Xen Hypervisor para crear las dos mquinas virtuales dentro de la misma mquina fsica, por lo que se
ejecut el siguiente comando (las mquinas virtuales se haban creado con las xen-tools de Steve Kemp):
xm destroy pgsql1
ipfail[3881] 2008/11/05_17:08:10 info: Status update: Node pgsql1 now has status dead
IPaddr[4068][4125] INFO: eval ifconfig eth0:0 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255
ipfail[3881] info: Link Status update: Link pgsql1/eth0 now has status dead
Vemos como ahora el nodo pgsql2 tiene la direccin IP 192.168.0.2 (podemos verificarlo con el comando
ifconfig) y como pgpool-II est arrancado (podemos verificarlo con el comando ps xua |grep ^postgres).
Asimismo, podemos observar como pgpool-II ha realizado un health check nada ms iniciarse y, al ver
que el servidor de PostgreSQL del nodo 192.168.0.3 no estaba disponible, ha realizado la pertinente
degeneracin de ese nodo (que, recordemos, a efectos del nuevo pgpool-II, es un nodo secundario):
pgsql2 pgpool: ERROR: pid 4195: connect_inet_domain_socket: connect() failed: No route to host
pgsql2 pgpool: ERROR: pid 4195: health check failed. 1 th host 192.168.0.3 at port 5432 is down
pgsql2 pgpool: LOG: pid 4195: starting degeneration. shutdown host 192.168.0.3(5432)
pgsql2 pgpool: LOG: pid 4195: failover_handler: do not restart pgpool. same master node 0 was selected
pgsql2 pgpool: LOG: pid 4195: failover done. shutdown host 192.168.0.3(5432)
pgsql2 pgpool: LOG: pid 4195: execute command: /var/lib/postgresql/8.3/main/pgpool-failover 1 192.168.0.3 5432
/var/lib/postgresql/8.3/main 0 0
pgsql2 pgpool: /var/lib/postgresql/8.3/main/pgpool-failover: 15: Failover of node 1 at hostname 192.168.0.3. New master node is 0. Old
master node was 0.: not found
Ntese que, a raz de la instalacin de Heartbeat, pgpool-II est ahora escuchando en la IP 192.168.0.2,
por lo cual hay que mandar al puerto 9898 de esa IP los comandos de PCP. La ventaja es que siempre
lanzaremos nuestros comandos PCP contra esa direccin IP, pues Heartbeat se encargar de llevarla de
un nodo a otro segn sea necesario. Adems, las peticiones de pgpool-II a PostgreSQL vienen ahora
desde esa direccin IP, por lo que es conveniente revisar que nuestros ficheros
/etc/postgresql/8.3/main/pg_hba.conf permiten las conexiones desde ambas con el usuario pgpool2.
Por otra parte, los comandos que nuestros clientes quieran mandar contra el clster usarn, a partir de
ahora, la direccin IP 192.168.0.2 y el puerto 9999. Al igual que antes, dado que Heartbeat se encargar
de mover esta direccin IP y el servicio pgpool2 de nodo a nodo, nuestros clientes siempre funcionarn
de la misma manera. Este es uno de los propsitos principales de la alta disponibilidad que acabamos de
configurar (adems de la alta disponibilidad de la que gozamos, por supuesto).
Podemos probar nuestro clster con un simple comando como el que sigue:
psql -h 192.168.0.2 -p 9999 -U pgpool2 -d bench_replication -c "UPDATE ACCOUNTS SET abalance = 1009 WHERE aid = 10"
Herramientas de monitorizacin
En Internet pueden encontrarse un gran nmero de herramientas de gestin y monitorizacin de
PostgreSQL, tanto de cdigo abierto como propietarias. A continuacin se presenta una lista de algunas
de ellas que, personalmente, me resultan de gran utilidad.
pg_osmem y pg_buffercache
pg_osmem es un script hecho en Python por Kenny Gorman que permite obtener informacin sobre la
memoria cach que un sistema Linux est dedicando al servidor PostgreSQL. Utiliza un script en Perl
llamado fincore (pronunciado en ingls eff in core), creado por David Plonka, Archit Gupta y Dale Carder
de la universidad de Wisconsin-Madison y que fue presentado en la LISA '07.
SET
CREATE FUNCTION
CREATE VIEW
REVOKE
REVOKE
Entonces, mediante el script pg_osmem podemos obtener una salida similar a la siguiente:
OS Cache Usage:
bench_replication:accounts_pkey:566272
bench_replication:pg_proc:102400
bench_replication:pg_proc_proname_args_nsp_index:79872
bench_replication:pg_depend:79872
bench_replication:pg_depend_reference_index:65536
[..]
psql -d bench_replication
ON b.relfilenode = c.relfilenode
GROUP BY c.relname
-------------------+---------------+----------
(25 rows)
Gracias a estos dos cdigos, podemos ver el conjunto de buffers ms utilizado en la cach del sistema
operativo y compararlo con la cach de PostgreSQL. La salida de ambos comandos es en bytes.
pg_top
pg_top es un top para PostgreSQL, derivado del top de UNIX. Similar a top, pg_top permite monitorizar
los procesos de PostgreSQL y, adems, ofrece estas otras funcionalidades:
Los fuentes de pg_top pueden descargarse de su pgina web en PgFoundry. Tambin podemos bajarnos
la ltima versin de desarrollo del repositorio Git de pgFoundry mediante el siguiente comando:
cd /usr/local/src
cd pg_top
./autogen.sh
pg_top se instala por defecto en /usr/local/bin, pero podemos cambiar la ruta mediante el parmetro
--prefix del script configure:
cd /usr/local/src
wget http://pgfoundry.org/frs/download.php/1780/pg_top-3.6.2.tar.bz2
cd pg_top-3.6.2
./configure --prefix=/opt/pg_top
make
make install
El uso de pg_top es anlogo al de top. Tan slo hay que invocar el ejecutable y usar las teclas para
obtener diferentes vistas e informacin de los procesos deseados. El ejecutable requiere tres parmetros:
pg_top asume localhost como hostname y 5432 como puerto por defecto. Usa el usuario de sistema
como medio de autenticacin por defecto, por lo cual deberemos pasarle datos de usuario y contrasea o
ejecutarlo como usuario postgres, dependiendo de la configuracin que tengamos en
/etc/postgresql/8.3/main/pg_hba.conf.
Podemos crearnos un script /opt/pg_top/pg_top donde hacer la llamada completa con todos los datos y
hacernos el trabajo ms sencillo, por ejemplo:
#!/bin/bash
ps
ps, o process status, la famosa utilidad presente en todos los UNIX, es una til herramienta para tener
una primera impresin de qu est haciendo PostgreSQL. Un sencillo comando tal que el que sigue ser
suficiente:
postgres 960 0.0 1.1 6104 1480 pts/1 SN 13:17 0:00 postgres -i
postgres 963 0.0 1.1 7084 1472 pts/1 SN 13:17 0:00 postgres: writer process
postgres 965 0.0 1.1 6152 1512 pts/1 SN 13:17 0:00 postgres: stats collector process
postgres 998 0.0 2.3 6532 2992 pts/1 SN 13:18 0:00 postgres: tgl runbug 127.0.0.1 idle
postgres 1003 0.0 2.4 6532 3128 pts/1 SN 13:19 0:00 postgres: tgl regression [local] SELECT waiting
postgres 1016 0.1 2.4 6532 3080 pts/1 SN 13:19 0:00 postgres: tgl regression [local] idle in transaction
pgd
pgstat, otra utilidad desarrollada por Kenny Gorman, es muy similar a iostat pero orientada a bases de
datos. Es una utilidad muy til para realizar diagnsticos rpidos, tests de rendimiento, etc. La salida es
adecuada para ser importada en hojas de clculo o en programas que puedan generar grficas.
En la pgina web de Kenny Gorman se explica cmo obtener grficas de la salida de pgd usando gnuplot.
Ver la bibliografa para el enlace.
iotop
Iotop es un script de Python con una interfaz de usuario similar a la de top que sirve para mostrar qu
proceso est originando qu carga de lecturas y escrituras de disco (E/S). Requiere Python 2.5 o superior
y un kernel de Linux versin 2.6.20 o superior. Este script muestra la misma informacin que el comando
vmstat, pero asociando la carga al proceso que la genera y mostrando la informacin de una forma
mucho ms til para el administrador de sistemas.
Su instalacin es muy sencilla pues, a partir de Lenny, viene como paquete Debian:
Optimizacin de PostgreSQL
Para un sistema inicial de pruebas, tanto pgsql1 como pgsql2 tienen 1 GB de memoria RAM. Teniendo en
cuenta esta situacin, se configurarn los siguientes parmetros en el fichero de configuracin de
PostgreSQL /etc/postgresql/8.3/main/postgresql.conf:
max_connections = 100
shared_buffers = 256MB
work_mem = 2MB
effective_cache_size = 512MB
Work Memory es por conexin, por lo que hay que calcular un mximo de 2 * 100 = 200 MB para el total
de conexiones. Effective Cache Size debera ser entre el 50 y el 75% de la memoria RAM fsica,
dependiendo de si hay otros servicios ejecutndose en la mquina o no.
Respecto del kernel, para poder reservar 512 MB de shared buffers necesitaremos un tamao mximo de
un segmento compartido igual al valor que nos devuelva el error de PostgreSQL al arrancar, 279.134.208
bytes, unos 266 MB.
La variable SHMMAX del kernel indica el tamao mximo de los segmentos de memoria compartida, y
debe ser de, al menos, varios megabytes. La variable de kernel SHMALL indica el nmero total de pginas
de memoria compartida disponibles. SHMALL es igual a SHMMAX dividido por PAGE_SIZE, redondeado
hacia arriba. PAGE_SIZE es, por defecto, de 4 kilobytes.
sysctl -w kernel.shmmax=279134208
sysctl -w kernel.shmall=2097152
El primero son bytes, el segundo pginas. Para asegurarnos que los valores permanezcan tras un reinicio,
aadiremos las siguientes dos lneas al fichero /etc/sysctl.conf:
kernel.shmmax=556212224
kernel.shmall=2097152
cat /proc/sys/kernel/shmmax
cat /proc/sys/kernel/shmall
El valor por defecto de SHMMAX suele ser 33.554.432 bytes. El valor por defecto del nmero de pginas
que un segmento compartido puede tener ya es mayor que lo que necesitamos (553.607.168 / 4096 =
135.158 < 2.097.152), as es que no har falta modificarlo ni aadir la lnea correspondiente a
/etc/sysctl.conf.
PostgreSQL 8.3 realiza un vacuum automtico de manera peridica, por lo que no debera de ser
necesario ejecutar un FULL VACUUM a menos que grandes porciones (ms de un tercio o, incluso, ms de
la mitad) de las tablas de borren e inserten con frecuencia (por ejemplo durante cargas de datos
nocturnas mediante procesos por lotes). En este caso, ejecutar VACUUM ANALIZE para que la
informacin estadstica del planificador de consultas est actualizada es tambin muy conveniente. En la
documentacin oficial de PostgreSQL (ver bibliografa) podemos encontrar varios consejos muy tiles en
el caso de realizar grandes cargas de datos (iniciales o peridicas).
Procesos errantes
En el caso de detectar un proceso en segundo plano que lleve ocupado "demasiado" tiempo, podemos
determinar qu est intentando llevar a cabo dicho thread, a partir de su PID, mediane la siguiente
consulta: