Archive

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

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!