PostgreSQL Recovery

Restore & PIT Recovery PostgreSQL DB

  1. aktuellen Stand der $PGDATA sichern
  2. Inhalt $PGDATA loeschen
  3. Backup zurückspielen
  4. Inhalt $PGDATA/pg_wal loeschen
  5. Gesicherte WAL Segmente nach $PGDATA/pg_wal kopieren
  6. file recovery.conf erstellen
  7. DB starten
  8. Troubleshoting

Environment:

$ echo $PGDATA
/u01/pgdata/11/risk
$ echo $PGBACKUP
/u99/pgbackup/11/risk

aktuellen Stand der $PGDATA sichern

wenn moeglich den aktuellen Stand der DB sicherstellen, bevor mit dem Restore gestartet wird. mindestens den Inhalt von $PGDATA/pg_wal sichern! So besteht die Chance ein vollstaendiges Recovery durchzuführen.

# backup
cd $PGDATA && tar cvJf ~/pgdata.txz .

# restore
cd $PGDATA
tar -xvJf ~/pgdata.txz

Das tar file kann per z,j oder J direkt (de)komprimiert werden.

        -z filter the archive through gzip 
        -j filter the archive through bzip2
        -J filter the archive through xz

siehe XZ Datacompression

Inhalt $PGDATA loeschen

cd $PGDATA && rm -rf *

Backup zurückspielen

cd $PGDATA
tar xJf $PGBACKUP/bckxxxxxxxx/base.tar.xz

Backup ist in /u99/pgbackup///bckxxxxx/base.tar.gz '/u99/pgbackup/10/baloise/bck1808240545/base.tar.gz' '/u99/pgbackup/10/baloise/bck1808240545/base.tar.xz'

tar -xpJf …
tar -xpzf … auf ownership und permissions achten

Inhalt $PGDATA/pg_wal loeschen

hier sind nur alte wal segmente aus dem backup welche nicht mehr benötigt werden

ls -l $PGDATA/pg_wal/*

Die alten logfiles werden für das Recovery nicht benötigt. Bei Bedarf koennnen sie aus dem vorab erstellten Backup wiederhergestellt werden.

ls -l $PGDATA/pg_log/*
ls -l $PGDATA/postmaster*

Gesicherte WAL Segmente nach $PGDATA/pg_wal kopieren

die sichergestellten wal segmente aus dem 1. step wiederherstellen

cd $PGDATA
tar -xvJf ~/pgdata.txz "*pg_wal" --strip-components=4

auch die beim fullbackup gesicherten WALs zurückspielen. [^muessen die WALs aus dem pg_basebackup restored werden?]

cd $PGDATA/pg_wal
tar xvJf $PGBACKUP/bckxxxxxxxx/pg_wal.tar.xz

file recovery.conf erstellen

offizielle doku hier

recovery.sh:

#
echo "restore_command = 'pxz --decompress < $PGBACKUP/archived_wal/%f.xz >  "%p"'" >> $PGDATA/recovery.conf
# echo "restore_command = 'cp $PGBACKUP/archived_wal/%f "%p"'" >> $PGDATA/recovery.conf
echo "recovery_target_time = '2018-10-20 16:30:00'" >> $PGDATA/recovery.conf
echo "recovery_target_action = 'promote'" >> $PGDATA/recovery.conf
cat $PGDATA/recovery.conf
#

Beispiel fuer $PGDATA/recovery.conf

restore_command = 'pxz --decompress /u99/pgbackup/11/risk/archived_wal/%f.xz --decompress -c >  %p'
recovery_target_time = '2018-10-20 16:30:00'
recovery_target_action = 'promote'

Wird recovery_target_action nicht angegeben, geht das recovery in den Pause Mode.

weitere Parameter

  • recovery_target_timeline = ‘latest’
  • recovery_target_xid = ‘’
  • recovery_target_name = ‘’
  • recovery_target_inclusive = ‘true’

DB starten

die db geht in den recovery mode und appliziert die archivierten wal’s. Wird der Prozess terminiert kann die db wieder gestartet werden und setzt das recovery fort. zum abschluss des recoverys wird die recovery.conf in recover.done umbenannt. unter umstaenden, muss die pg_hba.conf und postgresql.conf/postgresql.auto.conf auf den aktuellen stand gebracht werden.

Troubleshoting

select pg_wal_replay_resume();