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