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

Un pingüino creando un programa para respaldar bases de datos mysql.
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.
#!/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 http://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 y 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.
