PITR - Point in Time Recovery es un tipo de backup avanzado utilizado en sistemas PostgreSQL que trabajan con datos importantes los cuales no pueden perderse en caso de fallo.
Este artículo es un poco avanzado, largo y no muy interesante para pequeños sistemas sin grandes requerimientos de seguridad en lo concerniente a la perdida de datos por problemas de hardware. Necesitais conocimientos de administración de sistemas Linux/Unix y como trabajar con LVM (Linux Volume Manager) para administrar vuestros discos y particiones.
La teoria es fácil de entender, pero la práctica y la administración de este tipo de copias de seguridad es complicado y engorroso si queremos estar seguros de la calidad y utilidad de las mismas. PostgreSQL nos proporciona la infraestructura necesaria para poder realizar backups del tipo PITR, pero somos nosotros los que debemos de crear todo lo necesario para ponerla en uso.
PITR no es otra cosa que el almacenamiento y copia continua de todas las transacciones producidas por PostgreSQL desde el ultimo backup realizado a nivel de sistema de fichero. Esta copias de seguridad se podran usar en caso de un fallo grave de hardware con perdida de la zona de datos, ó de necesidad de restaurar nuestra base de datos en un determinado momento del pasado.
PITR funciona de la siguiente manera cuando está activado:

A continuación vamos a ver como se puede administrar todo esto, las reglas a seguir y lo que necesitamos hacer para poder empezar a utilizar PITR en nuestro sistema:
El grupo de volúmenes (VG) utilizado para albergar el volumen lógico (LV) utilizado para la partición de datos, debe de tener espacio libre suficiente para poder realizar un LVM-snapshot del LV de datos. Cuanto espacio extra libre se necesitará, dependerá de lo mucho que cambien vuestros datos en el LV mientras que el LVM-snapshot esta activo. Con un 25% de espacio libre en el VG deberiais de tener más que suficiente. El informe mandado al final por pitr_basebackup.sh incluye información sobre cuanto espacio se ha utilizado, el atributo con esta informacion es Allocated to snapshot
Un sistema de almacenamiento ideal para nuestro sistema podria tener esta configuración:

