Backup incremental de tu base de datos con Git
Una forma realmente interesante de realizar backups de tus bases de datos (por ser trivial y muy potente) es usando Git. El proceso es simple y se basa en la realización de los dumps de la base de datos de forma que cada fila de las tablas sea un insert aislado, de esa forma en cada commit solo estaremos salvando las diferencias respecto al último estado (tanto deletes como inserts, como updates).
En el caso concreto de MySQL inicialmente haríamos algo como esto:
$ mkdir mydatabase && cd mydatabase $ mysqldump --skip-extended-insert > data.sql $ git init $ git add data.sql $ git commit -m "Initial dump of mydatabase"
A partir de entonces podemos automatizar el proceso con un script tan simple como este:
$ cat /usr/bin/git_backup_database #!/bin/sh BACKUP_DIRECTORY=$1 DATABASE=$2 cd $BACKUP_DIRECTORY && \ mysqldump --skip-extended-insert $DATABASE > data.sql && \ git commit -am "Updating dump `date +%Y_%m_%d__%H_%M`"
Según el volumen de consultas que tenga tu base de datos, te será interesante ponerlo en cron con una frecuencia determina u otra. Adicionalmente sería recomendable ejecutar $ git gc para optimizar el repositorio. Por ejemplo, dos veces al día y una vez a la semana mantenimiento:
0 0 * * * /usr/bin/git_backup_database /path/to/mydatabase mydatabase 0 12 * * * /usr/bin/git_backup_database /path/to/mydatabase mydatabase 0 1 * * 1 cd /path/to/mydatabase && git gc
Además desde otro equipo nadie te impide hacer un $ git clone ssh://equipo:path/to/mydatabase y tener todo el historial de la base de datos en un plis (bueno eso es relativo, que ocupará lo suyo...) o incluso programar un $ git pull para tener varios backups en distintas maquinas. En definitiva, se abren un sinfín de opciones
.
Julio 10th, 2009 at 1:35
Lo del –skip-extended-insert esta muy bien para que los dumps sean legibles (y para este caso). Eso si, como la bbdd sea un poco grande la restauracion es muchisimo mas lenta
Julio 10th, 2009 at 1:48
Con 10K filas:
koke@escher:~/tmp/mytest$ mysqldump test > s.sql
koke@escher:~/tmp/mytest$ time mysql test < s.sql
real 0m0.174s
user 0m0.015s
sys 0m0.006s
koke@escher:~/tmp/mytest$ mysqldump –skip-extended-insert test > s.sql
koke@escher:~/tmp/mytest$ time mysql test < s.sql
real 0m1.004s
user 0m0.113s
sys 0m0.136s
Julio 11th, 2009 at 0:15
Qué ingenioso, me mola la idea
Septiembre 15th, 2009 at 16:57
Excelente tip! Muchas gracias por compatirlo.
Abril 22nd, 2010 at 13:52
[...] Backup incremental de tu base de datos con Git [...]