Este script (mysql2dump) permite realizar copias de seguridad de MySQL local o remotamente. Hace uso de mysqlcheck y mysqldump para optimizar y reparar las bases de datos antes de dumpearlas.
Una vez se acaba el backup de cada base de datos tenemos opción a enviarlo a un host remoto bien por FTP o por SSH. Tanto los parámetros de uso como las variables de configuración son evitentes.
El código del script (OJO, el PATH del bash puede cambiar de un sistema a otro):
#!/usr/bin/env bash
################################
# script para backups de MySQL
# v0.2 jbarrio 23/12/2004
# v0.3 r0sk 04/10/2007
################################
if [ $UID -gt 0 ]
then
echo "Solo root puede ejecutar este script"
exit 1
fi
################################
# Variables
################################
# Variables para la conexión con MySQL
USER='usuario'
PASS='pass'
# Variables para la conexión FTP y SSH
REMOTEHOST='192.168.0.22'
REMOTEUSER='user'
REMOTEPASS='pass'
REMOTEDIR='/'
REMOTEDESTDIR='mysqlbackups'
# Directorios origen y destino de los dumps
MYSQLDIR='/var/lib/mysql'
DESTDIR='/backup/mysql/'
# Opciones generales de mysqlcheck y mysqldump
CHECKOPTS="--user=${USER} --password=${PASS} -ors"
DUMPOPTS="--user=${USER} --password=${PASS} -Q -c --database"
# Formato de fecha
TIMEFORMAT="%E"
# Extension de ficheros (por defecto)
BB=".sql";
BBZIP=".sql.bz2";
################################
# Software (dependencias)
################################
MYSQLCHECK=`which mysqlcheck`
MYSQLDUMP=`which mysqldump`
BASENAME=`which basename`
GZIP=`which gzip`
BZIP=`which bzip2`
DATE=`which date`
CHMOD=`which chmod`
FTP=`which ftp`
SSH=`which ssh`
SCP=`which scp`
################################
# Flujo del programa
################################
# Función de ayuda o uso
uso()
{
echo " ";
echo " El script mysql2dump genera dumps comprimidos de todas las bases de datos";
echo " MySQL que tengamos. Mira la sección de variables del script para configurar";
echo " su uso de forma correcta.";
echo " ";
echo " Ejecuta un mysqldump de '$MYSQLDIR' y -si no se indica lo contrario ";
echo " (-r borra los dumps locales)- los guarda en '$DESTDIR'";
echo " ofreciendo la posibilidad de exportarlos via FTP (-f) o SSH (-s)";
echo " ";
echo " Los modificadores de mysql2dump son los siguientes:";
echo " -h: muestra esta pantalla de ayuda";
echo " -d: agrega la fecha a los archivos resultantes (no la llevan por defecto)";
echo " -r: borra los dumps resultantes de '$DESTDIR' (local)";
echo " -f: coloca en un ftp remoto los dumps resultantes";
echo " -s: coloca vía ssh los dumps en un servidor remoto";
echo " ";
}
# Parseamos las opciones con getopt
while getopts "hdfsr" opcion; do
case $opcion in
# Visualizamos la ayuda
h)
uso
exit 0
;;
# Agregamos la FECHA a los ficheros resultantes
d)
BB="_"`$DATE +%d-%b-%Y`${BB};
BBZIP="_"`$DATE +%d-%b-%Y`${BBZIP};
;;
# Configuramos el flag_ftp a OK
f)
flag_ftp="OK"
;;
# Configuramos el flag_ssh a OK
s)
flag_ssh="OK"
;;
# Configuramos el flag_remove a OK
r)
flag_remove="OK"
;;
# En otros casos los ficheros resultantes no llevan fecha
*)
;;
esac
done
# Comprobación de directorio destino
if [ ! -d $DESTDIR ]
then
mkdir -p $DESTDIR
echo "El directorio destino $DESTDIR no existia y ha sido creado"
fi
time {
echo "Iniciando Backups: `$DATE '+%d/%b/%Y %H:%M:%S'`"
for i in $MYSQLDIR/*
do
time {
if [ -d $i ]
then
FECHA=`$DATE +%d-%b-%Y`
BBDD=`$BASENAME $i`
BASEDATOS=${BBDD}${BB}
BASEDATOSZIP=${BBDD}${BBZIP}
# Comprobamos si ya existe la copia y si existe la borramos
[ -f ${DESTDIR}/${BASEDATOS} ] && rm -f ${DESTDIR}/${BASEDATOS}
[ -f ${DESTDIR}/${BASEDATOSZIP} ] && rm -f ${DESTDIR}/${BASEDATOSZIP}
# Optimizamos la base de datos antes del dump
echo -n " -> Optimizando $BBDD... "
$MYSQLCHECK $CHECKOPTS $BBDD
# Hacemos el dump de la base de datos
echo -n " -> Dump de $BBDD... "
$MYSQLDUMP $DUMPOPTS $BBDD > ${DESTDIR}/${BASEDATOS}
# Comprimimos y cambiamos los permisos
echo -n " -> Comprimiendo $BBDD... "
$BZIP ${DESTDIR}/${BASEDATOS}
$CHMOD 400 ${DESTDIR}/${BASEDATOSZIP}
echo -n "[ ok ] -> "
################################
# FLAGS
################################
# Si se ha activado el flag f, pasamos a ftp
if [ "X$flag_ftp" = "XOK" ]; then
echo -n " -> Subiendo por FTP... "
cd ${DESTDIR}
$FTP -n <<EOF
open ${REMOTEHOST}
user ${REMOTEUSER} ${REMOTEPASS}
bin
verbose
hash
prompt
cd ${REMOTEDIR}
mkd ${REMOTEDESTDIR}
cd ${REMOTEDESTDIR}
put ${BASEDATOSZIP}
stat
bye
EOF
echo -n "[ ok ] -> "
fi
# Si se ha activado el flag s, pasamos a ssh
if [ "X$flag_ssh" = "XOK" ]; then
$SSH ${REMOTEUSER}@${REMOTEHOST} mkdir -p ${REMOTEDIR}${REMOTEDESTDIR}
$SCP ${DESTDIR}/${BASEDATOSZIP} ${REMOTEUSER}@${REMOTEHOST}:${REMOTEDIR}${REMOTEDESTDIR}
echo -n "[ ok ] -> "
fi
# Si se ha activado el flag r, borramos la copia local
if [ "X$flag_remove" = "XOK" ]; then
[ -f ${DESTDIR}/${BASEDATOS} ] && rm -f ${DESTDIR}/${BASEDATOS}
[ -f ${DESTDIR}/${BASEDATOSZIP} ] && rm -f ${DESTDIR}/${BASEDATOSZIP}
fi
fi
}
done
echo -en "* Borrando backups antiguos (más de 5 días)..."
find ${DESTDIR} -mtime '+5' -exec rm -f {} \;
echo "[ ok ]"
echo "Proceso acabado: `$DATE '+%d/%b/%Y %H:%M:%S'`"
echo -en "\nTiempo empleado: "
}