PostgreSQL

Vérifier l’état d’une réplication

Sur le serveur secondaire effectuer la commande suivante :

postgres=# SELECT
    status,
    receive_start_lsn,
    last_msg_receipt_time,
    (now() - last_msg_receipt_time) AS time_since_last_msg
FROM pg_stat_wal_receiver;

Elle doit retourner une valeur de ce type (STREAMING) :

  status   | receive_start_lsn |     last_msg_receipt_time     | time_since_last_msg
-----------+-------------------+-------------------------------+---------------------
 streaming | 2/E5000000        | 2025-11-09 17:59:30.684582+01 | 00:00:00.079362

On peut voir que la réplication est fonctionnelle, on peut aussi vérifier le dernier état de synchro (toujours sur le secondaire) :

postgres=# SELECT pg_last_xact_replay_timestamp();

Qui doit retourner une valeur de ce type :

 pg_last_xact_replay_timestamp
-------------------------------
2025-11-09 17:59:45.682362+01

Si la date indiquée n’est pas au plus proche de la date/heure du jour, il y a un problème.

Remonter une réplication cassée :

La réplication est cassée, on doit la remontée

Vérification de la réplication

Exemple d’erreur montrant une réplication cassée :

#### Erreur dans les logs
2025-11-09 17:52:15.790 CET [1287782] FATAL:  could not receive data from WAL stream: ERROR:  requested WAL segment 00000001000000010000000C has already been removed
2025-11-09 17:52:15.790 CET [524] LOG:  waiting for WAL to become available at 1/C002000

#### Réplication n'est plus fonctionnelle dans PGSQL
postgres=# SELECT
    status,
    receive_start_lsn,
    last_msg_receipt_time,
    (now() - last_msg_receipt_time) AS time_since_last_msg
FROM pg_stat_wal_receiver;
 status | receive_start_lsn | last_msg_receipt_time | time_since_last_msg
--------+-------------------+-----------------------+---------------------
(0 rows)

Procédure

On stop PGSQL sur le secondaire : systemctl stop postgresql@17-main

On supprime toutes les données sur le nœud secondaire :

sudo -u postgres rm -rf /var/lib/postgresql/17/main/*

On récupère un dump à jour depuis le master :

root@pgsql-02:~# sudo -u postgres pg_basebackup \
                 --host=192.168.5.241 \
                 --port=5432 \
                 --username=replication \
                 --password --progress \
                 --wal-method=stream \
                 --pgdata /var/lib/postgresql/17/main \
                 --write-recovery-conf
Password: ******
62705/62705 kB (100%), 1/1 tablespace

S’il n’y a pas eu d’eereur, on peut relancer PGSQL et vérifier la réplication : systemctl start potgresql@17-main


Last modified: Sun Nov 9 18:18:11 2025