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 :).

5 Thoughts on “Backup incremental de tu base de datos con Git

  1. 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

  2. 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

  3. Qué ingenioso, me mola la idea 🙂

  4. Excelente tip! Muchas gracias por compatirlo.

  5. Pingback: Copia Incremental base de datos MySql | Javier G. Gitto – Auger Project

Post Navigation