• Backup dei database a rotazione per Linux

    I possessori di server Linux spesso devono creare una serie di backup di database, possibilmente a rotazione. Sebbene ci sono sistemi diversi più o meno automatici, come ad esempio l'utilizzo di logrotate, spesso si sceglie più volentieri uno script personalizzato per risolvere anche altri problemi correlati e permettere un controllo più capillare. In questo articolo vediamo come strutturare il server per uno script di rotazione di uno o più database per 8 giorni.


    Prima di tutto creamoci una cartella /backup, dove raccogliere tutti i backup di tutti i database. Lo spazio deve essere abbastanza grande per accogliere 8 backup per tutti i database che vogliamo aggiungere.

    Poi inseriamo in un file nuovo (ad esempio: /etc/cron.d/mysql_backup) lo script seguente:
    Codice:
    #!/bin/sh
    
    test -x /usr/bin/mysqldump || exit 0
    
    # Rotate and Backup databases
    for f in mysql newsletter support sviluppo tools joomla
    do
             # 1. Delete last backup
             src=/backup/$f.sql.8.gz
             test -f $src && rm $src
    
             # 2. Rotate old backup
             for j in 7 6 5 4 3 2 1; do
                     k=$(($j+1))
                     src=/backup/$f.sql.$j.gz
                     dst=/backup/$f.sql.$k.gz
                     test -f $src && mv $src $dst
             done
    
             # 3. Backup & zip
             dst=/backup/$f.sql.1.gz
    
             /usr/bin/mysqldump -uroot -ppassword --databases $f | gzip > $dst
    done
    
    exit 0
    La primissima riga indica l'utilizzo della shell di sistema. Poi si controlla che sia presente e accessibile il programma mysqldump, necessario per il backup. gzip è montato su tutti i sistemi, per cui non è necessario fare il controllo.

    Nel ciclo for si assegna alla variabile f tutti i nomi dei database dopo in comando in. Il ciclo reale inizia da do e termina con done. Come prima operazione (per ogni database) si elimina l'eventuale ultimo file della serie (8). Così si fa spazio per spostare tutti i file più recenti per una posizione, nel ciclo successivo. Nel ciclo interno, che inizia con 7 e termina con 1, si spostano quindi i file più vecchi verso i più recenti per una posizione. Di conseguenza, un file che si chiama ad esempio mysql.sql.7.gz si chiamerà poi mysql.sql.8.gz e così via.

    Infine, si accede al database con un account globale, normalmente root, e si comprime al volo con gzip. Sotto Linux, questo metodo è molto efficiente e non richiede la generazione di file intermedi. Al termine di tutte le operazioni si esce dallo script con l'errore 0. Questo è necessario per evitare che il sistema generi un errore in script successivi o interrompe lo svolgimento di altri script da parte del chiamante.

    Salviamo e poi assegniamo il diritto di esecuzione:

    Codice:
    chmod 755 /etc/cron.d/mysql_backup
    A questo punto possiamo chiamarlo direttamente per fare una prova, e aggiungerlo successivamente nel file /etc/crontab per eseguirlo tutti i giorni alle ore 4.00 del mattino:

    Codice:
    0       4       *       *       *       root    /etc/cron.d/mysql_backup