Restore & PIT Recovery PostgreSQL DB
- aktuellen Stand der $PGDATA sichern
- Inhalt $PGDATA loeschen
- Backup zurückspielen
- Inhalt $PGDATA/pg_wal loeschen
- Gesicherte WAL Segmente nach $PGDATA/pg_wal kopieren
- file recovery.conf erstellen
- DB starten
- 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/
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();