Backup de Wordpress

Aquellos que sigan, aunque sea de lejos, este abandonado weblog, se habrán percatado de que estoy tan ocupado que ni puedo escribir aquí. No obstante sí que he hecho una cosa que quería hacer hace tiempo y que redunda en la seguridad del sitio después de los sustos que me he llevado. He hecho una copia de seguridad del blog.

Dicho así, parece un poco pobre, pero sin embargo, teniendo en cuenta que el blog es algo "vivo" que cambia todos los días, mantener una copia de cada día se convierte en impracticable a no ser que se utilicen ciertas herramientas. Por ejemplo, yo utilizo un sistema de control de versiones para todo lo que produzco, sea investigación, clases, u otras cosas (subversion). Podría simplemente hacer un TAR de la base de datos y del contenido del blog cada día o cada semana y añadirlo al sistema de control de versiones. Sin embargo, como el sistema de control de versiones guarda todos los cambios para su posterior posible recuperación, eso haría que el tamaño de este repositorio creciera descontroladamente. El sistema guarda sólo cambios con respecto a la versión anterior, pero al ser los contenidos del blog y la base de datos contenido binario, es bastante difícil guardar diferencias entre versiones, y termina casi generando una entrada del tamaño del blog cada vez (unos 32MB/día).

Así que lo que he decidido es: cada día 1 de cada mes se guarda una copia completa en formato .tar.gz de la base de datos del blog y de los contenidos. Así se generan 32MB/mes, lo cual no es tan exigente en espacio. A continuación, cada día se genera una diferencia binaria con los contenidos del día anterior. Esta diferencia la genero con un programa llamado xdelta, optimizado para encontrar el mínimo conjunto de diferenicas entre ficheros binarios. Así, de un día a otro, el cambio en la base de datos y el blog es de unos 10K, lo cual es perfectamente asumible. He aquí el script que uso:


#! /bin/sh

day=$(date +%e | tr -d \ )



# El primero de mes sustituir la copia

if test $day = 1 ;then

mysqldump -A | gzip -9 > db.gz

tar --ignore-failed-read -zcf wp.tar.gz /etc/wordpress /usr/share/wordpress

else

# DB

mysqldump -A | gzip -9 >db.$day.gz

xdelta delta db.gz db.$day.gz db.xdelta.$day

rm -f db.$day.gz



# wp.tar.gz

tar --ignore-failed-read -zcf wp.$day.tar.gz /etc/wordpress /usr/share/wordpress > /dev/null 2>&1

xdelta delta wp.tar.gz wp.$day.tar.gz wp.tar.gz.xdelta.$day

rm -f wp.$day.tar.gz



# add to svn

svn add db.xdelta.$day wp.tar.gz.xdelta.$day >/dev/null 2>&1

fi




Esto genera ficheros db.xdelta.día y wp.tar.gz.xdelta.día, con los días del 1 al 31. Después el proceso de "patching" es también sencillo: partir del original, y aplicar todos los parches del día 2 en adelante hasta el día actual. El resultado:


-rw-r--r-- 1 dsevilla dsevilla 1223302 2007-12-04 11:21 db.gz
-rw-r--r-- 1 dsevilla dsevilla 23377 2007-12-10 03:05 db.xdelta.10
-rw-r--r-- 1 dsevilla dsevilla 16561 2007-12-04 11:47 db.xdelta.4
-rw-r--r-- 1 dsevilla dsevilla 16602 2007-12-05 03:05 db.xdelta.5
-rw-r--r-- 1 dsevilla dsevilla 17915 2007-12-06 03:05 db.xdelta.6
-rw-r--r-- 1 dsevilla dsevilla 20731 2007-12-07 03:05 db.xdelta.7
-rw-r--r-- 1 dsevilla dsevilla 26065 2007-12-08 03:05 db.xdelta.8
-rw-r--r-- 1 dsevilla dsevilla 23373 2007-12-09 03:05 db.xdelta.9
-rwxr-xr-x 1 dsevilla dsevilla 637 2007-12-10 14:28 wp-backup.sh
-rw-r--r-- 1 dsevilla dsevilla 31806651 2007-12-04 11:35 wp.tar.gz
-rw-r--r-- 1 dsevilla dsevilla 362 2007-12-10 03:05 wp.tar.gz.xdelta.10
-rw-r--r-- 1 dsevilla dsevilla 288 2007-12-04 11:48 wp.tar.gz.xdelta.4
-rw-r--r-- 1 dsevilla dsevilla 360 2007-12-05 03:05 wp.tar.gz.xdelta.5
-rw-r--r-- 1 dsevilla dsevilla 358 2007-12-06 03:05 wp.tar.gz.xdelta.6
-rw-r--r-- 1 dsevilla dsevilla 361 2007-12-07 03:05 wp.tar.gz.xdelta.7
-rw-r--r-- 1 dsevilla dsevilla 361 2007-12-08 03:05 wp.tar.gz.xdelta.8
-rw-r--r-- 1 dsevilla dsevilla 363 2007-12-09 03:05 wp.tar.gz.xdelta.9


Por último, una entrada en crontab para que se ejecute el script cada día...


5 3 * * * (cd $HOME/svn/wordpress/backup ; ./wp-backup.sh)

blog comments powered by Disqus