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();