Apuntes de Software Libre

backups

backups mysql cron mysqldump

by on Apr.07, 2009, under backups, Debian, mysql

La idea es crear un sencillo sistema de backups de las tablas mysql en disco de manera que después podamos usar rsync para poder hacer las copias.
Los objetivos son:
que las copias las haga un usuario de sistema sin privilegios especiales.
que el usuario myql tenga los minimos privilegios necesarios posibles.
via mysqldump y cron
contraseñas fuera del script.
que nos avise si hay errores via mail.

UPDATE: Actualización del script para seleccionar todas las bases de datos y no hardcodearlas. 25.08.2010

1.- Creamos el usuario y le damos password.
El dir /home/backup/mysql nos servirá de repositorios para los backups. Como el usuario no necesita shell nos aseguramos de ponerle /bin/false como shell.

nahia:~# useradd -c "usuari backup mysql" --home-dir /home/backup --create-home --shell /bin/false backupusr
nahia:~# pass backupuser

Ahora crearemos el usuario de mysql con los privilegios justos y necesarios para poder hacer backup de todas las bases de datos. Estos son LOCK_TABLES y SELECT, nada más.


mysql> GRANT LOCK TABLES, SELECT ON *.* TO 'backupuser'@'localhost' IDENTIFIED BY 'pipipopo';
Query OK, 0 rows affected(0.03 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

Para poder ejecutar mysqldump sin password en el script deberemos crear un fichero ~/.my.cnf con el siguiente contenido.


.my.cnf
[client]
user=backupuser
pass=pipipopo

Crearemos en /home/backup/bin/backup-mysql.sh :

#!/bin/sh

data=`/bin/date +%Y%m%d-%H`
backupdir='/home/backup/backups/'
timemax='10' # temps maxim en dies per
find_cmd=`which find`
mysqldump_cmd=`which mysqldump`
databases='mysql postfix-db wordpress-db'
databases=$(mysql -Bse "show databases")
mailto='mail@dominio.tld'
logfile='/tmp/db-errors.log'

echo "Informe de Backups Mysql per la data $data

" >> $logfile

for db in $databases
do $mysqldump_cmd --lock-tables $db > ${backupdir}${data}-backup-$db.sql
if [ "$db" != 'information_schema' ]; then
do
$mysqldump_cmd --lock-tables $db > ${backupdir}${data}-backup-$db.sql

if [ $? -eq 0 ]; then
echo "$db dumped correctament" >> $logfile
else
echo "Error en $db" >> $logfile
errors='1';
fi
fi
done

for file in "$( $find_cmd $backupdir -type f -mtime +$timemax )"
do
/bin/rm -f $file
done

if [ "$errors" == "1" ]; then
cat $logfile | mail -s "Error en la copia de les databases ${data}h" $mailto
fi;
# Esborra l'informe
/bin/rm -rf $logfile
exit 0

Este script se ejecutará cada dia a las 01:00 am via cron:


# Backup de mysql cada dia a las 01:00 am.
0 1 * * * /home/backup/bin/backup-mysql.sh 2>&1 >/dev/null

Comments Off on backups mysql cron mysqldump more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...