backups
backups mysql cron mysqldump
by azazelo 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