martedì 29 maggio 2007

Backup incrementale con tar

Una funzionalità di tar non molto usata è quella degli archivi incrementali. E' invece una funzionalità che può risultare molto utile in alcune strategie di backup, quando, ad esempio, si esegue un ciclo di backup su base settimanale ma non si vuole o non si può fare un backup completo ogni giorno.
Supponiamo ad esempio di voler fare il backup della directory /home/documenti salvando l'archivio in /var/backup. Il comando da dare è:

tar zcvf /var/backup/documenti-`date +%s`.tgz --listed-incremental=/var/log/documenti.tarlog /home/documenti

Viene cioè creato un'archivio dal nome documenti-<data in formato unix>.tgz (per esempio: documenti-1180427502.tgz), che contiene tutto quello che c'è in /home/documenti. La scelta di aggiungere la data in formato unix è totalmente arbitraria e serve solo come promemoria. Può essere usata al suo posto la data in formato normale usando +%F al posto di +%s.
Viene inoltre creato un file di log (/var/log/documenti.tarlog) che servirà a tar nei successivi backup per capire cosa è cambiato in /home/documenti e cosa va quindi inserito nei successivi backup.
Nei successivi archivi creati con lo stesso comando verranno inseriti solo i file nuovi o modificati e verrà aggiornato il file di log.
Cancellando il file di log e rilanciando il comando viene ricreato un archivio completo. Tutti gli archivi creati, quelli completi e quelli incrementali, hanno il grosso vantaggio di poter essere trattati individualmente, cioè non c'è bisogno della presenza del file di log per poter estrarre i files e le directory in essi contenuti.



Nella pratica se la directory /var/backup viene salvata ogni notte dei giorni lavorativi su supporto esterno (tape, cd/dvd, nas etc.) un semplicissimo script /usr/local/bin/backup_documenti.sh che utilizzi la funzionalità incrementale di tar potrebbe essere scritto in questo modo:

#!/bin/sh
# Cancella i vecchi archivi presenti
rm /var/backup/documenti-*.tgz
# prepara il nuovo archivio, completo se il file di log
#non esiste, altrimenti incrementale
tar zcvf /var/backup/documenti-`date +%s`.tgz --listed-incremental=/var/log/documenti.tarlog /home/documenti


Lo scipt va lanciato tramite cron ogni giorno prima che il sistema di backup archivi la directory sul supporto esterno. Il primo giorno della settimana, prima che venga archiviata la directory dei documenti, sempre tramite cron, viene cancellato il file di log, in modo che il primo backup della settimana sia sempre completo.
Le righe da inserire in un crontab possono essere simili a queste:


#lunedì sera alle 21 cancello il file di log prima
#che cominci l'archiviazione
0 21 * * 1 rm -f /var/log/documenti.tarlog
# dal lunedì al venerdì alle 22 viene preparato
#il file archivio
0 22 * * 1-5 /usr/local/bin/backup_documenti.sh

6 commenti:

  1. Ciao Enrico ho provato il backup incrementale con tar ma il commando 'date +%s' non restituisce la data del sistema. Faccio presente che utulizzo Ubuntu Feisty 7.04. Grazie per la risposta. Ciao.

    RispondiElimina
  2. Ciao, devi usare l'apice inverso " ` " (alt gr + '), non l'apice normale " ' ".
    Per qualche semplice info in più sull'uso dell'apice inverso vai qua: http://www.pluto.it/files/journal/pj9903/linuxshells.html
    e cerca il paragrafo "Sostituzione dei comandi".

    RispondiElimina
  3. mi sfugge qualcosa probabilmente: se lo script per prima cosa cancella tutti i file .tgz, compreso il file di backup completo, e successivamente, nel caso esista il file di log, ne crea solo uno incrementale, se ci saranno problemi si avrà solo il file incrementale (incompleto) da ripristinare...dove sbaglio? Un'altra cosa: non c'è la possibilità di aggiornare un unico file tgz senza crearne altri incrementali? Grazie, Saluti.

    RispondiElimina
  4. grazie per la dritta del backup incrementale :-)

    RispondiElimina
  5. Bellissima questa pagina, però...
    io ho provato e riprovato e la procedura mi sembra mortale.
    quando cancello i file archivio vecchi, e poi lancio il backup incrementale mi ritrovo a salvare in un nuovo archivio i file che sono cambiati e avrò quindi perso i vecchi file.
    questo problema non si pone se i file archivio vecchi vengono spostati su nastri o dischi ecc, ma solo se vengono conservati a parte.
    altrimenti ti stai fregando da solo, no?
    probabilmente mi sfugge qualcosa...

    RispondiElimina
  6. ho fatto delle altre prove...
    confermo che ricreare da nuovo un archivio usando l'opzione c quano esiste il file di log ti ritrovi con un archivio che ha solo i file nuovi e che sovrascrive l'archivio precedente.
    allora uso l'opzione u invece di c che serve per upgradare l'archivio con l'incrementale e mi ritrovo che mi risponde che l'incrementale non è supportato sui file zippati, allora tolgo la z e magicamente tutto il discorso torna.
    l'archivio conserva tutti i file che subiscono modifiche ma in ordine di novità, per cui quando andrà a riscriverli li sovrascriverà tutti con l'ultimo e quindi ci ritroveremo i file aggiornati.

    RispondiElimina