Copia de seguridad periodica de MySQL
#1
Hola

Como ya lo preguntó JoseDTF y tenía pendiente hacerlo para mi uso. He creado un script en bash que hace copias de seguridad de todas nuestras bases de datos de MySQL/MariaDB.

Para ello uso tres archivos:
  1. el script propiamente dicho que hace copia de la base de datos, de nombre MySQLBackup.sh
  2. un archivo de texto donde tengo el listado de todas las copias anteriores, de nombre listado.txt
  3. un archivo de script que borra las copias mas antiguas hasta quedar solo las "n" mas recientes, de nombre borrarMySQLold.sh
El script es muy mejorable por ejemplo evitando el uso de los archivos listado.txt y borrarMySQLold.sh, pero estos nos sirven para saber lo último que se hizo, es efectivo y fácil de entender.

Recordad que al archivo listado.txt hay que darle permisos de escritura para que el script pueda escribirle líneas y que al script secundario ademas de permisos de escritura, hay que dárselos también de ejecución.

El script MySQLBackup.sh es el siguiente:

#! /bin/bash
#defino una variable para tener la fecha y hora de creación
fecha=$(date +"%Y%m%d_%H%M")

#defino la ruta base,

ruta="/share/CACHEDEV1_DATA/"

#defino la ruta donde guardaremos las copias de seguridad

ruta1=$ruta"MSSQL/MySQL"

#defino la ruta donde estará el script secundario

ruta2=$ruta"Scripts"

# defino limite de copias a g
uardar
limite=30

#hago backup de todas las bases de datos con usuario root

/usr/local/mysql/bin/mysqldump -u root -pclavemysql --all-databases > $ruta1/MySQL_$fecha.sql

#listo los archivo de copia con extension .sql y los escribo en el archivo listado.txt

