sábado, 16 de febrero de 2013

Backups PostgreSQL OPENERP


Backups PostgreSQL OPENERP Incremental y diferencial


Antecedente


En vista de proteger la base de OpenERP frente a cualquier daño, se ve la necesidad de  mantener backups.

Objetivo


Obtener backups completos semanales y diarios diferenciales de la base de datos postgresql de OpenERP.

Resumen General


El backup semanal está calendarizado para ejecutarse todos los domingos a las 01:00 a.m., y los diferenciales de igual manera serán ejecutados a la 01:00 a.m., los días lunes, martes, miércoles, jueves, viernes y sábado.
Para poder hacer la restauración de un diferencial debemos tener a la mano siempre en backup completo del domingo anterior a ese diferencial.

 

Configuración de Backups Servidor (BDD)


Se generaron dos script, uno para los backups completos y otro para los backups diferenciales. Los mismos que se notan en la calendarización del Sistema Operativo del usuario openerp, que se muestra a continuación:



Nomenclatura de archivos


Se utiliza la siguiente nomenclatura para identificar a los archivos:

empresaerp_tipo_yyyy-mm-dd

Detalle:

Tipo
Ejemplo
Completo
empresaerp_full_2013-01-27
Diferencial
empresaerp_diff_2013-01-28
Completo Temporal (luego es borrado)
empresaerp_tempfull_2013-01-28

Nótese en los ejemplos, el backup completo fue el domingo 27 de enero del 2013, y al siguiente día lunes 28 se tiene el primer diferencial.

Script Backup Completo (Full)


Como se puede notar la ruta del script es /backups/scripts/backupfull.sh, el mismo que corre  los días domingo a la 01:00 a.m., a continuación el contenido del script.
#!/bin/bash
#
# Script by TRESCLOUD CIA. LTDA.
# www.trescloud.com
# +593 2 2269492
# Quito - Ecuador

