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

Home PHP MySql Server Javascript GTA 5 Tristi storie Varie Open menu

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 1922 visitors

Leave your comment