Backups MySQL con mysqldump sin contraseña

Los CMS basados en PHP (WordPress, Drupal, Joomla, Magento, Prestashop) ofrecen la opción de realizar copias de seguridad de la base de datos por medio de varios mecanismos, por ejemplo, plugins de backup. En el caso de WordPress, estas copias de seguridad suelen grabarse en la carpeta wp-content.

El post de hoy explica cómo hacer copias de seguridad sin ningún plugin CMS, sino a mano, por así decir, con un shell script. Esta explicación supone que tienes acceso SSH root a la máquina donde se aloja tu CMS.

Backup

Backup de la base de datos

La utilidad mysqldump de MySQL permite hacer copias de seguridad de bases de datos. Es sencillo volcar bases de datos en la línea de comandos con esta herramienta, típicamente se hace así:

mysqldump -u root -p foo > foo.sql

Sin embargo el comando anterior pide la contraseña de root:

Enter password:

Lo que imposibilita que podamos automatizar el backup.

Pero no te preocupes, vamos a hacer un pequeño trick. Vamos a crear un shell script automático que además hará el backup en la carpeta que tú prefieras.

Vamos a organizarnos un poco

Ok, antes de explicarte cómo hacer el backup con mysqldump sin contraseña primero voy a mostrarte un ejemplo de estructura de directorios necesaria para llevar a cabo esta tarea.

/root/admins
    /miproyecto.com
        /backups
            bbdd.sh

/root/backups
    /miproyecto.com
        /bbdd
        /wp

Esto es solo un ejemplo, una idea. /root/admins es para almacenar los shell scripts de administración de tus proyectos web, y /root/backups es donde guardas las copias de seguridad de tus proyectos.

Archivo .my.cnf con las credenciales de acceso

Una vez definida la estructura de directorios sobre la que va a correr nuestro shell script bbdd.sh, vamos a crear el archivo /root/.my.cnf.

[mysqldump]
user = root
password = "?fsa8A@(H#zfdsafa}?w="fdas901J^"

Aquí ponemos las credenciales del usuario que hace la copia de seguridad de la base de datos. Finalmente asignamos permisos 700 a .my.cnf.

chmod 700 /root/.my.cnf

Shell script que hace el mysqldump sin password

Con lo anterior ya podemos crear el script /root/admins/miproyecto.com/backups/bbdd.sh.

#!/bin/sh

# Project name
project="miproyecto.com"

# Where to backup
path="/root/backups/$project/bbdd/"

# Create filename
day=$(date +%m-%d-%Y)
timestamp=$(date +%s)
filename="$day-$timestamp"

# Database name
dbname="i0fs_87D5_u03B"

# Let's backup now!
mysqldump $dbname > "$path$filename.sql"
chmod 700 "$path$filename.sql"
tar zcfP "$path$filename.tgz" "$path$filename.sql"
chmod 700 "$path$filename.tgz"
rm "$path$filename.sql"

Haciendo el backup automático sin contraseña

Para ejecutar el script:

bash bbdd.sh

Esto creará en /root/backups/miproyecto.com/bbdd un archivo con un nombre parecido a 08-29-2014-1409306693.tgz, con ese formato.

Por un lado, programamos nuestro script de modo que el nombre del archivo backup contenga la fecha cuando se hizo el bakcup, pero también incluimos un timestamp para evitar que se produzcan colisiones en los nombres, por si necesitas hacer varios backups el mismo día.

En esta entrada hemos explicado cómo hacer el backup a mano, pero también puedes utilizar la utilidad cron para automatizar la ejecución del script.