Script para respaldar bases de datos MySQL versión 2

Hace tiempo hice un script para respaldar bases de datos de un servidor MySQL, pero dejó de funcionar. Esta nueva versión arregla los problemas del anterior aunque en esencia hace las mismas funciones.

Tabla de contenidos

El script

El script anterior dejó de funcionar porque en una actualización del paquete mysql-clients no permitía la comprobación, reparación y optimización de las bases de datos en una sola línea. Así que para evitar este problema tuve que separar estas tareas.

Con este código primero revisamos y reparamos cualquier error que pudieran tener todas las tablas de nuestro servidor de trabajo

mysqlcheck -c -A --auto-repair -h $IP_SERVIDOR_MYSQL -u $USUARIO --password=$DB_PASS

Para luego optimizar las tablas

mysqlcheck -A -o -h $IP_SERVIDOR_MYSQL -u $USUARIO --password=$DB_PASS

Claro que ahora el script se tarda un poco más en ejecutar, pero yo no hice las reglas 🙂 .

Adicionalmente, le hice algunos ajustes para que el nombre de los archivos de volcado incluyera información como la fecha, hora, minutos y segundos.

Si quieren darle un vistazo al código completo verán que es muy simple de ajustar y lo pueden descargar aquí: MySQL Backup Script

#!/bin/sh
#
# Este programa es software libre. Puede redistribuirlo y/o
# modificarlo bajo los términos de la Licencia Pública General
# de GNU según es publicada por la Free Software Foundation,
# bien de la versión 2 de dicha Licencia o bien (según su
# elección) de cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea
# útil, pero SIN NINGUNA GARANTÍA, incluso sin la garantía
# MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN
# PROPÓSITO PARTICULAR. Para más detalles, véase la Licencia
# Pública General de GNU.
#
# Copyleft 2012
# Autor: Linuxman inguanzo@gmail.com https://linuxmanr4.com 
# versión 2.0

NAME="MySQL Backup"									# Nombre script.
													# Descripción: Script para hacer un respaldo de todas las bases de datos de un servidor MySQL.
: ${DATE:=$(date +'%Y-%m-%d')}						# Variable para Fecha.
: ${TIME:=$(date +'%R')}							# Variable para Hora.
: ${WORK_DIR:=/home/usuario/directorioderespaldo/}	# Directorio de trabajo. 
: ${IP_SERVIDOR_MYSQL:=IP_DEL_SERVIDOR_MYSQL}		# Dirección del servidor MySQL. 
: ${USUARIO:=root}									# Usuario con privilegios a la base de datos. Ej. root
: ${DB_PASS:=CONTRASEÑA}							# La contraseña de root de nuestro servidor MySQL. 


# Antes de respaldar optimizamos y reparamos las bases de datos.
clear
echo "Revisando y reparando las bases de datos."
echo "========================================="
mysqlcheck -c -A --auto-repair -h $IP_SERVIDOR_MYSQL -u $USUARIO --password=$DB_PASS

echo
echo "Optimizando las bases de datos."
echo "========================================="
mysqlcheck -A -o -h $IP_SERVIDOR_MYSQL -u $USUARIO --password=$DB_PASS

# Cambiamos a nuestro directorio de trabajo
cd $WORK_DIR

echo
echo "Iniciando el vaciado de todas las bases de datos."
echo "================================================="

# Iniciamos un vaciado de todas las bases de datos del servidor.
TABLES=`mysql -h $IP_SERVIDOR_MYSQL -u$USUARIO --password=$DB_PASS --execute="SHOW DATABASES;" |awk '{print($1)}' |grep -v "Database" |grep -v "information_schema"`
for table in $TABLES; do
	echo "Respaldando la tabla $table..."
	file=$table.respaldo_`date +%Y%m%d-%H:%M:%S`.sql
	mysqldump  -h $IP_SERVIDOR_MYSQL -u"$USUARIO" -p"$DB_PASS" $table > $file
	echo "Comprimiendo $file ..."
	gzip $file
done

echo
echo "RESPALDO TERMINADO!!!"

Sólo tienen que teclear los valores adecuados para los parámetros WORK_DIR, IP_DEL_SERVIDOR_MYSQL, USUARIO CONTRASEÑA.

Y por su puesto, darle permisos de ejecución al script, Ej.

chmod +x mysql_backup.sh

Problemas con mariadb-clients (1054)

