¡Hola a todos! El siguiente script bash lo que pretende es realizar un respaldo de todas las bases de datos del servidor MySQL (GNU/Linux por supuesto) en un solo script y sin mucha complicación; lo que hace es verificar el número de bases de datos que tiene y, con base en éste dato, se crea un bucle para ir respaldando base de datos por base de datos. Lo bonito del script es que de una vez se va comprimiendo el respaldo y luego se transfiere a su destino (otro servidor, recurso compartido, etc.).
Sí, sé que es un script sencillo que se puede realizar desde cero con un poco de tiempo, pero hay pequeños detalles que se olvidan y pues me servirá a mí más que todo como un recordatorio de cómo se hace y no perder el tiempo en hacerlo de cero.
Explico cada parte mediante los colores:
- Azul. Se establece una variable con la fecha/tiempo actual, de tal manera guardar ésta información en el nombre del archivo.
- Verde. Verificamos el # de BD’s que tiene nuestro servidor y, con base a éste, haremos el bucle para ir haciendo el respaldo de cada una de ellas. En ésta línea coloco las credenciales (usuario y clave) de acceso al MySQL en línea, pero esto no es adecuado… se puede hacer lo mismo que se verá más adelante.
- Rojo. Se genera el respaldo de la BD en cuestión. Lo especial de éste paso es que, en lugar de colocar el usuario y contraseña explícitamente en el script, se hace referencia al archivo auth-mysql.cnf , el cual es el que contiene dicha información. En ésta misma línea de comando, comprimimos el respaldo resultante en formato gzip. El contenido del archivo .cnf sería más o menos así (Credenciales de acceso al MySQL como root):
[client] user=root password=Mi_Clave2 host=localhost
- Morado. Copiamos el respaldo de la BD a un recurso compartido de algún Windows. De igual forma que el anterior punto, las credenciales de acceso las dejamos en una archivo de texto (/home/usuario/auth-samba.txt) con el siguiente contenido (Credenciales de acceso al recurso compartido de un Windows):
username=administrador password=Mi_Clave3 domain=ingdiaz.org
- Lo demás es para finalizar el bucle y eliminar el respaldo que quedó en el server local (dado que ya lo tenemos en el otro servidor y para efectos de liberar espacio es mejor eliminarlo).
A continuación, el contenido del script:
#!/bin/bash fecha=$( date +%Y%m%d-%H%M%S ) mysql -u usuario --password="Mi Clave" -B -N -e 'show databases' | while read db; do echo "Respaldando ${db}..." mysqldump --defaults-extra-file=/home/usuario/auth-mysql.cnf --lock-tables=false ${db} | gzip -c -9 > /opt/backup/bd-${db}-${fecha}.gz echo "Enviando a recurso compartido" smbclient //servidor1/respaldos -A /home/usuario/auth-samba.txt -c 'put /opt/backup/bd-'${db}'-'${fecha}'.gz bd-'${db}'-'${fecha}'.gz' #scp -u usuario -pMiClave '/opt/backup/mibase-'${db}'-'${fecha}'.gz' usuario2@server2://tmp done rm /opt/backup/* exit 0
También dejé «comentareado» la forma de copiar éste respaldo mediante scp , si digamos se quiera guardar en un servidor GNU/Linux.
¡Saludos!
al decir «(GNU/Linux por supuesto)» significa que no es aplicable a un servidor Mysql instalado en windows?
Hola. Se podría hacer en Windows, pero se tendría que cambiar el script, dado que tendría que hacerse mediante un bat o script de powershell.
Pregunta. Trate de abrir el archivo resultante pero me aparece como no legible… es normal?
Si, es que es un archivo comprimido; debes de descomprimirlo con gunzip {nombre_archivo} y ahí te aparecerá el script de la BD. Saludos.
Gracias! todo nice