Blog

bruno @ 10/10/2008 17:07 - No comments yet

Mi è capitato di dover schedulare il backup settimanale su un server web LAMP (Linux + Apache + MySQL + PHP), di cui bisognava salvare il contenuto del database ed i file caricati in una directory tramite upload.

Ho pensato subito a cron, un demone (cioè un processo in background) che funge da agenda per mettere in coda dei comandi da eseguire a date ed orari prestabiliti.

Per modificare la lista dei comandi schedulati (detta crontab), c’è appunto il comando

$ crontab -e

Le voci vanno inserite una per riga, nel formato

minuti ore giorno_del_mese mese giorno_della_settimana comando

quindi, ad esempio, per eseguire lo shutdown della macchina ogni giorno all’una di notte, basterà scrivere nel crontab

0 1 * * * shutdown -h now

Torniamo al problema iniziale: archiviare una copia del database e della directory degli upload, una volta alla settimana (domenica a mezzanotte).

Per il database, utilizziamo mysqldump e gzip:

$ mysqldump --opt -uUSER -pPASSWORD DATABASE | \
gzip -9 > /backup/`date -I`_db.sql.gz

l’opzione

--opt

è un alias per tutte queste opzioni:

--add-drop-table --add-locks --create-options --disable-keys \
--extended-insert --lock-tables --quick --set-charset

utili per bloccare momentaneamente lo stato corrente del database e salvarlo integralmente senza metterne in pericolo la coerenza.

Il comando

`date -I`

restituisce una stringa con la data corrente, nel formato AAAA−MM−GG.

Per i file utilizziamo tar e gzip con qualche opzione simpatica:

$ tar cfPpz /backup/`date -I`_uploads.tar.gz /var/www/uploads
dove le opzioni meno conosciute sono:

-P inserisce i percorsi completi dei file nell’archivio (così da ripristinarli nella giusta directory)
-p preserva il proprietario e i permessi dei file archiviati

-z include la compressione con gzip
Mettiamo i comandi appena descritti in un bellissimo script bash (backup.sh):
#!/bin/bash
tar cfPpz ...
mysqldump ...
chmod 400 /backup/`date -I`_*.gz

e spostiamolo sotto la home dell’utente root (se non lo è già), dando tutti i permessi al solo proprietario (visto che ci sono le password scritte in chiaro):

# mv backup.sh /root
# chown root:root /root/backup.sh
# chmod 700 /root/backup.sh

(NB: ho utilizzato una shell di root, ma ovviamente su Ubuntu si deve utilizzare sudo per eseguire i comandi come super-user)

Infine modifichiamo il crontab dell’utente root :
# crontab -u root -e
0 0 * * 0 ~/backup.sh > /dev/null 2>&1

Ok, il backup verrà effettuato automaticamente ogni domenica a mezzanotte.

Qualora succedesse qualcosa di grave, per ripristinare un backup basterà eseguire:
# tar xfPpz /backup/DATA_uploads.tar.gz
# gunzip < /backup/DATA_db.sql.gz | mysql -uUSERNAME -pPASSWORD DATABASE

Si fa prima a farlo che a dirlo :)


1.0/5 Stars
  • Currently 1.0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Name


Email


Website


Add comment