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
No hay comentarios.:
Publicar un comentario