Script en bash para respaldar MySQL

En el ámbito personal, muchas veces pasamos por alto la importancia de contar con un respaldo de nuestra información y continuamos sin preocuparnos hasta que llega en día en que por alguna desafortunada situación te preguntas con tristeza: “¿Porqué no hice un respaldo?”

En el ámbito laboral, ni siquiera debes pensar como una alternativa el contar con respaldos, ahí debes tenerlos obligadamente, “por si acaso” llegan a ser necesarios.

En ese tenor, y como administrador de sistemas en Linux, quiero compartir un script muy pequeñito que hice en mi trabajo para respaldar bases de datos de MySQL del servidor, lo que me gustó como resultado final, es que en cada carpeta se crea un archivo comprimido e independiente por cada base de datos; creo que resulta más práctico administrar la restauración de una base de datos de esta manera en lugar de tener un enooorme archivo con tooodas las bases de datos; también le agregué un par de líneas para realizar la rotación de respaldos, eliminando los más antiguos y conservando siempre los más recientes.

Archivo:  backup_mysqldb_cron.sh

Código:

#!/bin/bash

# MySQL credentials for connection
 user="root"
 password="secretPassword"
 host="localhost"

# WARNING: Never user the root "/" as backup_path
# This folder must be exist:
 backup_path="/backups/srv/www/mysqlbackup"

# The maximum of backups to keep
# (the oldest backups will be erased)
 maximum_backup_folders=3

# Create a folder using actual date to storage the backup
 date=$(date +"%Y-%m-%d_-_%H-%M-%S")
 mkdir $backup_path/$date

# Get a list of all databases in MySQL
 databases=$(mysql --user=$user --password=$password -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)")

# Create a file dumps for each database
 for db in $databases
  do
   mysqldump --user=$user --password=$password --host=$host $db | gzip -9 > $backup_path/$date/$db.sql.gz
 done

# Remove the oldest backups
 total_backup_folders=$(ls -tr $backup_path | wc -l)
 if [ $total_backup_folders -gt $maximum_backup_folders ];then
  to_delete=$(( $total_backup_folders - $maximum_backup_folders ));
  for delete_folder in $(ls -tr $backup_path | head -$to_delete);
   do
    rm -rf $backup_path/$delete_folder;
  done
 fi;

 

Para usar el script, sólo bastará con tener los permisos suficientes en el sistema para hacerlo ejecutable, en una terminal ejecuta la siguiente orden:

chmod +x backup_mysqldb_cron.sh

El script se puede ejecutar directamente desde la consola o bien, agregarlo en una entrada en cron para que se ejecute cada determinado tiempo de forma automática; esto se logra con la siguiente orden desde una consola:

crontab -e

Una vez dentro del editor de cron, se añaden las siguientes líneas:

# backup the mysql databases on separated files at midnight every day
@midnight /root/backup_mysqldb_cron.sh >/dev/null 2>&1

 

Después de guardar los cambios en crontab, habrá que reiniciarlo; en mi entorno se realiza con la instrucción:

/etc/init.d/cron restart

Al final y como siempre, espero que esta pequeña aportación, le sea útil a alguien más.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s