echo Se mueve el anterior full del directorio last al directorio full
mv /backups/last/* /backups/full/

echo String para colocar la fecha al nombre de los backups
backup_date=`date +%Y-%m-%d`

echo Obtengo el nuevo full en el directorio last
pg_dump empresaerp -f /backups/last/empresaerp_full\_$backup_date

echo BORRADO DE BACKUPS

echo Cambiamos de directorio (Bases de datos)
cd /backups/full/

echo Dejar solo 2, en este caso 14 días de antiguedad, porque son semanales
numdiaslocbdd=14

for arch in $(find . -mtime +${numdiaslocbdd})
do
   echo Eliminando $arch
   rm -rf $arch
done

En resumen el script realiza los siguientes pasos:

1.       Mueve el último backup completo del directorio /backups/last hacia el directorio /backups/full.

2.       Saca en ese momento el respaldo completo de la base de datos y lo deja en la ruta /bakup/last/, para convertirse  en el punto de referencia de los respaldos diferenciales de la semana.

3.       Borra los backups completos de la carpeta /backups/full que tengan más de 2 semanas de antigüedad.

Dicho respaldo permanece en /backups/last hasta la siguiente ejecución calendarizada del script que tiene periodicidad semanal los domingos a las 1 a.m.
Todo el backup demora alrededor de 15 minutos, eso lo podemos notar en la fecha de modificación de la carpeta que tiene la fecha actual, en el paso 2.

Script Backup Diferencial (Diff)


Este script se encuentra en la ruta /backups/scripts/backupdiff.sh, el mismo que se ejecuta todos los días excepto el domingo, a la 01:00 a.m, a continuación el contenido del script

#!/bin/bash
#
# Script by TRESCLOUD CIA. LTDA.
# www.trescloud.com
# +593 2 2269492
# Quito - Ecuador

echo String para colocar la fecha al nombre de los backups
backup_date=`date +%Y-%m-%d`

echo Obtengo el nuevo full temporal en el directorio diff
cd /backups/diff/
pg_dump empresaerp -f /backups/diff/empresaerp_tempfull\_$backup_date

echo Guardo en una variable el nombre del full temporal
tempfull=empresaerp_tempfull\_$backup_date

echo Guardo en una variable el nombre de ultimo full
cd /backups/last/
lastfull=$(pwd)/

echo Saco un diferencial de ultimo full vs el full temporal actual
diff /backups/diff/$tempfull $lastfull > /backups/diff/empresaerp_diff\_$backup_date

echo Borro el full temporal
cd /backups/diff/
rm -rf empresaerp_tempfull\_$backup_date

echo BORRADO DE BACKUPS

echo Cambiamos de directorio para borar bases diferenciales históricas
cd /backups/diff/

echo Dejar solo 14, en este caso 14 días de antiguedad, porque son diarios
numdiaslocbdd=14

for arch in $(find . -mtime +${numdiaslocbdd})
do
   echo Eliminando $arch
   rm -rf $arch
done

En resumen el script realiza los siguientes pasos:

1.       Saca un respaldo completo temporal de la base de datos que se ubicará en la carpeta /backups/diff/.

2.       Genera un archivo diferencial, comparando el respaldo que se encuentra en /backups/last/ y el archivo que generó en el punto anterior, y este nuevo archivo diferencial lo guarda dentro de la ruta /backups/diff.

3.       Borra el respaldo completo temporal que hizo.

4.       Al final se verifica la antigüedad de los archivos, y se elimina automáticamente los que tengan más de 14 días de antigüedad.
Todo el proceso demora a la actualidad alrededor de 20 minutos, eso lo podemos notar en la fecha de modificación de los archivos dentro de la carpeta /backup/diff/.

Como restaurar un backup


Restauración de una base de datos Completa (Domingos)


Para realizar la restauración de la base de datos debemos ejecutar los siguientes pasos desde el usuario postgres.

1.       Ingresar el comando psql.

2.       Se debe eliminar las conexiones activas que se tengan con la base de datos que queremos remplazar, con el siguiente comando:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'empresaerp';


3.       Debemos borrar la base de datos, con el siguiente comando:

DROP DATABASE empresaerp;

4.       Recreamos la base de datos (vacía), con el siguiente comando:

CREATE DATABASE empresaerp WITH OWNER openerp TEMPLATE template0;

5.       Salir de psql ejecutando CTRL+D.

6.       Luego debemos restaurar el full del día correspondiente con el siguiente comando:

psql empresaerp < /backups/last/empresaerp_full_2013-01-27


Restauración de una base de datos diferencial (Lunes-Sábado)


Para restaurar un diferencial, necesitamos obtener primero el respaldo completo de ese día, en el ejemplo anterior se explicó como restaurar un respaldo completo del día domingo 27, digamos que necesitamos restaurar  el respaldo diferencial del día lunes 28.

Debemos realizar los mismos pasos explicados anteriormente excepto el último, que es el que ya realiza la restauración como tal.

Se debe generar el respaldo completo, tomando el último full que se encuentra en /backups/last, y el diferencial que necesitemos que se encuentra en /backups/diff, y debemos ejecutar el siguiente comando:

patch -b /backups/last/empresaerp_full_2013-01-27 /backups/diff/empresaerp_diff_2013-01-28

Este comando nos ayudará a unir el contenido de ambos correctamente de manera que se tenga un respaldo consistente, sin corrupción alguna.

Luego de ejecutar este comando, se renombrará el archivo que dice "empresaerp_full_2013-01-27" por   "empresaerp_full_2013-01-27.orig" que sigue siendo el mismo, y el nuevo archivo que es la unión del completo mas el diferencial tendrá el nombre  "empresaerp_full_2013-01-27", que será el que debemos restaurar con el paso 6 de los puntos explicados anteriormente.

NOTA: El comando deberá ser ejecutado dentro del directorio /backups/last/

para mas información contactanos www.trescloud.com