#!/bin/bash # <Guión para respaldar bases de datos en MySQL Community Server 8.0.19> # Copyright (C) <2020> <Jimmy Olano 🇻🇪> # # Este programa es software libre: puedes redistribuirlo y/o modificarlo # bajo los términos de la Licencia Pública General de GNU, publicada por # la Fundación de Software Libre, ya sea la versión 3 de la Licencia, o # (a su elección) cualquier versión posterior. # # Este programa se distribuye con la esperanza de que sea útil, # pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de # MERCADEO o APTITUD PARA UN PROPÓSITO PARTICULAR. Vea el # GNU General Public License para más detalles. # # Debería usted haber recibido una copia de la Licencia Pública General de GNU # junto con este programa. Si no es así, vaya a <https://www.gnu.org/licenses/>. # # English language: # <Script for backing up databases MySQL Community Server 8.0.19> # Copyright (C) <2020> <Jimmy Olano 🇻🇪> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>. # # ¿Qué hace este guión? # Crea una carpeta maestra de respaldo en el "home" del usuario y crea subcarpetas # para el tipo de base de datos y luego una carpeta para cada mes. # De la lista de base de datos a (respaldar y/o ignorar) extrae la información # con MySQLDump y la comprime con gzip de manera "amigable" para rsync. # Última actualización de este guión: jueves 5 de marzo de 2020. # Inicio de variables personalizables # Credenciales: recomendado usar "auth_socket" para conectar SIN CONTRASEÑA # (en inglés: https://www.percona.com/blog/2019/11/01/use-mysql-without-a-password/ ) ksUsuario="nombre_del_usuario(a)" ksContrasena="contraseña" # Servidor local por defecto ("auth_socket" solo usa "localhost"); # sino usar dirección IP o URL. ksAnfitrionRemoto="localhost" # Si el servidor es remoto ASEGURAR el envío de contraseña # (en inglés: https://dev.mysql.com/doc/refman/8.0/en/password-security-user.html ) # Carpeta principal con los respaldos. ksDestino="$HOME/Respaldos" # Carpeta secundaria, una para cada tipo de base de datos, # una carpeta para cada mes. ksSeparador="_" ksDestinoAnuarioMes="$ksDestino/Respaldos$ksSeparador""MySQL/$(date +"%Y-%m%b")" # Lista de base de datos a respaldar, por defecto (valor="") TODAS las que el # usuario tenga derechos; de lo contrario separar nombres con un espacio. ksBD_a_respaldar="" # Lista de base de datos a ignorar separadas por un simple espacio ksBD_a_ignorar="information_schema prueba pruebas" # Fin de variables personalizables # Variables automáticas «no modificar». ksAnfitrionLocal="$(hostname)" ksJustoAhora="$(date +"%Y-%m%b-%d%a@%H%M")" ksNom_Archivo_Resp="" # Variables automáticas «SE PUEDEN AJUSTAR, DE SER NECESARIO». ksMYSQL="$(which mysql)" ksMYSQLDUMP="$(which mysqldump)" ksGZIP="$(which gzip)" # Crea los directorios necesarios [ ! -d $ksDestinoAnuarioMes ] && mkdir -p $ksDestinoAnuarioMes || : # Comienza respaldo, primero lista las bases de datos disponibles para el usuario ksLista_BDs="$( $ksMYSQL -u $ksUsuario -p$ksContrasena -h $ksAnfitrionRemoto -Bse 'SHOW DATABASES;')" for base_dato in $ksLista_BDs do # Revisa la lista de bases de datos a respaldar. if [ "$ksBD_a_respaldar" == "" ]; then ksRespaldar=true else ksRespaldar=false for i in $ksBD_a_respaldar do if [ "$base_dato" == "$i" ]; then ksRespaldar=true fi done fi # Pero si está en la lista de ignorar, pues pasa a la siguiente BD. if [ $ksRespaldar == true ] ; then if [ "$ksBD_a_ignorar" == "" ]; then ksRespaldar=true else ksRespaldar=true for i in $ksBD_a_ignorar do if [ "$base_dato" == "$i" ]; then ksRespaldar=false fi done fi fi if [ $ksRespaldar == true ] ; then Nom_Archivo_Resp=$ksDestinoAnuarioMes"/Respaldo"$ksSeparador"MySQL" Nom_Archivo_Resp=$Nom_Archivo_Resp$ksSeparador$ksJustoAhora$ksSeparador Nom_Archivo_Resp=$Nom_Archivo_Resp$ksAnfitrionRemoto$ksSeparador$base_dato".gz" # Respaldo en sí ksMYSQLDUMP_ARG=" -u $ksUsuario " if [ "$ksContrasena" != "" ]; then ksMYSQLDUMP_ARG=$ksMYSQLDUMP_ARG" -p$ksContrasena" fi ksMYSQLDUMP_ARG=$ksMYSQLDUMP_ARG" $base_dato -h $ksAnfitrionRemoto --column-statistics=0" #echo "$ksMYSQLDUMP $ksMYSQLDUMP_ARG | $ksGZIP -9 --rsyncable > $Nom_Archivo_Resp" $ksMYSQLDUMP $ksMYSQLDUMP_ARG | $ksGZIP -9 --rsyncable > $Nom_Archivo_Resp fi done # Fin del guión, ¡que tengáis un feliz día!