ls -t -1 $ruta1/*.sql > $ruta2/listado.txt

#cuento archivos .sql

fin=$(ls -t -1 $ruta1/*.sql | wc -l)

#creo cabecera de archivo del script secundario
echo "#! /bin/bash" > $ruta2/borrarMySQLold.sh

#añado líneas de archivos a borrar, los mas viejos a partir del número límite
if [ $fin -gt $limite ] ; then
 for ((i=$limite+1;i<=$fin;i++)); do
    linea0=$(echo -n "rm "'"')
    linea1=$(awk "NR==$i{print;exit}" listado.txt)
    linea2=$(echo '"')
    linea="$linea0$linea1$linea2"
    echo $linea >> $ruta2/borrarMySQLold.sh
 done
fi

#Ejecuto archivo con comandos de borrado
$ruta2/borrarMySQLold.sh

Este script lo agrego al crontab de forma diaria y en la carpeta, según el ejemplo, obtendré siempre las últimas 30 copias.
Un saludo

Agur eta ondo ibili

Mon (TS-469Pro y TVS-673)
 Responder
#2
Qué pasada muchas gracias Ganekogorta
TS-251A-4G  2 x Seagate ST4000VN000 4TB
 Responder
#3
Gracias Ganeko, un gran Script. Lo marco como importante.
Saludos,
 Responder
#4
Hola

He creado un nuevo script mas elaborado que con sencillas modificaciones puede servir no solo para backup de MySQL, sino que para otras tareas periodicas

Lo que hace es crear dentro de  la carpeta /share/CACHEDEV1_DATA una carpeta llamada "MySQL" que va a contener copias de seguridad de todas las BBDDs de MySQL en archivos separados.
Además creará una carpeta "diaX" en función del día del mes, además los domingos deja la copia en la carpeta "semanaX" en función de la semana en curso y el primer domingo del mes la deja en la carpeta "mesX" en función del mes en curso.

Para cada copia, lo que hace es:
-comprobar si existe la carpeta, si no existe la crea base.
-comprobar si existe la carpeta del día/semana o mes y si no existe, la crea.
-Comprueba si hay contenido en la carpeta del día/semana o mes de extensión sql y lo borra puesto que son datos antiguos.
-crea la copia del día en archivos separados de extensión sql

He optimizado un poco mas el script inicial para no depender de archivos externos los cuales nos servían de log de actividad.

El script, para ir centralizando todos los que uso, le he dejado en la carpeta /share/CACHEDEV1_DATA/Scripts/MySQLBackUp.sh y es llamado desde el crontab de forma diaria a una hora determinada.

Lo he comentado bastante para que se pueda entender lo que hace, e incluso podéis descomentar algunas líneas para que veáis que actividades va realizando si es que lo ejecutáis por consola.

Evidentemente no lo he podido comprobar a lo largo de un año 


#! /bin/bash
# si vuestra qnap usa otra ruta, has de cambiar CACHEDEV1_DATA por la que tengas
ruta="/share/CACHEDEV1_DATA/MySQL"
dia=$(date +%-d)
dsemana=$(date +%-u)
mes=$(date +%-m)
mes="mes$mes"
if [ ! -d $ruta/ ]; then
# si no existe la carpeta base, la creo
 mkdir $ruta
fi

#compruebo y creo la carpeta del día en curso si no existe
if [ ! -d $ruta/dia$dia/ ]; then
 # no existe la carpeta del $dia y la creo
 mkdir $ruta/dia$dia
else
 #si la carpeta del día existe, borro su contenido
 ls -1 -d $ruta/dia$dia/*.sql | while read archivo
 do
   #echo "ARCHIVO ELIMINADO: ""$archivo"
   rm $archivo
 done
fi
# hago backup de todas las bases de datos en archivos separados
for DB in `/usr/local/mysql/bin/mysql -e "show databases" -u root -pclaveMySQL| grep -v Database`; do /usr/local/mysql/bin/mysqldump -u root -pclaveMySQL $DB --events > "$ruta/dia$dia/$DB.sql"; done

semana=$(((dia+6)/7))
#echo "hoy es $dia y el dia de la semana es $dsemana, semana numero $semana y el mes es $mes"

#compruebo que es domingo
if [[ $dsemana -eq 7 ]]; then

# hoy es domingo y saco la semana del mes
semana=$(((dia+6)/7))

if [[ $semana -eq 1 ]]; then
# compruebo si existe la carpeta del mes, y si no está, la creo como mes+numero del mes
if [ ! -d $ruta/$mes/ ]; then
mkdir $ruta/$mes
fi
# compruebo si mes en curso tiene algo de *.sql y la vacío
ls -1 -d $ruta/$mes/*.sql | while read archivo
do
# echo "ARCHIVO ELIMINADO: ""$archivo"
rm $archivo
done
# copia  el backup de HOY a la carpeta mes en curso
cp $ruta/dia$dia/*.sql $ruta/$mes/

elif [[ $semana -eq 2 ]]; then
# compruebo si existe la carpeta semana2, y si no está, la creo
if [ ! -d $ruta/semana2/ ]; then
mkdir $ruta/semana2
fi
# compruebo si semana2 tiene algo de *.sql y la vacío
ls -1 -d $ruta/semana2/*.sql | while read archivo
do
# echo "ARCHIVO ELIMINADO: ""$archivo"
rm $archivo
done
# copia  el backup de HOY a la carpeta semana2
cp $ruta/dia$dia/*.sql $ruta/semana2/
elif [[ $semana -eq 3 ]]; then
# compruebo si existe la carpeta semana3, y si no está, la creo
if [ ! -d $ruta/semana3/ ]; then
mkdir $ruta/semana3
fi
# compruebo si semana3 tiene algo de *.sql y la vacío
ls -1 -d $ruta/semana3/*.sql | while read archivo
do
# echo "ARCHIVO ELIMINADO: ""$archivo"
rm $archivo
done
# copia  el backup de HOY a la carpeta semana3
cp $ruta/dia$dia/*.sql $ruta/semana3/
elif [[ $semana -eq 4 ]]; then
# compruebo si existe la carpeta semana4, y si no está, la creo
if [ ! -d $ruta/semana4/ ]; then
mkdir $ruta/semana4
fi
# compruebo si semana4 tiene algo de *.sql y la vacío
ls -1 -d $ruta/semana4/*.sql | while read archivo
do
# echo "ARCHIVO ELIMINADO: ""$archivo"
rm $archivo
done
# copia  el backup de HOY a la carpeta semana4
cp $ruta/dia$dia/*.sql $ruta/semana4/
else
# compruebo si existe la carpeta semana5, y si no está, la creo
if [ ! -d $ruta/semana5/ ]; then
mkdir $ruta/semana5
fi
# compruebo si semana5 tiene algo de *.sql y la vacío
ls -1 -d $ruta/semana5/*.sql | while read archivo
do
# echo "ARCHIVO ELIMINADO: ""$archivo"
rm $archivo
done
# copia  el backup de HOY a la carpeta semana5
cp $ruta/dia$dia/*.sql $ruta/semana5/
fi
fi

Como siempre, si veis algún fallo o errata me avisáis por privado para corregirlo.
Un saludo

Agur eta ondo ibili

Mon (TS-469Pro y TVS-673)
 Responder


Usuarios navegando en este tema: 1 invitado(s)


Powered By MyBB 1.8.6, © 2002-2018 MyBB Group
Hora: 23-10-2018, 02:31 PM