Promotion d'un standby en primary
-
Sur le primary (si il est encore accessible):
rm /tmp/pg_master -
Sur le standby (future primary):
su - postgres /usr/lib/postgresql/16/bin/pg_ctl promote -D /var/lib/postgresql/16/main/ exit touch /tmp/pg_master
Créer un nouveau standby de zéro
-
Sur le serveur primary
# si le compte replication n'existe pas encore CREATE USER replication REPLICATION ENCRYPTED PASSWORD 'PASSWDREPLI'; select pg_create_physical_replication_slot('SLOT_NAME'); -
Sur le nouveau standby
systemctl stop postgresql rm -rf /var/lib/postgresql/16/main su - postgres time pg_basebackup -h IP_MASTER -D /var/lib/postgresql/16/main -d "dbname=postgres" -U replication -S SLOT_NAME -Fp -Xs -P -R -W exit systemctl start postgresql tail -f /var/log/postgresql/postgresql-16-main.log
Restaurer un backup avec barman
Restauration du dernier backup
-
Si le serveur restaurer est un slave penser à créer le replication slot, sur son primary
select pg_create_physical_replication_slot('SLOT_NAME'); -
Stopper le service postgresql sur le serveur où on restaure les données
systemctl stop postgresql -
Depuis le serveur barman, vérifier les backups disponible et lancer la restauration:
barman list-backup dev barman recover --standby-mode --remote-ssh-command="ssh postgres@10.255.255.254" dev 20211110T142908 /var/lib/postgresql/16/main/ # si le serveur n'est pas un standby retirer l'option --standby-mode -
Sur le serveur postgresql, supprimer le fichier recovery.conf et mettre à jour le fichier postgresql.auto.conf si besoin, puis relancer postgresql
rm /var/lib/postgresql/16/main/recovery.conf vim /var/lib/postgresql/16/main/postgresql.auto.conf systemctl start postgresql tail -f /var/log/postgresql/postgresql-16-main.log -
Si c'est un master faire la promotion
/usr/lib/postgresql/16/bin/pg_ctl promote -D /var/lib/postgresql/16/main/
PITR (Point In Time Recovery)
Si on veut restaurer un backup avec une date précise la procédure change un peu.
-
Stopper le service postgresql sur le serveur où on restaure les données
systemctl stop postgresql -
Depuis le serveur barman, vérifier les backups disponible et lancer la restauration avec l'option
target-time:barman list-backup dev barman recover --remote-ssh-command="ssh postgres@10.255.255.254" --target-time="2022-08-09 08:47:26+02:00" dev 20211110T142908 /var/lib/postgresql/16/main/ -
Copier depuis barman le dernier WAL partiel si les données sont récentes:
scp dev/streaming/0000000800000002000000F9.partial postgres@10.255.255.254:/var/lib/postgresql/16/main/barman_wal/0000000800000002000000F9 0000000800000002000000F9.partial -
Sur le serveur postgresql, vérifier le fichier postgresql.auto.conf, puis relancer postgresql
vim /var/lib/postgresql/16/main/postgresql.auto.conf systemctl start postgresql tail -f /var/log/postgresql/postgresql-16-main.log -
Vérifier que les données sont correctes en base, si oui il faut sortir le serveur du mode en lecture seule en lançant dans postgresql:
select pg_wal_replay_resume();