Script bash para backups MySQL

Imagen de Lord

Forums: 

Saludos a toda la comunidad, ya es tiempo que no he posteado por aca pero mas vale tarde que nunca ;) . Esta vez no es por realizar consultas sino mas bien para aportar con una peque ayuda para aquellos en que hemos visto la necesidad de sacar respaldos mySQL a traves de un script bash que en la red hay un monton pero con funcionalidades distintas, a que me refiero:

1. Que el mismo script me permita listar todas las bases de datos existentes en el servidor
2. Que el mismo script me permita sacar un backup de una base de datos especifica y
3. Que el mismo script me permita sacar el backup de todas las bases de datos del servidor excluyendo aquellas que corresponden al propio mySQL como: test, information_schema, etc.

Por eso me di el trabajito de hacer un bash que haga las tareas descritas anteriormente, de monton de bash que hay en la red saque lo mas fundamental de cada uno y lo comparto con ustedes

El modo de uso es el siguiente:
1. Para listar todas las bases de datos existentes: bash +x shell_backup.sh listarbd
2. Para sacar el backup de una base especifica: bash +x shell_backup.sh nombre_bd
3. Para sacar el backup de todas las bases de datos: bash +x shell_backup.sh

El bash fue testeado con Centos 5.2


#!/bin/sh
#Script bash para backups en MySQL
#Creado por: Ing. Leonardo Gualpa C.

CARPETA_DIARIA=$(date +"%C%y-%m-%d") #formato aaaa-mm-dd
PATH="/var/www/html"
FECHA_ARCHIVO=$(/bin/date +"%C%y-%m-%d_%HH%M") #formato aaaa-mm-dd_hhHmm
PATH_BACKUP="/var/www/html/db_backup/"$CARPETA_DIARIA

#PARAMETROS MYSQL BACKUP
MySQL_USER="usuario_mysql"
MySQL_PASS="clave_usuario_mysql"
MySQL_HOST="localhost"

MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump

GZIP=/bin/gzip
HOST=/bin/hostname

#Listado de las BD que no se consideran en el proceso de backup
BD_EXCLUYE="test information_schema mysql"
BD_EXCLUYE_EXISTE="test|information_schema|mysql"

echo "========================================================================="
echo "Iniciando script bash para Backups MYSQL ... "
echo "Carpeta diaria "$CARPETA_DIARIA

cd $PATH

#Verifico si existe la carpeta principal de backups
if [ ! -d "db_backup" ]; then
echo "Creando carpeta db_backup"
/bin/mkdir -p db_backup
else
echo "La carpeta db_backup ya existe"
fi

cd db_backup
#Verifico si existe la carpeta diaria de backups
if [ ! -d $CARPETA_DIARIA ]; then
echo "Creando carpeta diaria: "$CARPETA_DIARIA
/bin/mkdir -p $CARPETA_DIARIA
else
echo "La carpeta "$CARPETA_DIARIA" ya existe"
fi

#cd /root/Desktop
DBS=''

args=("$@") #almacena los parametros

if [ $# -ne 0 ]; then #verifico si se reciben parametros
echo "Con parametros"
DATA=${args[0]}
echo "Parametro recibido : "$DATA

case $DATA in
listarbd)
echo '--------------------------------------------------------------------------------------------'
echo 'Iniciando proceso de listar todas las bases existentes'
DBS=$($MYSQL -u $MySQL_USER -h $MySQL_HOST -p$MySQL_PASS -Bse 'show databases')
#echo $DBS

for db in $DBS
do
if [ "$BD_EXCLUYE" != '' ]; then
echo "DB_: $db"
else
echo "DB: $db"
fi
done
echo '--------------------------------------------------------------------------------------------'
;;
*)
#implementacion para una base de datos especifica
echo '--------------------------------------------------------------------------------------------'
echo 'Iniciando Backup para la base de datos '$DATA

database=$DATA

DBS=$($MYSQL -u $MySQL_USER -h $MySQL_HOST -p$MySQL_PASS -Bse 'show databases' | /bin/egrep -v $BD_EXCLUYE_EXISTE)

#valido si la base de datos ingresada existe para generar el backup
existeBD=0
for db in $DBS; do
if [ "$db" = "$database" ]; then
existeBD=1
fi
done

if [ "$existeBD" = "0" ]; then
echo "La base de datos $database no existe: finalizando ejecucion del script"
exit
else
FILE_BACKUP="$PATH_BACKUP/$database"_"$FECHA_ARCHIVO.sql"
$MYSQLDUMP -f --opt --default-character-set=utf8 -u $MySQL_USER -h $MySQL_HOST -p$MySQL_PASS $database > $FILE_BACKUP
#backup store procedures
$MYSQLDUMP -u $MySQL_USER -h $MySQL_HOST -p$MySQL_PASS --routines $database > $FILE_BACKUP
echo "BACKUP generado para $database, el archivo generado es $FILE_BACKUP"
fi
echo '--------------------------------------------------------------------------------------------'
;;
esac
else
echo "Sin parametros, saco el backup de todas las bases"
echo "Iniciando proceso backup global"

DBS=$($MYSQL -u $MySQL_USER -h $MySQL_HOST -p$MySQL_PASS -Bse 'show databases')
for db in $DBS
do
skipdb=-1

if [ "$BD_EXCLUYE" != '' ]; then
for i in $BD_EXCLUYE
do
[ "$db" == "$i" ] && skipdb=1 ||:
done
fi

if [ "$skipdb" == "-1" ];then
echo '--------------------------------------------------------------------------------------------'
echo "Accediendo a la Base $db "
FILE_BACKUP="$PATH_BACKUP/$db"_"$FECHA_ARCHIVO.sql"
echo "Procesando backup para $db, espere ..."
$MYSQLDUMP -f --opt --default-character-set=latin1 -u $MySQL_USER -h $MySQL_HOST -p$MySQL_PASS $db > $FILE_BACKUP
#backup store procedures
$MYSQLDUMP -u $MySQL_USER -h $MySQL_HOST -p$MySQL_PASS --routines $database > $FILE_BACKUP
echo "BACKUP generado para $db, el archivo generado es $FILE_BACKUP"
echo '--------------------------------------------------------------------------------------------'
fi

done #for correspondiente a $DBS
fi
echo "Finalizando el proceso de backup"
echo "========================================================================="

yo había posteado hace tiempo

Imagen de deathUser

yo había posteado hace tiempo un par de scripts que en algún rato me fueron de utilidad, el tuyo suena bien ...

http://www.ecualug.org/2008/05/16/blog/deathuser/volcando_todas_las_bases_de_datos_mysql

http://www.ecualug.org/2007/05/28/blog/deathuser/como_volcar_una_base_de_datos_mysql

bye
;)