Backup automatico MySql su server Ubuntu. <alebal web Blog> | Appunti di PHP, MySql, javascript, Css, HTML, HTML5 e altro...

Con questo giochino creo uno script che può essere lanciato via cronjob (giornaliero, settimanale, mensile), che in automatico fa il backup di tutte le tabelle mysql sul mio server e crea un unico file .zip.

Si comincia creando la necessaria struttura cartelle:

sudo mkdir /var/backup
sudo mkdir /var/backup/mysql

Poi si assegnano i permessi per scrivere file in queste cartelle:

chown -R www-data:www-data /var/backup
chmod -R 755 /var/backup
chown -R www-data:www-data /var/backup/mysql
chmod -R 755 /var/backup/mysql

A questo punto si crea il file vero e proprio che fa il backup:

sudo nano /var/backup/mysql_backup

Il contenuto del file appena creato è questo:

#!/bin/bash
# Shell script to backup mysql database
STARTTIME=(`date +%s`)  #con gli apici cretini sennò non funziona

MyUSER=root     # USERNAME
MyPASS=tuapassword   # PASSWORD
MyHOST=localhost        # Hostname
 
# Linux bin paths, change this if it can't be autodetected via which command
mysql="$(which mysql)"
mysqlDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
 
# backup Dest directory, change this if you have someother location
DEST="/var/backup"
 
# Main directory where backup will be stored
MBD="$DEST/mysql"

#elimino vecchi backup
rm $MBD/*
 
# Get hostname
HOST="$(hostname)"
 
# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y")"
 
# File to store current backup file
FILE=""
# Store list of databases
DBS=""
 
# DO NOT backup these databases
IGGY="information_schema cond_instances mysql performance_schema phpmyadmin sys"
 
[ ! -d $MBD ] && mkdir -p $MBD || :
 
# Only root can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
 
# Get all database list first
DBS="$($mysql -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
 
for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ];
    then
        for i in $IGGY
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi
 
    if [ "$skipdb" == "-1" ] ; then
        #FILE="$MBD/$db.$HOST.$NOW.gz"
        #no gzip, comprimo dopo tutta la cartella
        FILE="$MBD/$db.$HOST.$NOW.sql"

        # do all inone job in pipe,
        # connect to mysql using mysqldump for select mysql database
        # and pipe it out to gz file in backup dir :)
        #$mysqlDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE

        #no gzip, comprimo dopo tutta la cartella
        $mysqlDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db > $FILE
    fi
done

#elimino vecchio zip, altrimenti continua ad aggiungere file e pesa giga su giga
rm $DEST/mysql-backup-$HOST.zip

#comprimo tutto
zip -r $DEST/mysql-backup-$HOST.zip $MBD/

#tar -zcvf $DEST/mysql-backup-$HOST.tar.gz $MBD

ENDTIME=(`date +%s`)    #con gli apici cretini sennò non funziona

TOTTIME=`expr $ENDTIME - $STARTTIME`

echo Elapsed_time: $TOTTIME

Assegnamo i corretti permessi al file:

sudo chmod 755 /var/backup/mysql_backup

A questo punto lo script si può lanciare manualmente via terminale:

/var/backup/mysql_backup

Oppure via cronjob, ad esempio cosi:

#backup mysql
0 6 * * 4 /var/backup/mysql_backup

Fin qui tutto carino, ma tutto rimane sul server.

Bello bello sarebbe anche far arrivare il file al tuo pc o magari su qualcosa tipo un Rasperry PI collegato a un NAS...

Si può fare con scp.

scp root@ip_tuo_server:/var/backup/mysql-backup-host_tuo_server.zip dir_sul_tuo_pc_o_nas/mysql-backup-host_tuo_server.zip

Nome del file e host_tuo_server li trovi sul server in /var/backup/

Il comando scp può essere aggiunto in un cronjob sul tuo pc o Raspberry PI.

Io uso linux anche nei miei pc, quindi mi viene facile ma probabilmente esiste qualcosa per creare conjob anche in windows o mac, ma non lo so, mi fanno schifo e non mi ci voglio immischiare... :)

Google Digg Reddit Tumblr Pinterest StumbleUpon Email

Rating: 5 out of 5 by 234 visitors

Leave your comment