W: Resize to find out!
H: Resize to find out!
Publicado hace: 3 años

Backup automático de bases de datos MySQL en MAMP

A propósito del servidor de archivos que estoy montando me encontré entre mis carpetas de backup con decenas de “dump sql” de bases de datos, sobretodo de localhost que he realizado al cambiar de plataforma, formatear el equipo, cambiar de máquina, etc. Estos archivos se encuentran totalmente desordenados y me será complicado poder organizarlos, por ello he pensado en una forma de tener un solo backup y actualizarlo automáticamente con un script bash.

Estoy usando MAMP (Mac, Apache, Mysql, Php) para desarrollar en local, y necesito hacer un backup de esta información, además de ello haré también el backup de los archivos del directorio WWW usando RSYNC como ya lo he comentado en otras entradas.

He pasado gran parte de la tarde de hoy haciendo research hasta que pude armar el script que hace exactamente lo que necesito:

  • Comprobar si se hizo ya un backup de base de datos este día, si ya se hizo, entonces no hará nada más.
  • Si no se hizo el backup, hará un nuevo backup dentro de una carpeta cuyo nombre será la fecha de hoy.
  • Una vez creado el backup eliminará los más viejos, dejando un número determinado de versiones en el backup.
  • Finalmente hará una copia de los archivos nuevos con RSYNC.

Manos a la obra

Recordemos que para trabajar desde la línea de comandos con MAMP MySQL debemos hacerlo desde:


/Applications/MAMP/Library/bin/mysql --host=localhost -uroot -proot

using-mysql-command-line-with-mamp

Bien, este es el archivo que tengo en la iMac y hará el backup a un disco de sobremesa que está conectado a este ordenador:

#!/bin/bash
# -*- ENCODING: UTF-8 -*-
# Backup al disco externo de Storage
# Dump de bases de datos
#
# mysqldump -u root -p --all-databases > all_dbs.sql #backup de todas las bases de datos # Esto no lo estoy usando, pero sirve para dumpear todas las bases de datos en un solo archivo.
#
TIMESTAMP=$(date +"%Y%m%d")
BACKUP_DIR="/Volumes/Storage/mysqldump/$TIMESTAMP"
MYSQL_USER="backup"
MYSQL=/Applications/MAMP/Library/bin/mysql # Esta es la ubicación de MYSQL en MAMP
MYSQL_PASSWORD="*******"
MYSQLDUMP=/Applications/MAMP/Library/bin/mysqldump

if [ -d /Volumes/Storage/mysqldump/$TIMESTAMP ] # d para verificar si existe el directorio, f para file
then
    echo 'ya existe un backup con esta fecha'
else
	#Check if the MySQL daemon is alive
	if ! /Applications/MAMP/Library/bin/mysqladmin ping > /dev/null 2>&1; then
	    echo "mysqld is dead!"
	else
	    echo "mysqld is running, OK."
		mkdir -p $BACKUP_DIR
		databases=`$MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
		for db in $databases; do
			echo $db
			$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/$db.gz"
		done

		# ELIMINAR BACKUPS VIEJOS
		files_path="/Volumes/Storage/mysqldump/";
		temp_file="/Volumes/Storage/mysqldump/arb.tmp";
		log_file="/Volumes/Storage/mysqldump/arb.log";
		count=0;
		files_to_save=8;
		rm -rf $log_file
		ls -1r $files_path > $temp_file;
		touch $log_file;
		 
		for i in `cat $temp_file`;
				do
					count=`expr $count + 1`;
					if [ $count -ge $files_to_save ];
						then {
							echo "[`date`] [-] Removing "$files_path$i >> $log_file;
							rm -rf $files_path$i | echo "[-] Removing "$files_path$i;
						} else {
							echo "[`date`] [+] Saved "$files_path$i >> $log_file;
							echo "[+] Saved "$files_path$i;
						}
					fi;
		done
		echo >> $log_file;
		rm $temp_file -Rf

	fi
fi


# Backup de directorios
rsync -rtv /Users/myuser/ /Volumes/Storage/myuser/

Y con esto tendré más o menos lo siguiente:

Backup por fechas

Ya solo queda crear un CRON que ejecute la tarea cada cierto tiempo para que sea automático:

crontab -e

Donde:

esquema-crontab

Y agregamos:

#min     hour     mday     month     wday    user     command
0       1       *         *        *      root     /home/bk_mysql.sh

Guardamos el archivo:

:wq!

Y listo, si alguien tiene una idea de cómo mejorar el script será bienvenida.

Referencias:
Crontab http://hatteras.wordpress.com/2010/12/02/crontab-programarautomatizar-tareas/
Eliminar backups antígüos: http://www.joni2back.com.ar/programacion/eliminar-todos-excepto-los-ultimos-x-archivos-en-bash/
Convertir Cadena en entero: http://stackoverflow.com/questions/12821715/convert-string-into-integer-in-bash-script
Formatear las fechas: http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/
Verificar si MySQL está activo: http://www.gidblog.com/2013/06/is-mysql-up/

2 Responses to “Backup automático de bases de datos MySQL en MAMP”

  1. Estaba buscando sobre respaldos automaticos en MAMP y llegué a este post,
    solo me queda la duda porque escogiste, dejar cron cada una hora, con la pregunta si ya se hizo o no,
    y porqué no directamente “diario”?
    ¿para asegurar que se haga si o si?

    lo tendré de referencia Muchas gracias por compartir
    @mallenx

    • Sergio dice:

      Mallen, me creerás que en este momento no recuerdo porqué lo hice, hubiera sido ideal anotarlo. Supongo que es porque pensaba que al hacerlo una vez al día, tendría que indicar una hora fija para hacerlo, y como no siempre tenía encendido el equipo encendido a la misma hora, debo haber pensado que esta sería la forma de asegurarme que se realice sí o sí.

      Saludos,

Dejar un comentario...