Está en la página 1de 7

Copias de Seguridad y Recuperacin en PostgreSQL - Parte 1

Introduccin En esta ocasin vamos a ver cmo realizar un procedimiento de backup utilizando las herramientas que nos proporciona PostgreSQL. En estas primeras partes, veremos cmo podemos utilizar <pg_dump> y las principales opciones. Posteriormente, veremos cmo utilizar PostgreSQL PITR -Point In-Time Recovery- y qu ventajas nos ofrece este sistema de respaldo. Tipos de Backups En PostgreSQL existen diferentes tipos de Copias de Seguridad -Backups-: Completos y Parciales. En esta primera parte, veremos los backups completos y cmo podemos realizarlos, dejaremos los backups parciales para las siguientes entregas. Backup Completo -Full BackupEste tipo de copia de seguridad es un volcado completo de nuestra base de datos en un instante "t", y como es natural, contiene la informacin hasta el instante que comenzamos el proceso de backup. Para realizar este backup utilizaremos el comando <pg_dump> y, es posible realizar esta operacin en caliente, es decir, podemos tener nuestra base de datos abierta. Ventajas Backup Completo

Sencillo de realizar Se puede realizar en caliente Backup "consistente" En bases de datos pequeas en muy rpido Se restaura "todo" o "nada" Consumo de I/O elevado En bases de datos grandes puede no ser efectivo

Problemas Backup Completo

Realizar un Backup Ya hemos hablado que para realizar un "full backup" utilizaremos el comando <pg_dump> cuyo formato es el siguiente: pg_dump [OPCIONES] [DATABASE] Donde las opciones ms importantes son

-f, Nombre del archivo de salida donde vamos a guardar nuestro backup

-Z, Salida comprimida con GZip. Por defecto el nivel de compresin es normal, pero podemos utilizar la compresin mxima si ponemos -Z 9 -a, Slo datos, nada de estructura. -b, Incluye objetos grandes en el volcado (blobs) -c, Aade comandos de borrado (clean) antes de cada objeto, por ejemplo, "DROP SCHEMA ..." -C, Aade los comandos de creacin (create) antes de cada objecto, por ejemplo, "CREATE SCHEMA ..." -E, Utiliza el tipo de caracteres indicado en el volcado, por ejemplo, "-E UTF8" -n, Vuelca slo el schema indicado, por ejemplo, "-n public" -N, Vuelca todos los schemas menos el indicado, por ejemplo, "-N private" -o, Incluye los OIDs en el volcado -O, No restaura los propietarios a los objetos -s, Vuelca slo estructura nada de datos -t, Vuelca slo la tabla indicada, por ejemplo, "-t havoctec.users" -T, Vuelca todas las tablas menos la indicada, por ejemplo "-T havoctec.options" -X, No vuelva los privilegios, es decir, los GRANT y REVOKE

Por ejemplo, podemos realizar un backup completo utilizando $ pg_dump -f /u07/backups/full/havoctec-db-FULL02.NOV.2010.dump.gz -Z 9 -o -C havoctec Restaurar un Full Backup La restauracin de un backup realizado con <pg_dump> es realmente sencilla, debemos tener en cuenta que al ser un backup completo vamos a "volcar todos los datos". En funcin de las opciones que hemos utilizado en el volcado, deberemos realizar algunos pasos diferentes, por ejemplo, si hemos utilizado la opcin -C <opcin Create>, dentro del propio dump tendremos los comandos SQL para la creacin de la base de datos, y por lo tanto no ser necesario crearla. Si no hemos utilizado esa opcin, deberemos crear la base de datos primero -a no ser que queramos restaurar sobre otra base de datos diferentePara realizar la restauracin de un volcado completo, utilizaremos el comando <psql> y como entrada nuestro archivo de backup, por ejemplo $ psql -U postgres < /u07/backups/full/havoctec-db-FULL02.NOV.2010.dump Fijaros que no he puesto el archivo gzip (.gz) ya que el comando <psql> cree que lo que viene son instrucciones SQL en texto plano, si no queremos descromprimirlo podemos utilizar

$ gzip -dc /u07/backups/full/havoctec-db-FULL-02.NOV.2010.dump | psql -U postgres

