Dumps completos de MySQL (bz2)

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: "
}