Utilisation de pgBackRest
(Optionnel)
NB : Ce TP a été mis à jour pour PostgreSQL 17. Adapter le numéro de
version dans les chemins au besoin.
Installer pgBackRest à partir des paquets du PGDG.
L’installation du paquet est triviale avec les paquets du PGDG :
# dnf install pgbackrest # Rocky Linux
# apt install pgbackrest # Debian/Ubuntu
En vous aidant de https://pgbackrest.org/user-guide.html#quickstart ,
configurer pgBackRest pour sauvegarder le serveur PostgreSQL en local
dans /var/lib/pgsql/backups
.
Le nom de la stanza sera instance_dev .
Ne conserver qu’une seule sauvegarde complète.
Le ficher de configuration de pgBackRest est
/etc/pgbackrest.conf
. Le modifier ainsi :
[global]
repo1-path = /var/lib/pgsql/backups
repo1-retention-full = 1
[instance_dev]
# chemin de l'instance PostgreSQL
pg1-path = /var/lib/pgsql/17/data
(Les chemins ci-dessus sont ceux par défaut des paquets RPM du PGDG.
Sous Debian/Ubuntu, les données sont dans
/var/lib/postgresql/17/main
. Adapter les autres chemins en
fonction.)
Configurer l’archivage des journaux de transactions de PostgreSQL
avec pgBackRest.
Le fichier de configuration de PostgreSQL doit être modifié au besoin
ainsi.
wal_level = replica
archive_mode = on
archive_command = 'pgbackrest --stanza=instance_dev archive-push %p'
Redémarrer PostgreSQL :
# systemctl restart postgresql-17
Initialiser le répertoire de stockage des sauvegardes et vérifier la
configuration de l’archivage.
Sous l’utilisateur postgres :
pgbackrest --stanza = instance_dev --log-level-console = info stanza-create
… P00 INFO: stanza-create command begin 2.54.1: --exec-id=116151-5ba090e6 --log-level-console=info --pg1-path=/var/lib/pgsql/17/data --repo1-path=/var/lib/pgsql/backups --stanza=instance_dev
… P00 INFO: stanza-create for stanza 'instance_dev' on repo1
… P00 INFO: stanza-create command end: completed successfully (56ms)
Vérifier la configuration de pgBackRest et de l’archivage :
pgbackrest --stanza = instance_dev --log-level-console = info check
pgBackRest force ainsi un archivage :
… P00 INFO: check command begin 2.54.1: --exec-id=116153-45ee6160 --log-level-console=info --pg1-path=/var/lib/pgsql/17/data --repo1-path=/var/lib/pgsql/backups --stanza=instance_dev
… P00 INFO: check repo1 configuration (primary)
… P00 INFO: check repo1 archive for WAL (primary)
… P00 INFO: WAL segment 0000000200000000000000D8 successfully archived to '/var/lib/pgsql/backups/archive/instance_dev/17-1/0000000200000000/0000000200000000000000D8-81ecb9751dd627ba196fca377e9e6d0a2aa6fd05.gz' on repo1
… P00 INFO: check command end: completed successfully (409ms)
Vérifier que l’archivage fonctionne en vérifiant que ce répertoire
n’est pas vide :
ls -alR /var/lib/pgsql/backups/archive/instance_dev/17-1/
On peut le vérifier aussi du côté PostgreSQL :
SELECT * FROM pg_stat_archiver \gx
-[ RECORD 1 ]------+------------------------------
archived_count | 4
last_archived_wal | 0000000200000000000000D8
last_archived_time | 2025-01-13 19:03:13.400874+01
failed_count | 0
last_failed_wal |
last_failed_time |
stats_reset | 2025-01-13 18:47:37.39799+01
Autre méthode, regarder le nom du processus archiver
,
qui contient le nom du dernier journal archivé :
$ ps faux|grep archiver
…
postgres 211745 0.0 0.1 502568 7124 ? Ss 14:14 0:00 \_ postgres: archiver last was 0000000200000000000000D8
Lancer une sauvegarde complète. Afficher les détails de cette
sauvegarde.
pgbackrest --stanza = instance_dev --type = full \
--log-level-console = info backup
Noter le soin avec lequel pgBackRest vérifie que l’archivage est
fonctionnel avant la sauvegarde, et l’attente du dernier journal avant
d’assurer que la sauvegarde est terminée :
… P00 INFO: backup command begin 2.54.1: --exec-id=116270-de7f5e35 --log-level-console=info --pg1-path=/var/lib/pgsql/17/data --repo1-path=/var/lib/pgsql/backups --repo1-retention-full=1 --stanza=instance_dev --type=full
… P00 INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes
… P00 INFO: backup start archive = 0000000200000000000000DC, lsn = 0/DC000028
… P00 INFO: check archive for prior segment 0000000200000000000000DB
…
…
… P00 INFO: execute non-exclusive backup stop and wait for all WAL segments to archive
… P00 INFO: backup stop archive = 0000000200000000000000DC, lsn = 0/DC000158
… P00 INFO: check archive for segment(s) 0000000200000000000000DC:0000000200000000000000DC
… P00 INFO: new backup label = 20250113-190921F
… P00 INFO: full backup size = 3.5GB, file total = 1594
… P00 INFO: backup command end: completed successfully (74648ms)
… P00 INFO: expire command begin 2.54.1: --exec-id=116270-de7f5e35 --log-level-console=info --repo1-path=/var/lib/pgsql/backups --repo1-retention-full=1 --stanza=instance_dev
… P00 INFO: repo1: expire full backup 20250113-190649F
… P00 INFO: repo1: remove expired backup 20250113-190649F
… P00 INFO: repo1: 17-1 remove archive, start = 0000000200000000000000D8, stop = 0000000200000000000000DB
… P00 INFO: expire command end: completed successfully (109ms)
Lister les sauvegardes :
pgbackrest --stanza = instance_dev info
stanza: instance_dev
status: ok
cipher: none
db (current)
wal archive min/max (17): 0000000200000000000000DC/0000000200000000000000DC
full backup: 20250113-190921F
timestamp start/stop: 2025-01-13 19:09:21+01 / 2025-01-13 19:10:35+01
wal start/stop: 0000000200000000000000DC / 0000000200000000000000DC
database size: 3.5GB, database backup size: 3.5GB
repo1: backup set size: 197.7MB, backup size: 197.7MB
Ajouter des données :
Ajouter une table avec 1 million de lignes.
Forcer la rotation du journal de transaction courant afin de s’assurer
que les dernières modifications sont archivées.
Vérifier que le journal concerné est bien dans les archives.
La table suivante fait 35 Mo, qui seront intégralement écrits dans
les journaux :
CREATE TABLE matable AS SELECT i FROM generate_series(1 ,1000000 ) i ;
Pour ce test, il est possible de forcer la rotation du journal avec
pg_switch_wal
. Dans la vie réelle, il y a de l’activité
dans la base et le journal sera assez vite archivé. Sans cela il
pourrait ne pas être sauvegardé.
pg_switch_wal
renvoie un LSN peu lisible, comme
0/E8000180
, où E8
correspond à la fin du nom
du journal. On peut ajouter pg_walfile_name()
pour voir
plus clairement le nom du journal à archiver :
SELECT pg_walfile_name ( pg_switch_wal() );
pg_walfile_name
--------------------------
0000000200000000000000E8
Vérifier que le journal concerné est bien dans le répertoire de
sauvegarde des archives de pgBackRest, soit dans notre exemple
/var/lib/pgsql/backups/archive/instance_dev/17-1/
. La copie
devrait être ici instantanée, mais en production ça ne ne l’est pas
forcément.
Simulation d’un incident : noter l’heure puis supprimer tout le
contenu de la table.
Noter l’heure exacte avant de détruire des données :
2025-01-13 19:21:22.043403+01
Restaurer les données telles que juste avant l’incident à l’aide de
pgBackRest.
Avant de redémarrer PostgreSQL, consulter les fichiers que pgBackRest a
créé ou modifié dans le PGDATA.
Redémarrer.
D’abord, stopper PostgreSQL (sinon pgBackRest refusera de toucher aux
données) :
sudo systemctl stop postgresql-17
En tant que postgres , lancer la commande de
restauration avec une heure juste avant la destruction des données :
pgbackrest --stanza = instance_dev --log-level-console = info \
--delta \
--type=time \
--target="2025-01-13 19:21:22" \
--target-exclusive \
--target-action=promote \
restore
Noter déjà le mode « delta » pour accélérer la restauration, et le
type de restauration time
avec une heure.
… P00 INFO: restore command begin 2.54.1: --delta --exec-id=116554-29ea7f39 --log-level-console=info --pg1-path=/var/lib/pgsql/17/data --repo1-path=/var/lib/pgsql/backups --stanza=instance_dev --target="2025-01-13 19:21:22" --target-action=promote --target-exclusive --type=time
… P00 INFO: repo1: restore backup set 20250113-190921F, recovery will start at 2025-01-13 19:09:21
… P00 INFO: remove invalid files/links/paths from '/var/lib/pgsql/17/data'
… P00 INFO: write updated /var/lib/pgsql/17/data/postgresql.auto.conf
… P00 INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
… P00 INFO: restore size = 3.5GB, file total = 1594
… P00 INFO: restore command end: completed successfully (4909ms)
La restauration du base backup est un succès, mais il va
falloir rejouer les journaux archivés.
pgBackRest a créé ou modifié ces fichiers :
$ ls -alrt /var/lib/pgsql/17/data
…
…
-rw-------. 1 postgres postgres 353 13 janv. 19:15 postgresql.auto.conf
-rw-------. 1 postgres postgres 0 13 janv. 19:15 recovery.signal
recovery.signal
signalera à PostgreSQL qu’il est en
mode restauration, et pas en redémarrage après un crash ;
postgresql.auto.conf
contient des paramètres qui vont
surcharger postgresql.conf
:
# Recovery settings generated by pgBackRest restore on 2025-01-13 19:15:22
restore_command = 'pgbackrest --stanza=instance_dev archive-get %f "%p"'
recovery_target_time = '2025-01-13 19:21:22'
recovery_target_inclusive = 'false'
recovery_target_action = 'promote'
On y trouve :
la restore_command
pour récupérer les journaux dans le
dépôt, commande que pgBackRest a préparé en fonction de sa configuration
et des paramètres de la ligne de commande de restauration ;
recovery_target_time
indique l’heure cible ;
recovery_target_inclusive = 'false'
arrête la
restauration juste avant cette heure pour ne pas rejouer la
destruction des données (le défaut est de rejouter jusqu’à l’heure cible
incluse) ;
recovery_target_action = 'promote'
demande à PostgreSQL
de s’ouvrir en écriture après le rejeu.
Démarrer PostgreSQL :
sudo systemctl start postgresql-17
Attendre la fin de la restauration dans les traces :
# Attention, le nom du fichier dépend du jour
tail -n100 /var/lib/pgsql/17/data/log/postgresql-Mon.log
2025-01-13 19:26:38.946 CET [116631] LOG: database system was interrupted; last known up at 2025-01-13 19:09:21 CET
2025-01-13 19:26:39.032 CET [116631] LOG: starting backup recovery with redo LSN 0/DC000028, checkpoint LSN 0/DC000080, on timeline ID 2
2025-01-13 19:26:39.108 CET [116631] LOG: restored log file "0000000200000000000000DC" from archive
2025-01-13 19:26:39.168 CET [116631] LOG: starting point-in-time recovery to 2025-01-13 19:21:22+01
2025-01-13 19:26:39.176 CET [116631] LOG: redo starts at 0/DC000028
2025-01-13 19:26:39.236 CET [116631] LOG: restored log file "0000000200000000000000DD" from archive
2025-01-13 19:26:39.298 CET [116631] LOG: completed backup recovery with redo LSN 0/DC000028 and end LSN 0/DC000158
2025-01-13 19:26:39.298 CET [116631] LOG: consistent recovery state reached at 0/DC000158
2025-01-13 19:26:39.298 CET [116626] LOG: database system is ready to accept read-only connections
2025-01-13 19:26:39.584 CET [116631] LOG: restored log file "0000000200000000000000DE" from archive
2025-01-13 19:26:39.893 CET [116631] LOG: restored log file "0000000200000000000000DF" from archive
2025-01-13 19:26:40.169 CET [116631] LOG: restored log file "0000000200000000000000E0" from archive
2025-01-13 19:26:40.458 CET [116631] LOG: restored log file "0000000200000000000000E1" from archive
2025-01-13 19:26:40.609 CET [116631] LOG: restored log file "0000000200000000000000E2" from archive
2025-01-13 19:26:40.758 CET [116631] LOG: restored log file "0000000200000000000000E3" from archive
2025-01-13 19:26:40.907 CET [116631] LOG: restored log file "0000000200000000000000E4" from archive
2025-01-13 19:26:41.029 CET [116631] LOG: restored log file "0000000200000000000000E5" from archive
2025-01-13 19:26:41.291 CET [116631] LOG: restored log file "0000000200000000000000E6" from archive
2025-01-13 19:26:41.592 CET [116631] LOG: restored log file "0000000200000000000000E7" from archive
2025-01-13 19:26:41.876 CET [116631] LOG: restored log file "0000000200000000000000E8" from archive
2025-01-13 19:26:42.238 CET [116631] LOG: restored log file "0000000200000000000000E9" from archive
2025-01-13 19:26:42.333 CET [116631] LOG: recovery stopping before commit of transaction 32096, time 2025-01-13 19:21:40.349582+01
2025-01-13 19:26:42.333 CET [116631] LOG: redo done at 0/E904E420 system usage: CPU: user: 1.18 s, system: 0.18 s, elapsed: 3.15 s
2025-01-13 19:26:42.333 CET [116631] LOG: last completed transaction was at log time 2025-01-13 19:20:51.370895+01
2025-01-13 19:26:42.403 CET [116631] LOG: restored log file "0000000200000000000000E9" from archive
2025-01-13 19:26:42.498 CET [116631] LOG: selected new timeline ID: 3
2025-01-13 19:26:42.612 CET [116631] LOG: archive recovery complete
2025-01-13 19:26:42.615 CET [116629] LOG: checkpoint starting: end-of-recovery immediate wait
2025-01-13 19:26:42.806 CET [116629] LOG: checkpoint complete: wrote 4490 buffers (27.4%); 0 WAL file(s) added, 0 removed, 13 recycled; write=0.040 s, sync=0.114 s, total=0.194 s; sync files=36, longest=0.102 s, average=0.004 s; distance=213304 kB, estimate=213304 kB; lsn=0/E904E420, redo lsn=0/E904E420
2025-01-13 19:26:42.814 CET [116626] LOG: database system is ready to accept connections
Vérifier les logs et la présence des données disparues.
La trace ci-dessus indique bien :
la restauration de divers journaux ;
l’arrivée au point de cohérence qui permet au moins d’avoir une
instance utilisable telle qu’à la fin du base backup
(consistent recovery state
) ;
le changement vers une nouvelle timeline
(selected new timeline ID: 3
), comme après toute
restauration ;
et l’heure de fin de la dernière transaction rejouée avec l’heure
demandée, avec
last completed transaction was at log time 2025-01-13 19:20:51.370895+01
.
Les lignes perdues sont bien revenues :
SELECT count (* ) FROM matable ;
Remarque :
Sans spécifier de --target-action=promote
, on
obtiendrait dans les traces de PostgreSQL, après restore :
LOG: recovery has paused
HINT: Execute pg_wal_replay_resume() to continue.
Utilisation de barman
(Optionnel)
Installer barman depuis les dépôts communautaires (la documentation
est sur https://www.pgbarman.org/documentation/ ).
Pré-requis : sous CentOS 7, le dépôt EPEL est
nécessaire à cause des dépendances python, s’il n’est pas déjà
installé :
# yum install epel-release
La commande suivante suffit pour installer l’outil et ses
dépendances.
# yum install barman # CentOS 7
# dnf install barman # Rocky Linux 8
Le paquet crée un utilisateur barman
qui exécutera la
sauvegarde et sera leur propriétaire. L’outil barman
sera à
exécuter uniquement avec cet utilisateur.
Configurer barman pour la sauvegarde du serveur via Streaming
Replication (pg_basebackup
et
pg_receivewal
).
/etc/barman.conf
doit contenir :
[barman]
barman_user = barman
configuration_files_directory = /etc/barman.d
barman_home = /var/lib/barman
log_file = /var/log/barman/barman.log
log_level = INFO
compression = gzip
immediate_checkpoint = true
path_prefix = "/usr/pgsql-14/bin"
Ce fichier indique que l’utilisateur système est l’utilisateur
barman
. Les sauvegardes et journaux de transactions
archivés seront placés dans /var/lib/barman
.
Puis, il faut créer un fichier par hôte (uniquement
localhost
ici) et le placer dans le répertoire pointé par
la variable configuration_files_directory
(/etc/barman.d
ici). On y indiquera les chaînes de
connexion PostgreSQL pour la maintenance ainsi que pour la
réplication.
Dans /etc/barman.d/
, créez un fichier nommé
localhost.conf
contenant ceci (vous pouvez repartir d’un
modèle existant dans ce répertoire) :
[localhost]
description = "Sauvegarde de localhost via Streaming Replication"
conninfo = host=localhost user=barman dbname=postgres
streaming_conninfo = host=localhost user=streaming_barman
backup_method = postgres
streaming_archiver = on
slot_name = barman
Il faut donc d’abord créer les utilisateurs qui serviront aux
connections :
postgres$ createuser --superuser --pwprompt barman
postgres$ createuser --replication --pwprompt streaming_barman
Ensuite, il faut s’assurer que ces utilisateurs puissent se connecter
sur l’instance PostgreSQL, en modifiantpg_hba.conf
et
peut-être postgresql.conf
.
local all barman md5
host all barman 127.0.0.1/32 md5
host all barman ::1/128 md5
local replication streaming_barman md5
host replication streaming_barman 127.0.0.1/32 md5
host replication streaming_barman ::1/128 md5
Recharger la configuration (voire redémarrer PostgreSQL si
nécessaire).
Configurer les droits du fichier ~/.pgpass
de
l’utilisateur système barman et ses droits d’accès
comme suit :
barman$ chmod 600 ~/.pgpass
barman$ cat ~/.pgpass
*:*:*:barman:barmanpwd
*:*:*:streaming_barman:barmanpwd
Vérifier maintenant que les utilisateurs peuvent bien se
connecter :
barman$ psql -c 'SELECT version()' -U barman -h localhost postgres
version
------------------------------------------------------------------------
PostgreSQL 14.1 on x86_64-pc-linux-gnu, compiled by gcc ( GCC ) 4.8.5 ...
barman$ psql -U streaming_barman -h localhost -c "IDENTIFY_SYSTEM" replication=1
systemid | timeline | xlogpos | dbname
---------------------+----------+-----------+--------
6769169214324921667 | 1 | 0/169E438 |
Afin d’éviter que le serveur principal ne recycle les journaux que
nous souhaitons archiver via le protocole de réplication (et
pg_receivewal
), créer le slot de réplication mentionné dans
le fichier de configuration localhost.conf
:
barman$ barman receive-wal --create-slot localhost
Creating physical replication slot 'barman' on server 'localhost'
Replication slot 'barman' created
Vérifier que l’archivage fonctionne et que la configuration de barman
est correcte.
Après 1 minute (laissant à la tâche cron le soin de démarrer les
processus adéquats), vérifier que l’archivage fonctionne :
$ ps -ef | grep streaming_barman
barman 10248 10244 0 14:55 ? 00:00:00 /usr/pgsql-14/bin/pg_receivewal
--dbname=dbname=replication host=localhost
options = -cdatestyle=iso replication = true user = streaming_barman
application_name = barman_receive_wal
--verbose --no-loop --no-password
--directory=/var/lib/barman/localhost/streaming --slot = barman
postgres 10249 9575 0 14:55 ? 00:00:00 postgres: walsender
streaming_barman ::1( 49182 ) streaming 0/169E438
On constate bien ici les 2 processus pg_receivewal
ainsi
que walsender
.
On peut également forcer la génération d’une nouvelle archive :
barman$ barman switch-wal localhost --force --archive
The WAL file 000000010000000000000001 has been closed on server 'localhost'
Waiting for the WAL file 000000010000000000000001 from server 'localhost'
Processing xlog segments from streaming for localhost
000000010000000000000001
Vérifier que la configuration de barman est correcte avec la commande
suivante :
barman$ barman check localhost
Server localhost:
PostgreSQL: OK
is_superuser: OK
PostgreSQL streaming: OK
wal_level: OK
replication slot: OK
directories: OK
retention policy settings: OK
backup maximum age: OK ( no last_backup_maximum_age provided)
compression settings: OK
failed backups: OK ( there are 0 failed backups)
minimum redundancy requirements: OK ( have 0 backups, expected at least 0)
pg_basebackup: OK
pg_basebackup compatible: OK
pg_basebackup supports tablespaces mapping: OK
systemid coherence: OK ( no system Id stored on disk)
pg_receivexlog: OK
pg_receivexlog compatible: OK
receive-wal running: OK
archiver errors: OK
Faire une sauvegarde.
barman$ barman backup localhost --wait
Starting backup using postgres method for server localhost in
/var/lib/barman/localhost/base/20211111T153507
Backup start at LSN: 0/40000C8 ( 000000010000000000000004, 000000C8)
Starting backup copy via pg_basebackup for 20211111T153507
Copy done ( time: 1 second)
Finalising the backup.
This is the first backup for server localhost
WAL segments preceding the current backup have been found:
000000010000000000000003 from server localhost has been removed
Backup size: 24.2 MiB
Backup end at LSN: 0/6000000 ( 000000010000000000000005, 00000000)
Backup completed ( start time: 2021-11-11 15:35:07.610047, elapsed time: 2 seconds)
Waiting for the WAL file 000000010000000000000005 from server 'localhost'
Processing xlog segments from streaming for localhost
000000010000000000000004
Processing xlog segments from streaming for localhost
000000010000000000000005
Ajouter des données :
Ajouter une table avec 1 million de lignes.
Forcer la rotation du journal de transaction courant afin de s’assurer
que les dernières modifications sont archivées.
CREATE TABLE matable AS SELECT i FROM generate_series(1 ,1000000 ) i;
Forcer la rotation du journal :
Vérifier que le journal concerné est bien dans les archives.
Le processus pg_receivewal
récupère en flux continu les
journaux de transactions de l’instance principale dans un fichier
.partial
, présent dans le répertoire
<barman_home>/<instance>/streaming
.
Lors d’une rotation de journal, le fichier est déplacé de façon
asynchrone dans le répertoire correspondant au segment auquel il
appartient.
barman$ find /var/lib/barman/localhost/{streaming , wals} -type f
/var/lib/barman/localhost/streaming/00000001000000000000000A.partial
/var/lib/barman/localhost/wals/xlog.db
/var/lib/barman/localhost/wals/0000000100000000/000000010000000000000003
/var/lib/barman/localhost/wals/0000000100000000/000000010000000000000004
/var/lib/barman/localhost/wals/0000000100000000/000000010000000000000005
/var/lib/barman/localhost/wals/0000000100000000/000000010000000000000006
/var/lib/barman/localhost/wals/0000000100000000/000000010000000000000007
/var/lib/barman/localhost/wals/0000000100000000/000000010000000000000008
/var/lib/barman/localhost/wals/0000000100000000/000000010000000000000009
Lister les sauvegardes.
barman$ barman list-backup localhost
localhost 20211111T153507 - Wed Nov 11 15:35:09 2021 - Size: 24.2 MiB -
WAL Size: 12.5 MiB
Afficher les informations sur la sauvegarde.
barman$ barman show-backup localhost 20211111T153507
Backup 20211111T153507:
Server Name : localhost
System Id : 6769169214324921667
Status : DONE
PostgreSQL Version : 140001
PGDATA directory : /var/lib/pgsql/14/data
Base backup information:
Disk usage : 24.2 MiB ( 24.2 MiB with WALs)
Incremental size : 24.2 MiB ( -0.00% )
Timeline : 1
Begin WAL : 000000010000000000000005
End WAL : 000000010000000000000005
WAL number : 1
WAL compression ratio: 99.90%
Begin time : 2021-11-11 15:35:08+01:00
End time : 2021-11-11 15:35:09.509201+01:00
Copy time : 1 second
Estimated throughput : 12.8 MiB/s
Begin Offset : 40
End Offset : 0
Begin LSN : 0/5000028
End LSN : 0/6000000
WAL information:
No of files : 4
Disk usage : 12.5 MiB
WAL rate : 266.82/hour
Compression ratio : 80.42%
Last available : 000000010000000000000009
Catalog information:
Retention Policy : not enforced
Previous Backup : - ( this is the oldest base backup)
Next Backup : - ( this is the latest base backup)
Simulation d’un incident : supprimer tout le contenu de la table.
Restaurer les données avant l’incident à l’aide de barman.
Arrêter l’instance PostgreSQL. Pour le TP, on peut renommer le PGDATA
mais il n’est pas nécessaire de le supprimer vous-même.
Il faut savoir que --remote-ssh-command
est nécessaire,
sinon barman tentera de restaurer un PGDATA sur son serveur et avec ses
droits.
Pour éviter de devoir configurer la connexion SSH, nous pouvons
autoriser l’utilisateur système barman
à faire des
modifications dans le répertoire /var/lib/pgsql/14
. Par
exemple :
# chmod 777 /var/lib/pgsql/
# chmod 777 /var/lib/pgsql/14
Lancer la commande de restauration en tant que
barman :
barman$ barman recover \
--target-time "20211111 15:40:00" \
--target-action "promote" \
localhost 20211111T153507 /var/lib/pgsql/14/data
Starting local restore for server localhost using backup 20211111T153507
Destination directory: /var/lib/pgsql/14/data
Doing PITR. Recovery target time: '2021-11-11 15:40:00+01:00'
Copying the base backup.
Copying required WAL segments.
Generating recovery configuration
Identify dangerous settings in destination directory.
Recovery completed ( start time: 2021-11-11 15:59:13.697531, elapsed time: 1 second)
Your PostgreSQL server has been successfully prepared for recovery!
Rétablir les droits sur le répertoire nouvellement créé par barman
:
# chown -R postgres: /var/lib/pgsql/14/data
Démarrer PostgreSQL.
Vérifier les logs et la présence de la table disparue.
$ cat /var/lib/pgsql/14/data/log/postgresql-Wed.log
[…]
2021-11-11 16:01:21.699 CET [ 28525 ] LOG: redo done at 0/9D49D68
2021-11-11 16:01:21.699 CET [ 28525 ] LOG: last completed transaction was
at log time 2021-11-11 15:36:08.184735+01
2021-11-11 16:01:21.711 CET [ 28525 ] LOG: restored log file
"000000010000000000000009" from archive
2021-11-11 16:01:21.777 CET [ 28525 ] LOG: selected new timeline ID: 2
2021-11-11 16:01:21.855 CET [ 28525 ] LOG: archive recovery complete
2021-11-11 16:01:22.043 CET [ 28522 ] LOG: database system is ready to
accept connections
SELECT count (* ) FROM matable ;
Avant de passer à la suite de la formation, pour stopper les
commandes démarrées par barman cron
:
barman$ barman receive-wal --stop localhost
Il est possible de vérifier la liste des serveurs sur lesquels
appliquer cette modification à l’aide de la commande
barman list-server
.
Pour désactiver totalement barman :
$ mv /etc/barman.d/localhost.conf /etc/barman.d/localhost.conf.old
$ sudo -iu barman barman cron