3. PostgreSQL
PostgreSQL es un Manejador de Bases de Datos
Objeto-Relacionales (ORDBMS – por sus siglas en
inglés) que posee las siguientes características:
•Basado en Postgres v4.2 desarrollado por la
Universidad de California.
•Tiene más de 15 años en el mundo de los
Manejadores de Bases de Datos.
•Es Software Libre disponible bajo la licencia BSD.
•Corre sobre Windows, Linux, MacOS y Unix (la
mayoría de sabores).
•Soporta la mayoría de los tipos de datos definidos
por los estándares SQL92 y SQL99.
•Soporta una gran variedad de datos BLOB.
4. PostgreSQL
•Posee interfaces nativas de programación para
C/C++, Java, .NET, Perl, Python, Ruby, Tcl, ODBC, entre
otros. Y puede ser extendido por cualquier persona
porque es libre!!
•Como manejador empresarial ofrece:
•Control de Concurrencia para Múltiples Versiones
(MVCC – por sus siglas en inglés).
•Recuperación con marcas de tiempo.
•Espacios de trabajo para tablas (Tablespaces).
•Respaldos en línea (en caliente).
•Un sofisticado planificador y optimizador de
consultas (queries).
•Bitácora de escritura anticipada (WAL – Write
Ahead Logging).
5. PostgreSQL
•Soporta diferentes juegos de caracteres
internacionales (Ej. UTF8).
•Ofrece ordenamiento de registros según el juego de
caracteres seleccionado.
•Soporta bases de datos de tamaño ilimitado, tablas
de hasta 32TB, filas de 1,6TB, campos de 1GB, filas
ilimitadas por tabla, 250 a 1600 columnas por tabla
(dependiendo de los tipos de dato) e índices ilimitados
por tabla.
•Ha recibido un sin número de reconocimiento de
parte de sus usuarios y la industria.
6. Instalación
Para instalar PostgreSQL debe descargar el mismo de
su página oficial: http://www.postgresql.org
En sistemas Linux Debian puede instalarlo fácilmente
utilizando APT (la herramienta para gestión de
paquetes de Debian).
# apt-get install postgresql-8.X postgresql-contrib-8.X
Donde X se refiere a la versión del manejador (Ej. 1, 2
ó 3).
7. Características de la instalación
El usuario postgres
PostgreSQL crea un usuario del sistema que servirá
como Administrador (root) de la BD.
Este usuario recibe el nombre de postgres.
En los sistemas Linux el usuario administrador
(postgres) no posee clave para acceder al sistema por
omisión (recomendado). Luego, la misma puede ser
cambiada por el usuario root del sistema con el
siguiente comando:
# passwd postgres
8. Si el administrador del sistema no desea asignarle una
clave al usuario postgres, éste podrá acceder con la
cuenta del mismo sólo a través del usuario root.
# su – postgres
NOTA: Asignarle contraseña al usuario postgres,
permitiría a cualquier usuario del sistema (con
conocimiento de la contraseña) acceder como éste.
Características de la instalación
El usuario postgres
9. Una instancia de PostgreSQl está relacionada con uno
o más clusters.
Un cluster representa un conjunto de bases de datos y
por omisión la instalación del manejador únicamente
hace referencia a uno, ubicado en instalaciones Linux
Debian dentro de la carpeta:
/var/lib/postgresql/8.X/main
Para ver el número de clusters a las que hace
referencia una instancia de PostgreSQL puede utilizar
el siguiente comando: pg_lsclusters
Características de la instalación
El cluster
10. Para detener o iniciar una instancia de PostgreSQL se pueden
utilizar el script (postgresql-8.X) ubicado en la carpeta /etc/init.d
o el comando pg_ctl (sólo para root y postgres).
Ambas herramientas pueden utilizarse con el mismo conjunto de
parámetros (start, stop, restart y reload – iniciar, parar, reiniciar
y recargar respectivamente), con la diferencia de que el
comando pg_ctl ofrece un mayor control para administradores
de base de datos. Por ejemplo un administrador podría bajar el
manejador esperando que todas las conexiones activas
cerrasen, utilizando el siguiente comando:
$ pg_ctl stop -m smart
Iniciar y detener el manejador
11. Los parámetros de configuración de la instancia del
manejador residen en el archivo postgresql.conf.
Este archivo puede ser ubicado, para instalaciones
Linux Debian, en la carpeta /etc/postgresql/8.X/main/
Dentro del archivo de configuración pueden definirse
una gran cantidad de parámetros del manejador,
como: utilización de la memoria, algoritmos de
ordenamiento, planificación, optimización, manejo de
errores, de trazas, de bitácoras, entre otros.
Configuración
12. Los clientes que se conectarán al manejador deberán
especificarse explícitamente en el archivo de
configuración pg_hba.conf.
El archivo pg_hba.conf se encuentra en el mismo
directorio que el archivo postgresql.conf y permite
definir que usuarios tienen acceso a las diferentes
bases de datos del cluster, cómo lo harán y el método
que deberán utilizar.
Configuración de Clientes válidos
13. PostgreSQL dispone de un intérprete de comandos para consola
llamado PSQL.
Para utilizar PSQL simplemente deberá ejecutar el siguiente
comando:
$ psql BD USUARIO [-h IP_MANEJADOR]
Donde:
•BD se refiere al nombre de la base de datos a la cual desea
conectarse el cliente.
•USUARIO se refiere al nombre del usuario que se conectará
a la BD; previamente definido en pg_hba.conf
•IP_MANEJADOR se refiere a la dirección IP donde se
encuentra instalado el manejador. Debe acompañarse del
parámetro -h.
Cliente de comandos - PSQL
14. El cliente PSQL ofrece varios comandos para facilitar el
trabajo de los usuarios. Una lista completa de éstos
puede encontrarse ejecutando el comando:
BD=# ?
Además, PSQL contiene una ayuda en línea para cada
una de las diferentes sentencias SQL soportadas por
PostgreSQL. Esta ayuda puede accederse utilizando el
comando h. Por ejemplo:
BD=# h ALTER USER
Cliente de comandos - PSQL
15. En PostgreSQL existen roles que pueden conectarse a
las diferentes bases de datos con un conjunto de
permisos -predefinidos- sobre los diferentes objetos
contenidos por éstas.
Los roles pueden representar usuarios o grupos del
manejador.
Los roles pueden ser creados a través de sentencias
SQL o comandos de consola.
Roles
16. Para crear roles por consola puede utilizarse el siguiente
comando (conectado como postgres):
$ createuser NOMBRE_USUARIO -P
Donde la opción -P preguntará al usuario por la contraseña
del rol.
Luego, si se desea crear el usuario con sentencias SQL se
puede hacer uso de la siguiente sintaxis (conectado a la BD
con algún cliente. Ej. PSQL):
BD=# CREATE USER nombre_usuario WITH PASSWORD
'clave_usuario';
Roles
17. De igual forma, si deseara eliminar roles creados
anteriormente, podrá hacerlo por consola o
directamente a través de un cliente de BD con
sentencias SQL.
Por consola:
$ dropuser NOMBRE_USUARIO
Utilizando SQL:
BD=# DROP USER nombre_usuario;
Roles
18. Las bases de datos son creadas tomando como dueño
el usuario que las crea u otro especificado
explícitamente.
Todas las bases de datos creadas en PostgreSQL son
inicializadas como una copia -por omisión- de la Base
de Datos plantilla template1.
En caso de que desee agregar un conjunto de tablas,
funciones o soporte de lenguajes a todas las bases de
datos que cree, puede hacerlo agregando éstas
características a la Base de Datos template1.
Crear y eliminar bases de datos
19. Las bases de datos pueden crearse de la siguiente
forma:
Por consola:
$ createdb NOMBRE_BD -O NOMBRE_USUARIO_DUEÑO
Utilizando SQL:
BD=# CREATE DATABASE nombre_bd WITH OWNER
nombre_usuario_dueño;
Crear y eliminar bases de datos
20. Cuando desee crear una base de datos a partir de otra plantilla
diferente de template1, puede hacerlo de la siguiente forma:
Por consola:
$ createdb NOMBRE_BD -T NOMBRE_PLANTILLA
Utilizando SQL:
BD=# CREATE DATABASE nombre_bd WITH TEMPLATE
nombre_plantilla;
NOTA: Para crear bases de datos en blanco, que después
restaurará a partir de respaldos realizados con pg_dump, se
recomienda utilizar como plantilla template0. Esto se debe a
que los respaldos DUMP poseen los objetos heredados de
template1.
Crear y eliminar bases de datos
21. Al igual que los roles, las bases de datos pueden ser
eliminadas con el comando DROP.
Por consola:
$ dropdb NOMBRE_BD
Utilizando SQL:
BD=# DROP DATABASE nombre_bd;
Crear y eliminar bases de datos
22. Los espacios de trabajo para tablas (tablespaces) permiten
a los administradores definir directorios diferentes, al
utilizado por el cluster activo, para almacenar bases de
datos y sus objetos.
Para crear un tablespace puede ejecutar la siguiente
sentencia:
BD=# CREATE TABLESPACE nombre_tablespace LOCATION
'ruta_absoluta_tablespace';
Para asignar el tablespace creado a una tabla:
BD=# CREATE TABLE foo(i int) TABLESPACE
nombre_tablespace;
Espacios de trabajo para tablas
23. Los privilegios permiten garantizar o restringir el
acceso a determinados objetos de la Base de Datos
para determinados usuarios.
Cuando se le confieren permisos a un usuario se utiliza
la palabra GRANT y cuando se le niegan la palabra
REVOKE.
Los roles pueden tener los siguientes privilegios:
•SELECT. Permite consultar cualquier columna de la
tabla, vista o secuencia especificada. Además, permite
utilizar las sentencias COPY TO, UPDATE y DELETE.
Privilegios
24. •INSERT. Permite insertar registros en la tabla especificada.
También permite utilizar la sentencia COPY FROM.
•UPDATE. Permite actualizar cualquier columna de la tabla
especificada. También permite utilizar las sentencias
SELECT ... FOR UPDATE y SELECT ... FOR SHARE, siempre y
cuando también se disponga del privilegio SELECT. Para las
secuencias habilita el uso de las funciones nextval y setval.
•DELETE. Permite eliminar registros de la tabla
especificada. Generalmente debe acompañarse del
privilegio SELECT para poder especificar condiciones.
•REFERENCES. Para poder crear una clave foránea es
necesario tener este privilegio sobre ambas tablas de la
relación.
Privilegios
25. •TRIGGER. Permite la creación de triggers sobre la tabla
especificada.
•CREATE. Para bases de datos, permite crear nuevos
esquemas dentro de la misma. Para esquemas, permite la
creación de nuevos objetos dentro del mismo. Para espacios
de trabajo para tablas, permite la creación de tablas, índices
y bases de datos.
•CONNECT. Permite a los usuarios especificados conectarse
a una base de datos determinada. Ahora, el usuario también
debe tener permisos en el archivo pg_hba.conf.
•TEMPORARY o TEMP. Permite crear tablas temporales para
la base de datos especificada.
Privilegios
26. •EXECUTE. Permite utilizar la función especificada. Este es
el único privilegio para tratar funciones.
•USAGE. Para lenguaje procedimental, permite el uso del
mismo para la creación de funciones. Para esquemas,
permite acceder a los objetos contenidos dentro del mismo.
Para secuencias, permite el uso de las funciones curval y
nextval.
•ALL PRIVILEGES. Garantiza todos los privilegios disponibles.
Privilegios
27. PostgreSQL soporta un gran número de codificaciones
(encodings) para localización.
La codificación ha utilizar debe ser especificada al momento
de inicializar el cluster o cuando se crean bases de datos.
Para el caso de Venezuela se recomienda colocar la
codificación de zona es_VE.UTF8. Luego, esta puede ser
cambiada cada vez que se cree una nueva BD.
Resulta realmente importante definir -al momento de
instalación del manejador- la variable LC_CTYPE con valor
POSIX o C. Esto ofrecerá la capacidad de manejar cualquier
codificación disponible.
Codificaciones (encodings)
28. Para inicializar un nuevo cluster y especificar sus
parámetros de codificación se puede utilizar el siguiente
comando:
# initdb --locale=es_VE.ISO8859-1 -D DIRECTORIO_CLUSTER
En el ejemplo mostrado arriba se especifica el idioma como
español de Venezuela y la representación de caracteres ISO-
8859-1 (también llamada LATIN1).
Las codificaciones ISO (EJ. ISO-8859-1) representan cada
caracter con un byte, mientras que las UNICODE (Ej. UTF8)
con varios.
Codificaciones (encodings)
29. La codificación que utilizará una base de datos debe ser
especificada cuando es creada. Por ejemplo:
Por consola:
$ createdb NOMBRE_BD -E NOMBRE_CODIFICACION
Utilizando SQL:
BD=# CREATE DATABASE nombre_bd WITH ENCODING
'nombre_codificacion';
Donde NOMBRE_CODIFICACION podría ser: LATIN1 (o
ISO88591), UTF8, entre otros.
Codificaciones (encodings)
30. Para mejorar el rendimiento del manejador puede hacerse
uso de las siguientes herramientas:
•VACCUM. Libera espacios de memoria disponibles para ser
considerados nuevamente por el Manejador y/o el Sistema
Operativo (VACCUM FULL). Por ejemplo: cuando son
eliminados registros de una tabla, realmente son marcados
por el manejador como eliminados pero éstos no son
ofrecidos nuevamente como disponibles, el VACCUM libera
estos espacios para que puedan ser utilizados nuevamente.
•ANALYZE. Actualiza la estadísticas del manejador y sus
planes de acceso a datos.
Mantenimiento
31. PostgreSQL dispone de una herramienta llamada
AUTOVACCUM que tiene como objetivo correr los comandos
VACCUM y ANALYZE cada cierto tiempo.
En los sistemas Linux esta herramienta es configurada como
una tarea CRON. En las distribuciones Debian se puede ver
el archivo de configuración CRON en: /etc/cron.d/postgresql-
common
NOTA: Para borrar tablas completas se recomienda utilizar
la sentencia TRUNCATE en lugar de DELETE FROM; para
evitar registros que ocupen espacio indeseado.
Mantenimiento
32. Para respaldar bases de datos se recomienda utilizar el
comando pg_dump y para restaurarlas el cliente PSQL o el
comando pg_restore.
Para generar un respaldo a partir de una BD (comprimido
directamente):
$ pg_dump NOMBRE_BD [-h IP_MANEJADOR] | gzip >
NOMBRE_RESPALDO.gz
Para restaurar una BD respaldada en formato DUMP se
puede utilizar el siguiente comando:
$ gunzip -c NOMBRE_RESPALDO.gz | psql NOMBRE_BD
Respaldo y recuperación
33. Existen tres tipos de formatos en los que puede ser
generado un respaldo:
•Texto plano (por omisión). Este formato incluye las
sentencias SQL dentro del archivo de respaldo.
•Archivo TAR. Este formato debe ser restaurado con
pg_restore y permite elegir cuales objetos serán restaurados
a través de parámetros. Esta opción genera el respaldo
como un TAR.
•Archivo personalizado. Este formato debe ser restaurado
con pg_restore y permite elegir cuales objetos serán
restaurados y su estructura a través de parámetros. Este
formato es comprimido por defecto y es el que ofrece el
mayor nivel de flexibilidad a la hora de restaurar bases de
datos.
Respaldo y recuperación
34. Un cluster puede respaldarse completamente utilizando el
comando pg_dumpall y luego restaurarse con el cliente
PSQL.
Para ello podría utilizar los siguientes comandos. Para
respaldar:
$ pg_dumpall > ARCHIVO_RESPALDO
Para restaurar:
$ psql -f ARCHIVO_RESPALDO postgres
Respaldo y recuperación
35. Para monitorear el comportamiento de una BD pueden utilizarse
herramientas del Sistema Operativo o tablas del catalogo de la
misma.
Por ejemplo, si deseara conocer cuantas sesiones de BD se
encuentran abiertas -y que están ejecutando- podría probar el
siguiente comando (como root):
# ps auxw | grep ^postgres
El comando ps le mostraría todos los procesos corriendo
actualmente en el sistema junto con información detallada
acerca de los mismos. Luego, cuando se filtren estos resultados
con grep, sólo para aquellos procesos cuyo dueño sea postgres
podrán apreciarse todas las conexiones y el detalle de la
sentencia que ejecutan.
Monitoreo
36. Para observar las estadísticas del manejador, recolectadas
por el Colector de Estadísticas, puede acceder a las tablas
del catalogo.
Para ver una lista detallada de las tablas del catalogo puede
ejecutar el siguiente comando PSQL:
BD=# dS
Preste especial atención a las tablas: pg_stat_database y
pg_stat_activity.
Monitoreo
37. Es un poderoso cliente gráfico para PostgreSQL. Para
instalarlo en Linux Debian puede ejecutar:
# apt-get install pgadmin3
Para utilizarlo no deberá tener mayores problemas luego de
conocer los conceptos básicos de administración estudiados
en este taller.
PgAdmin3
38. A continuación se muestra una lista de enlaces importantes
donde podrá conseguir documentación actualizada acerca
de PostgreSQL:
•Página oficial. http://www.postgresql.org
•Sitio de PostgreSQL en Chile. http://www.postgresql.cl
•Soporte al manejador. http://www.pgsql.com/
Afortunadamente el manejador cuenta con una cantidad
importante de documentación en la Internet y resultan de
especial interés sus listas de correo. Ver:
http://www.postgresql.org/community/lists/
Enlaces importantes