Dependiendo de la complejidad y redundancia de nuestro sistema este esquema puede variar. El más simple de todos solo tendria dos discos, uno para datos/WAL y otro para backup/logs, no tendria RAID y solamente un VG con un LV para la particion de datos y espacio libre para el snapshot.
Para administrar PITR vamos a utilizar 3 scripts en BASH, pitr_basebackup.sh, archive_wal.sh y archive_last_wal.sh. Los podeis grabar en un directoria que este definido en vuestro PATH, por ejemplo /usr/local/bin
Estos 3 scripts han estado en uso en la Universidad de Oslo durante varios años realizando sus trabajo sin problemas. Para que os hagais una idea, durante el último año ejecutamos pitr_basebackup.sh aproximádamente unas 3.650 veces, archive_last_wal.sh unas 5.256.000 y archive_wal.sh unas 500.000 veces. Muchas de las comprobaciones que hacen son para asegurarse que todo funciona sin problemas y para mandar informes despues de haber descubierto problemas y fallos durante situaciones no planeadas (discos llenos, etc).
Al final de este artículo teneis los tres scripts a modo de ejemplos para que veais como están implementados. Si quereis utilizarlos vais a tener que modificar algunas de las variables para adaptarlos a vuestro sistema. Las versiones de estos scripts que nosotros tenemos en uso som más completas ya que están integradas en nuestro sistema de administración y entre otras cosas graban el estatus de las ejecuciones en una base de datos interna.
A continuación teneis una descripción de las tareas que estos scripts realizan:
archive_last_wal.sh se ejecutará cada minuto por el usuario 'postgres' desde cron. Para ello teneis que actualizar el fichero cron del usuario postgres con esta linea:
* * * * * /usr/local/bin/archive_last_wal.sh -S hostname
archive_wal.sh se ejecutará automaticamente por postgreSQL cuando lo necesite. Para que esto ocurra tendreis que activar PITR en el fichero postgresql.conf definiendo estas dos lineas:
archive_mode = on archive_command = '/usr/local/bin/archive_wal.sh -P %p -F %f -S hostname'
pitr_basebackup.sh se tiene que ejecutar tambien por el usuario 'postgres' desde cron. Dependiendo de lo grande que sea vuestra instalación PostgreSQL y lo mucho que los datos cambien en la misma, tendreis que ejecutar este script más ó menos a menudo. Si dejais pasar mucho tiempo entre cada ejecución y teneis una instalación que genere muchos ficheros WAL, tardareis mucho en restaurar el sistema si teneis que hacer esto alguna vez.
Yo suelo ejecutarlo una vez al dia por la noche. Podeis por ejemplo actualizar el fichero cron del usuario postgres con esta linea:
01 03 * * * /usr/local/bin/pitr_basebackup.sh -S hostname -c t
Como veis, todos estos scripts se ejecutan por el usuario postgres. Por ello tendreis que actualizar el fichero /etc/sudoers con la siguiente linea:
postgres ALL = NOPASSWD: /usr/sbin/lvcreate, /usr/sbin/lvremove, /usr/sbin/lvdisplay, /usr/sbin/vgdisplay, /bin/mount, /bin/umount
El usuario postgres tiene que poder conectarse al cluster PostgreSQL via sockets y sin clave. Más información sobre como configurar la cuanta de administrador postgres, se puede encontrar en el artículo Asegurando la cuenta de administrador "postgres".
Si tuvieramos que restaurar los datos de nuestro cluster PostgreSQL a partir de las copias de seguridad realizadas por estos scripts tendriamos que realizar las siguientes operaciones:
restore_command = 'cp ${PG_BACKUP_PITR_WAL]_restore/%f %p'
LOG: archive recovery complete LOG: database system is ready
wal_level = archive archive_mode = on archive_command = '/usr/local/bin/archive_wal.sh -P %p -F %f -S hostname'
En GITHUB teneis los tres scripts de los que hablamos en este artículo liberados bajo la licencia GPLv3. Los podeis encontrar en:
https://github.com/rafaelma/pitr_scripts
Tendreis que actualizar las variables definidas en pitr_globalconf.sh para adaptarlas a vuestros sistemas. Es importante que tengais la configuración LVM de vuestro sistema correctamente configurada para que estos scripts funcionen. Mas información en el fichero README que encontrareis en GITHUB.
Comentarios
Nueva version
Vie, 15/05/2009 - 10:09 — rafaelmaEstamos preparando una nueva version de estos scripts que usa un fichero global de configuración para evitar configuración redundante.
Sugerencias
Lun, 01/06/2009 - 08:25 — AnónimoTratándose de sistemas linux, esta bastante correcto, pero tratando de sistemas como freebsd o solaris, basta con definir 2 raidz en mirrors (zfs) o 2 raidz2(doble paridad), y tienes asegurada la integridad de los datos, igual con freebsd con unas cuantas clases de geom se puede conseguir lo mismo, por lo que teniendo un mirror de un raidz y ademas siempre tener una copia diaria de la db en otro disco tienes solucionado el problema. Ademas de que no hace falta que postgresql registre en disco datos adicionales. siempre tendra la ultima db consistente, a pesar de fallo de hardware o algún error de usuario.
RAID y PITR
Lun, 01/06/2009 - 19:33 — rafaelmaEl uso de PITR es independiente de los mecanismos de seguridad y redundantes que tengas instalados a nivel del sistema de almacenamiento.
Los ejemplos que pones de diversos tipos de raid en otros sistemas operativos no anulan la necesidad de archivar las transacciones a nivel de base de datos (oracle y otras bases de datos funcionan igual).
Si no tienes activado el archivo continuo de transacciones (PITR) perderas todos los datos desde el momento del ultimo backup (consistente, por supuesto) hasta el momento en que un fallo grave de hardware con perdida de datos te oblige a restaurar tu base de datos desde una copia de seguridad.
PITR puede activarse/usarse independientemente de si usas o no un sistema raid (no importa el tipo o el sistema operativo)
RAID y PITR
Lun, 01/06/2009 - 21:38 — AnónimoSi bueno, tienes la razón, lo que quise decir es que, freebsd/solaris integran sistemas que prevén esos fallos graves de hardware, por lo que es un plus, nunca quise decir que no hace falta PITR, siento la confusión.
No Genera nada...
Lun, 17/08/2009 - 22:19 — AnónimoDe antemano pido disculpa y se que he sido todo un fastidio con problemas absurdos e imperdonables, pero como os he dicho desde un principio soy nuevo en el uso de postgres y Debian...
El ultimo problema que se me presento fue el siguiente, ya despues de haber adaptado completamente todos y cada uno de los elementos del script a mi ambiente Debian y de haber resuelto cada uno de los errores que me presentaron los scripts casi siempre por algun detalle de setear algun directorio y de seguir al pie de la letra cada una de las instrucciones dichas anteriormente para la aplicacion de los scripts sobre la base de datos, luego de ejecutar cada uno y con los parametros que me pide sin que me de ningun error o emita algun mensaje, entendi que en el directorio
# Directory for PITR base backups
PG_BACKUP_PITR_DATA="/var/lib/postgresql/8.1/main/wal/PITR_data"
Ese que es el directorio donde defini que me deberia generar el script es decir archivo desde el que voy a recuperar.
Comprendo que es bien dificil ofrecerme algun tipo de ayuda ya que no hay ningun tipo de error en especifico que se pueda estudiar, mas fijense que simplemente no se esta generando ese archivo en el directorio, si creen que eso pueda ser motivo de algo en especifico o si quizas creen que hay un parametro mal seteado sera mas que suficiente ayuda ya he intentado cambiar ese directorio y aun asi nada, de hecho en el resto de los directorios no se genera tampoco nada,
De ante mano insisto disculpen el fastidio y las gracias, cualquier dato que ademas les pueda facilitar para comprender mejor el problema solo solicitarlo
EL unico problema es que ante
Lun, 09/05/2011 - 21:50 — AnónimoEL unico problema es que ante una falla fisica de uno o mas discos (en RAID) no hay otra solucion que enviar a un laboratorio el/los discos para que recuperen los datos. En Madrid esta Onretrieval, uno de los lideres en la materia.
Aunque me han comentado que tanto esta empresa como cualquier otra del genero, cobran sus servicios bien de bien...
Pero...es la ultima opcion a recurrir segura.
pregunta de novato
Mar, 18/08/2009 - 00:01 — AnónimoComentario irrelevante con PITR. Trasladado a los foros: http://www.postgresql-es.org/node/323
Resuelto!!!!
Mié, 12/08/2009 - 16:22 — AnónimoLes comento que pues despues de revisar exahustivamente esa linea del script y no dar con el error, aun y cuando ya todas las variables que Rafael Martinez me comento estaban seteadas (modificadas) segun y acorde a mi SO, seguia dando con el error asi que desgloce la linea y cada una de las salidas que esta linea llamaba y mostraba, asi que di con que para poder hacer el calculo del 5 % sobre el
let FIVE_PORCENT_PITR_DATA_DISK=`$DF $PG_BACKUP_PARTITION | $EGREP "([0-9])%" | $AWK -F' ' '{print $4}'`*5/100
$DF = "esta instruccion muestra datos asociados a las particiones que existen aqui es importante y es donde me daba el problema, que se fijen al ejecutar esto por el cron como se les muestra la informacion. Es decir en mi caso fue el siguiente:
S.ficheros | Bloques de 1K | Usado | Dispon | Uso% | Montado en
entonces aqui como se fijan existen 6 columnas y esta linea del script necesita la informacion contenida en Dispon, asi que para que señale bien el script y sobre la columna necesaria lo hace con el print $ que es una instruccion propia del awk, en este caso en especifico el print $ debe esta señalando a la columna 4 y en el script original esta seteado en 1 asi que solo deben fijarse en su sistema y modificar este parametro.
espero que esta informacion les sirva y saludos.
APLICACIÓN
Vie, 11/12/2009 - 21:04 — AnónimoNo existe una aplicación administrativa que realice el reprocesamiento del archivo??? Sin tener que trabajar con comandos manuales?
saludos
:P
ficheros wal
Dom, 31/01/2010 - 17:21 — AnónimoTengo un problema, soy estudiantes de ingenieria informatica y necesito saber mas de los ficheros wal por ejemplo.
- Si WAL es un fichero donde se guardan las transacciones realizadas a la base de datos
- Si WAL establece que siempre se escribe primero en el fichero WAL y después en disco
-Si para evitar que WAL crezca indefinidamente se utilizan los chekpoints
-Y si WAL no garantiza la restauración del servidor antes caídas
Enviar nuevo comentario