Postgresql Backupstrategie

Admin

=Konfiguration=

archive_command = on archive_command = 'cp %p /Zielpfad/der/WALS-Dateien/%f'
 * Folgende Einträge in der postgresql.conf anpassen

mkdir -p /Zielpfad/der/WALS-Dateien
 * Erstelle den Ordner für die WALS

=Erstellung des Backup-Skripts=

PGDATA=/var/lib/pgsql/data WAL_ARCHIVE=/var/lib/pgsql/logs PGBACKUP=/var/lib/pgsql/backup PSQL=/usr/bin/psql today=`date +%Y%m%d-%H%M%S` label=base_backup_${today} date echo "Executing pg_start_backup with label $label in server ... " touch $WAL_ARCHIVE/tmp CP=`$PSQL -q -Upostgres -d template1 -c "SELECT pg_start_backup('$label');" -P tuples_only -P format=unaligned` RVAL=$? echo "Begin CheckPoint is $CP" if [ ${RVAL} -ne 0 ] then echo "PSQL pg_start_backup failed" exit 1; fi echo "pg_start_backup executed successfully" echo "TAR begins ... " pushd $PGBACKUP tar cfz pgdata-$today.tar.gz --exclude='pg_xlog' $PGDATA/* popd echo "TAR completed" echo "Executing pg_stop_backup in server ... " $PSQL -Upostgres template1 -c "SELECT pg_stop_backup;" if [ $? -ne 0 ] then echo "PSQL pg_stop_backup failed" exit 1; fi echo "pg_stop_backup done successfully" date TO_SEARCH="*${CP:0:2}000000${CP:3:2}.00${CP:5}" echo "Check for ${WAL_ARCHIVE}/${TO_SEARCH}.backup" REF_FILE="`echo ${WAL_ARCHIVE}/*${CP:0:2}000000${CP:3:2}`" echo "Reference file ${REF_FILE}" find ${WAL_ARCHIVE} -not -newer ${WAL_ARCHIVE}/tmp -type f -delete REF_FILE="`echo ${PGBACKUP}/pgdata-$today.tar.gz`" echo "Reference file ${REF_FILE}" find $PGBACKUP -not -newer ${REF_FILE} -not -name pgdata-$today.tar.gz -type f -name pgdata* -delete date
 * 1) !/bin/bash
 * 1) "-not -newer" or "\! -newer" will also return REF_FILE
 * 2) so you have to grep it out and use xargs; otherwise you
 * 3) could also use the -delete action

=HowTo: Datenbank wiederhestellen=

Wenn die Datenbank nicht sauber heruntergefahren wurde oder gar gecrashed ist, kann die Postgresql-datenbank in der Regel nicht mehr korrekt hochgefahren werden oder man muss zumindest mit Datenverlust rechnen.

Wiederherstellung der Datenbank

 * Entpacke das Backup

tar xfvz /var/lib/pgsql/backup


 * Kopiere die Log-Files vom alten Verzeichnis (pg_xlog) in das entpackte Backup.

cp /altesVerzeichnis/data/pg_xlog/0* /entpacktesBackup/data/


 * Erstelle eine Datei recovery.conf im Data-Verzeichnis

vi recovery.conf


 * mit folgendem Inhalt

restore_command = 'cp /var/lib/pgsql/logs/%f %p' recovery_target_time = '2008-11-25 18:08:06'


 * Datenbank starten

Wenn jetzt die Datenbank startet werden alle Logs seit dem Backup bis zum Zeitpunkt 2008-11-25 18:08:06 wieder eingespielt.

Die Datenbank ist wieder voll einsatzbereit.