Clonage local avec pgBackRest

      Pour ce scénario, nous allons supposer que nous disposons d'une sauvegarde pgBackRest 2.x dans un environnement PostgreSQL 11 sur Debian 10.
      Nous voulons cloner sur le même serveur le cluster apptra001 (port 5432) vers un cluster apptra002 (port 5433) :

-- utilisateur postgres, une activite existe dans une table temoin avec une ligne inseree par seconde \set AUTOCOMMIT on create schema postgres; CREATE SCHEMA create table temoin(col timestamp primary key); CREATE TABLE insert into temoin values(clock_timestamp()); INSERT 0 1 \watch 1 -- utilisateur root, creation d'un cluster dont nous aller garder la structure generale mais pas les donnees pg_createcluster -p 5433 --start-conf auto 11 apptra002 -- --data-checksums rm -fr /var/lib/postgresql/11/apptra002/* -- utilisateur postgres, le cluster d'origine a-t-il des tablespaces ? psql -p 5432 \db Liste des tablespaces Nom | Propriétaire | Emplacement ------------+--------------+---------------------------------- pg_default | postgres | pg_global | postgres | temp | postgres | /var/tmp/postgresql/11/apptra001 -- presence d'un tablespace "temp"... -- utilisateur postgres, restauration du cluster par PITR en indiquant la destination generale via db_path et l'emplacement du tablespace temp via tablespace_map select max(col) from temoin; max ---------------------------- 2019-07-29 15:01:42.491732 select pg_switch_wal(); pg_switch_wal --------------- 0/C00F0C8 mkdir -p /var/tmp/postgresql/11/apptra002 chmod 700 /var/tmp/postgresql/11/apptra002 pgbackrest --type=time "--target=2019-07-29 15:00:00" --log-level-console=info --stanza=apptra001 --db-path=/var/lib/postgresql/11/apptra002 --tablespace-map=temp=/var/tmp/postgresql/11/apptra002 restore -- utilisateur postgres, on regarde le contenu de recovery.conf cat /var/lib/postgresql/11/apptra002/recovery.conf restore_command = 'pgbackrest --log-level-console=info --pg1-path=/var/lib/postgresql/11/apptra002 --stanza=apptra001 archive-get %f "%p"' recovery_target_time = '2019-07-29 15:00:00' -- utilisateur postgres, suppression ou mise en commentaire de l'archivage des WAL depuis le cluster clone vers la stanza apptra001 (important !) vi /var/lib/postgresql/11/apptra002/postgresql.auto.conf #archive_mode='on' #archive_command = 'pgbackrest --stanza=apptra001 archive-push %p' #archive_timeout = 600 -- utilisateur root, demarrage du cluster pg_ctlcluster 11 apptra002 start -- utilisateur postgres, on regarde le fichier de log du cluster et on interroge la table temoin tail -50 /var/log/postgresql/postgresql-11-apptra002.log ... 2019-07-29 15:20:21.407 P00 INFO: found 00000001000000000000000A in the archive 2019-07-29 15:20:21.407 P00 INFO: archive-get command end: completed successfully (87ms) 2019-07-29 15:20:21.409 CEST [1875] LOG: restauration du journal de transactions « 00000001000000000000000A » à partir de l'archive 2019-07-29 15:20:21.745 P00 INFO: archive-get command begin 2.10: [00000001000000000000000B, pg_wal/RECOVERYXLOG] --log-level-console=info --pg1-path=/var/lib/postgresql/11/apptra002 --repo1-path=/var/lib/pgbackrest --stanza=apptra001 2019-07-29 15:20:21.831 P00 INFO: found 00000001000000000000000B in the archive 2019-07-29 15:20:21.832 P00 INFO: archive-get command end: completed successfully (87ms) 2019-07-29 15:20:21.833 CEST [1875] LOG: restauration du journal de transactions « 00000001000000000000000B » à partir de l'archive 2019-07-29 15:20:21.913 CEST [1875] LOG: arrêt de la restauration avant validation de la transaction 2140, 2019-07-29 15:00:00.244646+02 2019-07-29 15:20:21.913 CEST [1875] LOG: restauration en pause 2019-07-29 15:20:21.913 CEST [1875] ASTUCE : Exécuter pg_wal_replay_resume() pour continuer. -- utilisateur postgres, on interroge le cluster clone (parametres, tablespaces, table temoin) et on arrete la session de recover psql -p 5433 show all; ... archive_command | (disabled) | Sets the shell command that will be called to archive a WAL file. archive_mode | off | Allows archiving of WAL files using archive_command. archive_timeout | 0 | Forces a switch to the next WAL file if a new file has not been started within N seconds. ... \db Liste des tablespaces Nom | Propriétaire | Emplacement ------------+--------------+---------------------------------- pg_default | postgres | pg_global | postgres | temp | postgres | /var/tmp/postgresql/11/apptra002 select max(col) from temoin; max ---------------------------- 2019-07-29 14:59:59.242361 select pg_wal_replay_resume(); pg_wal_replay_resume ---------------------- (1 ligne) -- utilisateur root pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 11 apptra001 5432 online postgres /var/lib/postgresql/11/apptra001 /var/log/postgresql/postgresql-11-apptra001.log 11 apptra002 5433 online postgres /var/lib/postgresql/11/apptra002 /var/log/postgresql/postgresql-11-apptra002.log


      L'opération de clonage est assez simple puisqu'elle consiste essentiellement à faire un "pgbackrest restore" en indiquant par des options le ou les chemins de destination.
      Il serait ensuite possible de paramétrer l'archivage des WAL et la sauvegarde du cluster cloné apptra002 en lui créant une stanza.
      L'opération de clonage local, telle qu'elle est effectuée dans l'exemple, inclut des suppressions et peut donc être dangereuse. Il est préférable, lorsque c'est possible, de cloner vers un serveur distinct de celui du cluster d'origine.

Mise à jour : 29/07/2019