jueves, 27 de junio de 2013

Backup en Postgres

En algún momento de nuestra vida, trabajando con BBDD, tendremos que generar backups o restaurarlos. En estos momentos yo me hayo en esta situación, teniendo que restaurar un backup en una base de datos postgreSql y voy a contar un poco como lo tenemos montado y los pasos que hay que hacer para restaurarla con el fin de tener una guía para el futuro y si de paso a alguien le sirve que la tenga también.


En primer lugar, nosotros tenemos 1 base de datos master y otra de solo lectura en sclave, donde cada X minutos se carga un fichero wal con las modificaciones que hayan sucedido en esa franja de tiempo (al final contiene insert, updates,...etc). De esta manera tenemos la base de datos master replicada.

Además de lo anterior generamos un PITR-base backup que no es más que un empaquetado diario de el data, y con el comando pg_dump -i -h MAQUINA -p 5432 -U USUARIO -F p -b -O -v -f FICHERO BASEDEDATOS generamos unos ficheros .dum de todas nuestras bases de datos. De esta manera podemos recuperarlas de manera individual.

Las opciones de restauración que tenemos son las siguientes:
  • La primera consistiría en coger el PITR-base backup, descomprimirlo, borrar todo el data y sustituirlo. Tenemos que tener en cuenta que tendremos que borrar el archivo postmaster.pid (contiene el id del proceso postgres,...etc), comprobaremos que los ficheros pg_hba.conf y postgresql.conf son correctos (si no queremos que siga archivando modificaremos en el postgresql.conf la propiedad archive_mode = off) y que la versión de generación y la de recepción es la misma.
  • La segunda opción es restaurarla por el fichero .dum que tengamos. Para ello lo recomendable es borrar la base de datos entera DROP DATABASE nombre_base_datos , crear la base de datos de nuevo CREATE DATABASE nombre_base_datos , generar el rol del usuario CREATE USER nuevo_usuario IDENTIFIED BY contraseña y después lanzamos el comando psql -U USUARIO -h MAQUINA -p 5432 -d BASEDEDATOS < infile. Como nota adicional para este paso decir que si tenemos un data corrupto podemos borrarlo, lanzar el comando /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data y nos lo regenerará vacío, solo tendremos que crear la Base de datos, el rol del usuario y realizar lo descrito.
Como nota adicional, si quisiésemos resincronizar la base de datos espejo tendríamos que hacer lo siguiente:
  • Parar la máquina espejo
  • Guardar el postgresql.conf, recovery.conf y pg_hba.conf
  • Borrar el tlog y el data
  • Copiamos y descomprimimos el PITR-base backup en data
  • Sustituimos los ficheros postgresql.conf, recovery.conf y pg_hba.conf por los que hemos guardado.
  • Arrancamos el espejo
  • Copiamos de la principal los ficheros de tlog hacia el espejo
En el caso de que nos diese un error ERROR: language "plpgsql" does not exist, tendremos que generar el handler y lenguage. Para esto buscamos el archivo plpgsql.so y, sustituyendo la ruta donde esté, lanzamos lo siguiente:

CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS '/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C'; CREATE LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL';



No hay comentarios:

Publicar un comentario