Rénich's Blog

HowTo: Cómo respaldo mi servidor de DB remoto?

Mon 03 September 2012

Mucha gente usa phpMyAdmin para hacer estas cosas cuando no es necesario. De hecho, les recomiendo usar Adminer en vez de phpMyAdmin; pero, eso, es otro rollo.

Muchos usarían:

Solución 1: la más pendeja...

mysqldump -h miservidor.tld -u root -p -A > myservidor.com.sql

Problemas:

  • No es seguro para nada. Permites acceso público desde internet para root? Estás loco(a)?!
  • Tu conexión es transparente. Si hay algún sniffer por ahi, ya le pasaste tu DB.
  • Si tu DB tiene datos... bastantes datos... tus recursos de red van a sobre-usarse en tu servidor.
  • Si pagas ancho de banda, ve ahorrando...
  • Si tienes uno de esos Internet más rápido que tanto anuncian, ya valiste, vas a tardar toda la semana....

Solución 2: No tan pendeja... pero algo...

ssh -t usuario@miservidor.tld "mysqldump -u root -p -A > miservidor.com.sql"

Problemas:

  • Tu dump se hace a local y, como no hay compresión, espero que tengas suficiente espacio en disco para ésto.
  • Si tu DB tiene datos... bastantes datos... tus recursos de red van a sobre-usarse en tu servidor.
  • Si pagas ancho de banda, ve ahorrando...
  • Si tienes uno de esos Internet más rápido que tanto anuncian, ya valiste, vas a tardar toda la semana....

Solución 3: La del pendejo con iniciativa

ssh -t usuario@miservidor.tld "mysqldump -u root -p -A" | gzip -9 > miservidor.com.sql.gz

Problemas:

  • Como, por no pensarla bien, aplicaste la compresión después del comando SSH, se está transfiriendo el archivo sin comprimir... doh!
  • Si tu DB tiene datos... bastantes datos... tus recursos de red van a sobre-usarse en tu servidor.
  • Si pagas ancho de banda, ve ahorrando...
  • Si tienes uno de esos Internet más rápido que tanto anuncian, ya valiste, vas a tardar toda la semana....

Solución 4: La del webón (pero no tan pendejo)

ssh -t usuario@miservidor.tld 'mysqldump -u root -p -A | gzip -c -9' > miservidor.com.sql.gz

Problemas:

  • Vas a terminar con un archivo que contiene toda la info. Si quieres reestablecer solo una DB; como dice Richard Couture: "Buen suerte!"
  • Si tus DB son muy grandes (16 GB o más), no creo que puedas abrir tu archivo con algún editor de texto. Vim si puede... pero se tarda años!

Solución 5: La mera chida (según Yo)

Pon el script en miservidor.com:/root/bin/DbBackup y dale permisos 700 al dir y al archivo.

#!/usr/bin/env bash
# hacer que los archivos creados solo sean legibles por mí

uname 077
# definir fecha
fecha=$( date +%Y%d%m-%H%M%S )

# leemos, silenciosamente, el password de root de MySQL
echo -n 'Dame el password de root de MySQL: '
read -s password

# creamos el directorio donde vamos a guardar las DB
locacion='/var/backup/mysql'
mkdir -p -m 700 ${locacion}

# listamos todas las DB
mysql -u root --password="${password}" -B -N -e 'show databases' | while read db; do
    # respaldamos DB por DB; en su propio archivo
    echo "Respaldando ${db}..."
    mysqldump -u root --password="${password}" ${db} | gzip -c -9 > ${locacion}/${fecha}-${db}.gz
done
exit 0

Ejecútalo cada vez que quieras un respaldo (como root o usa su -c o sudo)

ssh -t root@miservidor.tld "/root/bin/DbBackup"

Te podrás traer cualquier generación de respaldo que quieras a tu compu

rsync -auvP root@miservidor.com:/var/backup/mysql/201209* /var/backup/mysql/

¿Cómo se puede mejorar esta solución?

  • crear un grupo para hacer los respaldos en remoto y no usar root para ésto. Usa los permisos 2770 para los directorios de respaldo si haces ésto.
  • poniendo un switch en el script remoto para respaldar todo o solo la DB que especifiques
  • hacer que el default del comando sea mostrar la ayuda (default en el switch)
  • hacer una función que muestre la ayuda
  • usando xz en lugar de gzip (mucho mejor compresión)

Con estas mejoras, pudieras, incluso, generar un respaldo bajo demanda de una DB específica y copiarla a local; incluso sin generar el archivo remoto (y ahorramos espacio). Porqué no lo proveo? Bueno, pienso que son features fáciles de hacer y tu puedes hacerlas solito(a). Además, te sirve para aprender. Todos los scripts se coparten con GPLv3 para todo eh? Comparte tus adecuaciones o muere!