39

Fundamentos de Administración PostgreSQL

Embed Size (px)

Citation preview

FundamentosFundamentos de de AdministraciónAdministración

PostgreSQLPostgreSQL

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.

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).

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.

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).

Características de la instalaciónEl 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

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ónEl usuario postgres

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ónEl cluster

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

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

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

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

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

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

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

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

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

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

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

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

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

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

•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

•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

•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

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)

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)

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)

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

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

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

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

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

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

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

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

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

¡Muchas gracias por su atención!