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.
#!/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 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.
¿Y porque no compartes tu versión? a lo mejor a alguien le puede ser de utilidad.
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
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
Que bueno que te fue de utilidad 🙂
Este script me ha salvado en varias ocasiones. De hecho lo ejecuto cada vez que enciendo mi máquina.
Saludos.
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.
Excelente Tocayo,
Mira que en eso no había pensado y es que ese tipo de datos prácticamente no lo uso. Lo bueno es que lo solucionaste y ya quedó.
Saludos !!!.
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.
Que interesante Javier,
Deja veo si entiendo bien, entonces el script en lugar de generar un archivo por cada base de datos del servidor, ¿lo que hace es un solo archivo comprimido?
¿Copiaste el archivo de la página del blogo o del paste? http://paste.linuxmanr4.com/view/2c7ee972
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.
Bueno, el que le da el nombre al archivo es la variable file … agrega una línea de código … http://paste.linuxmanr4.com/view/cdc36e31
Revisa la línea no. 52 agregué un echo $file … veamos que te aparece en pantalla.
Hola buen día, disculpa mi ignorancia, cómo se debe guardar para ejecutar desde el servidor?
Muy buen laburoo. Solo una consulta de novato, funciona para postgres?
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 !!!.