Hace mucho que tenia en mente algo interesante para el servidor web donde esta esta web: que me envie de forma periodica un backup de la base de datos por mail. Hoy me he puesto manos a la obra.
Para hacerlo he utilizado un script en perl encontrado en una web que he llamado sendfile.pl:
#!/usr/bin/perl
use Mail::Sender;
if (!($ARGV[0])) {
print "\n\tUsage: $0 \n\n";
exit;
}
$file_name = $ARGV[0];
$smtp_server = 'localhost';
$sender_mail = 'Cron ';
$recipients = 'Destino ';
$mail_subject = 'Backup';
$msg_body = "\n\n Attachment backup";
$sender = new Mail::Sender { smtp => $smtp_server ,
from => $sender_mail
};
$sender->MailFile(
{to => $recipients,
subject => $mail_subject,
msg => $msg_body,
file => $file_name });
$sender->Close;
Este script requiere el modulo Mail:Sender de Perl, para instalarlo podemos hacer:
perl -MCPAN -e shell
install Mail::Sender
A continuación he creado un script en bash llamado sendbackup.sh:
#/bin/bash
FECHA=`date +%d%m%Y`
tar -jcvf /home/user/bin/db-backup-$FECHA.tar.bz2 /var/lib/mysql/user/
/home/user/bin/sendfile.pl /home/user/bin/db-backup-$FECHA.tar.bz2
rm -f /home/user/bin/db-backup-$FECHA.tar.bz2
Como podeis imaginar he guardado ambos scripts en /home/user/bin/. A continuación he añadido al cron como usuario root (o un usuario que tenga permisos para copiar directamente la base de datos) usando “crontab -e”:
15 6 * * 6 /home/user/bin/sendbackup.sh &> /dev/null
Esto hará que 1 vez a la semana a las 6:15 me envie el backup por mail. Lo correcto hubiese sido parar y volver a poner en marcha la mysql antes de hacer el tar, pero para no afectar al resto de procesos que acceden a la BD no lo he hecho ya que me funciona correctamente así también. Otra cosa a tener en cuenta es que el mail se envia sin ningún tipo de encriptación, por tanto estaría bien añadirla utilizando GnuPG aunque en este caso lo he descartado ya que la información que envia no es nada confidencial y no puede ocasionar ningun daño irreversible la intercepción del mail.
Actualizacion He mejorado el sistema para que el envio sea encriptado, lo podeis ver en la segunda parte del post.