Esta es una actualización, he usado este script durante muchos años y nunca me había tenido problemas, hasta ahora.

Y es que en mi Manjaro se dejó de utilizar MySQL y su lugar lo ocupó MariaDB, esto es perfectamente normal, lo mismo ocurrió en muchas distribuciones de Linux.

Pero Manjaro es una distribución de actualización constante y tarde o temprano iba a tener un problema.

Resulta que mi servidor utiliza la versión 5.0 de MySQL y parece que no se lleva bien con la versión 10.11.2 del paquete mariadb-clients.

Al ejecutar el script aparece un error como este:

mysqldump: Couldn't execute 'select column_name, extra, generation_expression, data_type from information_schema.columns where table_schema=database() and table_name='db'': Unknown column 'generation_expression' in 'field list' (1054)

Inicie mi investigación en Google, intenté varios ajustes pero no, lo mejor es hacer un downgrade a la versión anterior que funciona que es la número 10.10.3.

sudo downgrade mariadb-clients mariadb-libs

Para evitar que estos paquetes se actualicen los agregué a la lista de paquetes ignorados en el archivo /etc/pacman.conf

#
# GENERAL OPTIONS
#
[options]
IgnorePkg = mariadb-clients mariadb-libs

Noten que también hay que hacer un downgrade al paquete mariadb-libs ya que uno depende del otro.

Otra solución sería hacer una actualización al servidor MySQL pero eso implica un montón de pruebas de compatibilidad con otros elementos de programación y la verdad no le veo el caso.

En todos estos años jamás he perdido un registro con la versión que estoy utilizando.

Así que con hacer el downgrade es más que suficiente para que el script vuelva a funcionar.

Si tienen cualquier comentario al respecto se los agradeceré. Espero que les sea de utilidad.

14 comentarios en “Script para respaldar bases de datos MySQL versión 2”

    • Hola Fede,

      No tengo ninguna base de datos postgresql funcionando actualmente, pero supongo que si se puede adaptar, solo hay que reemplazar algunos comandos. Por ejemplo, en postgresql se utiliza pg_dump para hacer el vaciado de la base de datos a un archivo.

      Saludos !!!.

      Responder
  1. Hola, muchas gracias por tu script, es muy bueno, nada mas quería preguntarte algo, hay un pequeño error en mi ubuntu, no se a que se deba, despues de que tu script se ejecuta, termina todo perfecto pero el nombre del comprimido es algo asi como DA306M~G.GZ (este es actualmente un nombre real) dentro del archivo ya se encuentra todo en orden, ya ahi veo el archivo dulcer5_pos.respaldo_20160805-12:56:49.sql, sabes como podria arreglar el nombre ?

    Saludos.

    Responder
      • No, ese no es el problema, el respaldo lo hace bien de una sola base de datos que tengo y se respalda, la unica parte que no funciona bien del todo en el script es esta:

        gzip $file

        ya que en vez de generar el archivo dulcer5_pos.respaldo_20160805-12:56:49.sql.gz
        genera el archivo DA306M~G.GZ

        mi pregunta es como hago para que gzip respete el nombre del respaldo, para poder visualizar los respaldos correctamente en carpeta, ya que solo puedo saber que respaldo es, hasta que lo abro.

        Espero haberme entendido.

        Responder
  2. Que tal, fijate que ya se arreglo solo, no estoy muy seguro de como, pero ya se esta comprimiendo con el nombre correcto, lo unico que hice fue modificar esta linea:

    mysqldump -h $IP_SERVIDOR_MYSQL -u"$USUARIO" -p"$DB_PASS" $table > $file

    a

    mysqldump -h $IP_SERVIDOR_MYSQL -u"$USUARIO" -p"$DB_PASS" --hex-blob $table > $file

    por que me di cuenta que mis entradas blob no se podían importar, tal vez esto desencadenaba un error en el archivo, y de alguna forma repercutía en la compresión, es lo único que he movido, y empezó a funcionar el nombre.

    Responder
  3. Muy bueno mi hermano ya le hice modificaciones para mi consumo interneto pero muy bueno la verdad estoy adentrandome en esto del bash y la verdad es que me encanta ver como se muestran los resultados aplicados

    Responder
  4. Si yo lo hice con un crontab ademas de agregarle nuevas funcionalidades como moverla para una carpeta donde guardo mis salva y borrarlas cada 7 dias

    Responder

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.