Postgresql - Procedura di backup remoto
Transcript
Postgresql - Procedura di backup remoto
Postgresql - Procedura di backup remoto Enrico Pirozzi - [email protected] 30 Mag 2006 Sommario cp rsync.exclude /etc/rsync.exclude In questo articolo andremo a realizzare una procedura di backup automatico di un server database postgresql, la procedura comprende, reindicizzazione del db, compattazione del db, e trasferimento in ambiente criptato del backup su un server di backup remoto. A questo punto disponiamo nel nostro sistema del comando . Procediamo ora alla creazione delle chiavi pubbliche e private con le quali fare il tunnel su cui passeranno le informazioni del nostro backup, eseguiamo 1 rsync su - postgres mkdir .ssh Strumenti Necessari mkdir .ssh se la directory .ssh non esiste; a questo punto andiamo a creare la coppia di chiavi pubblica e privata ricordandoci di dare quando viene visualizzata la richiesta di password, nell'esempio ne ho creata una a 1024 bits secondo l'algoritmo rsa. Per poter utilizzare questa procedura, ovviamente si deve aver bisogno di Postgresql installato e funzionante, ssh ed rsync. Il sistema una volta congurato penserà a fare in automatico ad intervalli predenti il dump di uno o più database ospitati dal server postgres, comprimerli con bzip2 ed inviarli via rsync ad un server di backup remoto attraverso un tunnel ssh. 2 invio ssh-keygen -t rsa -b 1024 Ora bisogna trasferire la parte pubblica della chiave sul server remoto di backup, ove avevamo installato anche qui preventivamente il servizio ssh. Installazione rsync Prima di procedere, e supponendo che sia- cd .ssh mo già tanto bravi da aver ricompilato e con- scp id_rsa.pub utente@ip_remoto: gurato l'ssh, andiamo a vedere come installaInseriamo la password ed il trasferimento re , con i permessi di root per eseguire il del le id_rs.pub avviene alla velocità della limake install scriviamo: nea dati che state utilizzando. A questo punto ci autentichiamo sul server di backup: tar xvfz rsync-x.x.x.tar.gz ./configure ssh -l utente@ip_remoto make e accodiamo la chiave pubblica appena make install trasferita sul le delle authorized_keys con touch rsync.exclude rsync 1 reindex table nometabella1; reindex table nometabella2; cat id_rsa.pub >> .ssh/authorized_keys Eettuiamo ora un logout e torniamo sul server di partenza ... come utente postgres e noteremo che con accederemo al serecho "Inizio Compressione e trasferimento" ver remoto senza bisogno di digitare alcuna password. # per db1 quello con postgresql installato ssh -l utente@ip_remoto 3 Script di backup pt="/home/postgres/dumps/db1" pt1="/home/postgres/dumps" echo "---------------------------------" dt=`date +"%Y%j%H%M"` echo "Inizio Backup : "+`date +"%D-%T"`; echo $dt echo "...copia backup db" echo $pt/dump-db1$dt /usr/local/pgsql/bin/pg_dump -f \ mv $pt/dump-db1 $pt/dump-db1$dt /home/postgres/dumps/db1/dump-db1 db1 bzip2 $pt/dump-db1$dt $pt1/bk-db1.sh /usr/local/pgsql/bin/pg_dump -f \ rm $pt/* /home/postgres/dumps/db2/dump-db2 db2 echo "...eseguita!!" # per db2 Questa parte eettua il backup dei pt="/home/postgres/dumps/db2" databases ospitati dal server pt1="/home/postgres/dumps" dt=`date +"%Y%j%H%M"` echo ".... Inizio compattazione db"; #/usr/local/pgsql/bin/vacuumdb -f -d db1 echo $dt #/usr/local/pgsql/bin/vacuumdb -f -d db2 echo $pt/dump-db2$dt mv $pt/dump-db2 $pt/dump-db2$dt echo "Fine compattazione"; bzip2 $pt/dump-db2$dt Qui si esegue il vacuum dei databases $pt1/bk-db2.sh rm $pt/* ospitati. echo ".... Inizio reindicizzazione db"; echo "Fine compressione e trasferimento" echo "Fine Backup : "+`date +"%D-%T"`; /usr/local/pgsql/bin/psql db1 -f \ echo "---------------------------------" /home/postgres/dumps/tablereindex.sql /usr/local/pgsql/bin/psql db1 -f \ /home/postgres/dumps/tablereindex.sql echo "Fine reindicizzazione"; In quest'ultima parte invece si creano i le compressi nel formato infatti la sequenza dell'anno-ora-minuti In questa sezione viene chiamato un le `date +"%Y%j%H%M"` esterno che poi andremo ad esaminare con il quale si eettua la reindicizzazione delle tabel- serve ad indicare: le contenute nei databases. il le altro non è • che una sequenza del tipo: %Y Anno 2 dump-db1-anno-giorno- • • • %j Numero del giorno dall'inizio dell'anno [0, ..., 365] %H Ora %M minuti echo backup db1-start #Per db1 /usr/local/bin/rsync --compress \ --verbose --rsh=ssh --times \ --owner --group --ignore-times \ --links --perms --recursive \ --size-only --delete --force --numeric-ids\ --exclude-from=/etc/rsync.exclude \ --stats /home/postgres/dumps/db1/ \ utente@ip\_remoto:/home/utente/dump-db1 In questo modo possiamo decidere poi tramite lo script rsync che andremo a realizzare se tenere lo storico di tutti i backups, oppure se tenere l'unitá di backup allineata secondo l'ultimo backup fatto. 4 Trasferimento su rsync del backup echo backup db1-end Una volta creato il le da trasferire all'interno della directory dumps dell'utente postgres andiamo ora a vedere come sia possibile trasferirlo tramite rsync sul server di backup remoto. Ancdiamo cioè ad esaminare come è fatto lo script : Con quest'ultimo script il backup avviene in modo speculare e ogni volta che viene avviato, sul server di backup si ha una copia speculare dei dati del server di provenienza, ovvero se sul server di partenza sono stati cancellati dei les rispetto all'ultima volta che era stato eseguito il backup, allora anche sul server di backup tali les saranno cancellati. Inne per far si che il sistema di backup sia avviabile anche da cron criamo un piccolo script di backup di nome ad esempio con le seguenti istruzioni: bk-db1.sh echo backup db1-start #Per db1 /usr/local/bin/rsync --compress \ mydump --verbose --rsh=ssh --times \ --owner --group --ignore-times \ --links --perms --recursive \ /home/postgres/dumps/dump \ --size-only --force --numeric-ids \ >> /home/postgres/dumps/dumps.logs --exclude-from=/etc/rsync.exclude \ --stats /home/postgres/dumps/db1/ \ utente@ip\_remoto:/home/utente/dump-db1 così facendo lo script mydump eettuerà il dump e accoderà le operazioni fatte al le di echo backup db1-end log. Ora come ultima cosa non resta che modicare la crontab e far ripartire il cron, nelIn questo modo creiamo un backup incrementale sul server remoto di backup, aggiun- l'esempio qui sotto il backup viene eettuato gendo e/o copiando solo i le modicati. Inve- tutte le notti all'una. ce se volessimo avere un backup incrementale * * * postgres vero e proprio dovremmo aggiungere l'opzione 00 1 /home/postgres/dumps/mydump delete ad rsync e cioè lo script diverrebbe: 3 5 Conclusioni In quest'articolo è stato riportato come esempio il dump di databases gestiti da postgres, è chiaro però che la trattazione di rsync prescinde da postgres e può essere applicata in qualsiasi situazione dove si necessiti di copie di backup su server remoto in ambiente sicuro. Questo documento è stato scritto in LATEX 2ε ed è disponibile su www.linuxtime.it/enricopirozzi 4