Backup de base de datos MySQL sin usar la clave en un cron

Una tarea habitual suele ser hacer copias de seguridad de nuestras bases de datos usando un cron. El problema es que al hacer la copia de seguridad se nos va pedir una clave. ¿Cómo lo podemos solucionar?

  • Podríamos crear un usuario sin clave. Esto es una muy, muy mala idea. Cualquiera podría usar ese usuario dado que no tiene clave.
  • Podríamos meter la clave dentro del crontab directamente. También es muy mala idea, un usuario podría ver la clave mirando los procesos que se están ejecutando en el sistema.

Hay una opción más segura que consta de dos fases:

  • Crear un usuario específico para hacer el volcado de las bases de datos que solo tenga permisos para eso y nada más.
  • Usar el fichero .my.conf para que no sea necesario dejar la clave escrita en el crontab.

Crear un usuario con permisos limitados

Entra en el servidor MySQL y teclea el siguiente comando:

mysql> GRANT LOCK TABLES, SELECT ON *.* TO 'usuariobackup'@'%' IDENTIFIED BY 'MiClaveEsSuperSecreta';

Sal del servidor MySQL y prueba a hacer una copia de seguridad sin la contraseña:

$ mysqldump -uusuariobackup nombreBaseDatos > nombreBaseDatos.sql

Este comando producirá un error:

mysqldump: Got error: 1045: Access denied for user 'usuariobackup'@'localhost' (using password: NO) when trying to connect

Como ves aún no funciona porque MySQL se queja de que no hemos metido la clave.

Crear/Editar el fichero .my.cnf

El siguiente paso es crear o editar el fichero .my.cnf que está en la carpeta home del usuario que va a ejecutar el crontab:

$ nano ~/.my.cnf

NOTA: nano es el editor que he usado yo, puede usar vi, vim o el que prefieras.

NOTA 2: ~ representa la carpeta home del usuario, en mi caso /home/gorka.

En el fichero .my.cnf añade lo siguiente:

[mysqldump]
user = usuariobackup
password =  MiClaveEsSuperSecreta

Si ahora pruebas otra vez el comando:

$ mysqldump -uusuariobackup nombreBaseDatos > nombreBaseDatos.sql

Verás que ahora ya se crea el fichero con la copia sin problemas.

Añadir el comando al crontab

Edita tu crontab:

$ crontab -e

y añade esta línea para hacer copias todos los días a las 00:00:

0 0 * * *mysqldump -uusuariobackup nombreBaseDatos > /home/gorka/nombreBaseDatos.sql

También puedes hacer copia de todas las bases de datos:

0 0 * * *mysqldump -uusuariobackup –all-databases > /home/gorka/nombreBaseDatos.sql

Puedes hacer esta tarea más complicada, por ejemplo, comprimiendo el fichero nombreBaseDatos.sql y restringiendo los permisos con chmod 600 para evitar que otros usuarios puedan leerlo.

Un poco de seguridad extra

Para evitar que otros usuarios puedan leer tu fichero .my.conf y ver la clave del usuario MySQL cambia los permisos:

chmod 600 ~/.my.conf

Dar permisos solo para una base de datos

Si no quieres dar al usuario permiso para acceder a todas las bases de datos puedes darle permiso para una determinada:

GRANT LOCK TABLES, SELECT ON nombreBaseDatos.* TO 'usuarioBackup'@'%' IDENTIFIED BY 'MiClaveEsSuperSecreta';
Autor:
Nivel: Principiante
Palabras clave:
Fecha publicado:
Fecha actualizado: 06-09-2016

Otros capítulos de la misma serie

Este capítulo es parte de la serie: Configuración de un servidor.

Y muchos más en preparación.

Disponible en los planes: Laravel hero PHP a tope