He creado un simple script Bash para hacer un backup de todas las bases de datos de un servidor MySQL en archivos diferentes. El script utiliza la herramienta mysqldump para volcar cada base de datos, en forma de código SQL, en archivos separados (un archivo para cada base). Una característica interesante, es que no requiere conocer a priori los nombres de las bases de datos, sino que los obtiene automáticamente con una consulta SQL. Para que el script funcione correctamente, sólo requiere un usuario con privilegio de lectura en todas las bases de datos (generalmente un usuario para backups).
A continuación dejo el script, junto con una explicación de su funcionamiento.
La ventaja de utilizar un archivo para cada base, es que al momento de restaurar es posible hacerlo de forma selectiva. Es decir, es posible recuperar sólo la/s base/s de datos que haga/n falta, a partir de su/s volcado/s (copias de seguridad).
#!/bin/bash
myuser=admin
mypass=1234
args=»-u»$myuser» -p»$mypass» –add-drop-database –add-locks –create-options –complete-insert –comments –disable-keys –dump-date –extended-insert –quick –routines –triggers»
mysql -u$myuser -p$mypass -e ‘show databases’ | grep -Ev «(Database|information_schema)» > databases.list
echo «Se volcarán las siguientes bases de datos:»
mysql -u$myuser -p$mypass -e ‘select table_schema «DATABASE»,convert(sum(data_length+index_length)/1048576, decimal(6,2)) «SIZE (MB)» from information_schema.tables where table_schema!=»information_schema» group by table_schema;’
CONT=1
while [ $CONT -eq 1 ]
do
echo -n «¿Desea continuar? (S/N): »
read -n 1 K
[[ «$K» == «N» || «$K» == «n» ]] && { echo «»; exit 0; }
[[ «$K» == «S» || «$K» == «s» ]] && { CONT=0; }
echo «»
done
while read DB
do
dump=»dump_»$DB».sql»
echo -n $dump»… »
mysqldump ${args} $DB > $dump
echo «OK.»
done < databases.list
rm databases.list
Tanto para consultar los nombres de las bases de datos, como para hacer los volcados, hace falta un usuario (que tenga los privilegios necesarios, es decir, acceso de lectura en todas las bases) y su contraseña. Las variables myuser y mypass almacenan usuario y contraseña (MySQL).
La variable args almacena todas las opciones que se le pasarán a mysqldump durante el volcado de cada base de datos:
–add-drop-database: agrega la sentencia «DROP DATABASE» antes de cada sentencia «CREATE DATABASE».
–add-locks: encierra cada volcado de tabla con un lock (resulta en inserts más rápidos al momento de restaurar).
–create-options: incluye todas las opciones específicas de MySQL en las sentencias «CREATE TABLE».
–complete-insert: incluye los nombres de columnas en las sentencias «INSERT».
–comments: incluye información útil como versiones de la aplicación y servidor, hostname, etc.
–disable-keys: crea los índices luego de insertar todas las filas (acelera el proceso de recuperación)
–dump-date: agrega la fecha de volcado.
–extended-insert: realiza insert de múltiples filas en una única sentencia.
–quick: útil para hacer dump de tablas grandes, recupera una fila por vez.
–routines: incluir en el dump las rutinas almacenadas (stored procedures y funciones).
–triggers: incluir triggers en el dump.
Luego de definir estas variables, obtiene los nombres de todas las bases de datos ejecutando la consulta show databases y los guarda en el archivo «databases.list».
A continuación, obtiene nuevamente los nombres de todas las bases de datos, junto con el tamaño en disco que ocupa cada base, para que el administrador pueda decidir proceder o abortar el volcado porque considera que no hay espacio suficiente en la ubicación actual (los archivos de volcado se guardarán en el directorio actual, desde donde se ejecuta el script).
En el siguiente segmento de código, espera a que el usuario presione la tecla ‘S’ (para responder «Sí») o ‘N’ (para responder «No»). Si el usuario presiona ‘N’, finaliza la ejecución del script. Si en cambio presiona ‘S’, procede con el volcado de cada base de datos.
En la última sección de código, realiza el dump de cada base de datos a partir de los nombres almacenados en el archivo «databases.list». Ejecuta mysqldump utilizando los parámetros especificados en la variable args. Al finalizar el bucle, elimina el archivo «databases.list».
Ya que el archivo almacena credenciales de usuario de MySQL en forma de texto plano (especialmente la contraseña), por seguridad debe ser protegido cuidadosamente. Sólo el administrador (root) debe tener permiso de lectura sobre el archivo:
root@debian7# chown root:root backup_all_databases.sh
root@debian7# chmod 500 backup_all_databases.sh
Ejemplo de ejecución del script:
root@debian7# ./backup_all_databases.sh
Se volcarán las siguientes bases de datos:
+———————————-+———–+
| DATABASE | SIZE (MB) |
+———————————-+———–+
| blog-linuxito_2012 | 1.59 |
| joomla27-2012 | 10.32 |
| joomla-bd-testing | 1.69 |
| joomla-db-desarrollo | 2.27 |
| managementdb | 0.41 |
| mysql | 0.66 |
| producciondb | 0.77 |
| producciondb2 | 0.27 |
| sitio-back-www-2012-10-05_full | 1137.63 |
| sitio-back-www-2012-10-06_diff | 0.06 |
| soft-2014 | 37.42 |
| test_2009 | 0.22 |
| test_pepito_www | 0.82 |
| test_joomla1.1 | 0.11 |
| test_joomla-6.5912 | 2.46 |
| www1 | 602.71 |
| www1logs | 0.23 |
| www-test | 0.06 |
+———————————-+———–+
¿Desea continuar? (S/N): s
dump_blog-linuxito_2012.sql… OK.
dump_joomla27-2012… OK.
dump_joomla-bd-testing… OK.
dump_joomla-db-desarrollo… OK.
dump_managementdb… OK.
dump_mysql… OK.
dump_producciondb… OK.
dump_producciondb2… OK.
dump_sitio-back-www-2012-10-05_full… OK.
dump_sitio-back-www-2012-10-06_diff… OK.
dump_soft-2014… OK.
dump_test_2009… OK.
dump_test_pepito_www… OK.
dump_test_joomla1.1… OK.
dump_test_joomla-6.5912… OK.
dump_www1… OK.
dump_www1logs… OK.
dump_www-test… OK.
root@debian7#
Listado de los archivos creados en el directorio actual:
root@debian7# ls -lh dump_*
-rw-r–r– 1 root root 1.2M Jun 26 10:26 dump_blog-linuxito_2012.sql
-rw-r–r– 1 root root 7.6M Jun 26 10:26 dump_joomla27-2012.sql
-rw-r–r– 1 root root 1.7M Jun 26 10:26 dump_joomla-bd-testing.sql
-rw-r–r– 1 root root 2.2M Jun 26 10:26 dump_joomla-db-desarrollo.sql
-rw-r–r– 1 root root 337K Jun 26 10:26 dump_managementdb.sql
-rw-r–r– 1 root root 521K Jun 26 10:26 dump_mysql.sql
-rw-r–r– 1 root root 587K Jun 26 10:26 dump_producciondb.sql
-rw-r–r– 1 root root 78K Jun 26 10:26 dump_producciondb2.sql
-rw-r–r– 1 root root 1.2G Jun 26 10:27 dump_sitio-back-www-2012-10-05_full.sql
-rw-r–r– 1 root root 26K Jun 26 10:27 dump_sitio-back-www-2012-10-06_diff.sql
-rw-r–r– 1 root root 26M Jun 26 10:27 dump_soft-2014.sql
-rw-r–r– 1 root root 78K Jun 26 10:27 dump_test_2009.sql
-rw-r–r– 1 root root 578K Jun 26 10:27 dump_test_pepito_www.sql
-rw-r–r– 1 root root 76K Jun 26 10:27 dump_test_joomla1.1.sql
-rw-r–r– 1 root root 2.2M Jun 26 10:27 dump_test_joomla-6.5912.sql
-rw-r–r– 1 root root 623M Jun 26 10:27 dump_www1.sql
-rw-r–r– 1 root root 39K Jun 26 10:27 dump_www1logs.sql
-rw-r–r– 1 root root 26K Jun 26 10:27 dump_www-test.sql
¡Espero que sea útil!