Un Ejemplo Completo En este ejemplo vamos a crear una base de datos llamada "havoctec" y en ella una tabla donde introduciremos varios datos. Posteriormente realizaremos una copia de seguridad y la restauraremos. Recordar que si no tenemos asignado el valor de <PGDATA> deberemos exportarlo antes de poder trabajar con PostgreSQL. $ export PGDATA=/var/postgres/8.4/data Nos conectamos a PostgreSQL y crearemos la base de datos <havoctec> $ psql -U postgres Password for user postgres: psql (8.4.1) Type "help" for help. postgres=# create database havoctec; CREATE DATABASE postgres=# \c havoctec; psql (8.4.1) You are now connected to database "havoctec". havoctec=# create table urls(url_id serial, url_name character varying); NOTICE: CREATE TABLE will create implicit sequence "urls_url_id_seq" for serial column "urls.url_id" CREATE TABLE havoctec=# insert into urls(url_name) values('http://www.havoctec.com/'); INSERT 0 1 havoctec=# insert into urls(url_name) values('http://www.sfchildren.com/'); INSERT 0 1 havoctec=# insert into urls(url_name) values('http://sparcki.blogspot.com/'); INSERT 0 1 havoctec=# select * from urls; url_id | url_name --------+------------------------------

1 | http://www.havoctec.com/ 2 | http://www.sfchildren.com/ 3 | http://sparcki.blogspot.com/ (3 rows) A continuacin, realizaremos una copia de seguridad utilizando la opcin <-C> (create) para poder restaurar en la misma base de datos con el mismo nombre. $ time pg_dump -C -f /var/backups/havoctec-db-full.dump -U postgres havoctec Password: real 0m3.490s user 0m0.029s sys 0m0.012s Ahora, borramos la base de datos $ psql -U postgres Password for user postgres: psql (8.4.1) Type "help" for help. postgres=# drop database havoctec; DROP DATABASE postgres=# \q Por ltimo, restauraremos la base de datos $ psql -U postgres < /var/backups/havoctec-db-full.dump Password for user postgres: SET SET SET SET SET SET CREATE DATABASE ALTER DATABASE You are now connected to database "havoctec". SET SET SET SET SET SET

CREATE LANGUAGE ALTER LANGUAGE SET SET SET CREATE TABLE ALTER TABLE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE setval -------3 (1 row) ALTER TABLE REVOKE REVOKE GRANT GRANT Comprobamos que tenemos los mismos registros, realizando un simple <SELECT> $ psql -U postgres -d havoctec Password for user postgres: psql (8.4.1) Type "help" for help. havoctec=# select * from urls; url_id | url_name --------+-----------------------------1 | http://www.havoctec.com/ 2 | http://www.sfchildren.com/ 3 | http://sparcki.blogspot.com/ (3 rows) havoctec=# \q Automatizar la Copias usando el <cron> Por ltimo, podemos utilizar nuestro <crontab> para realizar una copia de seguridad completa diariamente, y as, evitar sorpresas de ltima hora. El problema que nos podemos encontrar es, principalmente, que el comando <pg_dump> nos solicite una contrasea y no podamos automatizar el proceso.

No hay problema, para ello est el archivo <pgpass> PostgreSQL Password File, en el cual declararemos los usuarios y contraseas necesarios para el acceso sin password. El formato del archivo es el siguiente: maquina:puerto:base de datos:usuario:password Si utilizamos un "*" en el campo de <base de datos> se podrn acceder a todas la bases de datos, por ejemplo, si queremos que el usuario backups pueda acceder a cualquier base de datos, ponemos $ echo "db1.havoctec.com:*:backups:password" > $HOME/.pgpass $ chmod 600 $HOME/.pgpass $ pg_dump -U backups -Z9 -C -f /var/backups/havoctec-dbfull.dump.gz havoctec Ahora PostgreSQL no nos ha solicitado la contrasea, porque la ha encontrado en el archivo, y por lo tanto, la ha introducido por nosotros, as que ya podemos aadir nuestra entrada al cron para que haga copias de seguridad completas todos los das a las 02:00h, por ejemplo, $ crontab -e 00 02 * * * /u01/app/postgres/8.4/bin/pg_dump -U backups -Z9 -C -f /var/backups/havoctec-db-full.dump.gz havoctec :wq

Conclusiones Hemos visto un primer acercamiento a las opciones en cuanto a Backup y Restore que nos ofrece PostgreSQL, y adems hemos definido una poltica bsica de copias utilizando el cron del sistema, para, al menos, tener una copia diaria de nuestra base de datos. En las siguientes entregas veremos cmo podemos crear una poltica de Backup y Restore Eficiente y Segura en PostgreSQL

También podría gustarte