Une situation piégeuse
La situation est la même que dans ce scenario de PITR, nous avons un environnement PostgreSQL 10 sur Debian 10 sauvegardé via Barman 2.x mais vous n'avez pas suivi mon conseil et vous ne disposez pas d'un backup au début de chaque timeline.
Nous voulons toujours réaliser un PITR au 18/02/2018 20:00:00 :
La timeline à considérer est la 3 mais nous ne disposons pas de backup de base dans cette timeline.
20180218T164738 a été réalisé dans la timeline 1 et 20180218T185648 dans la timeline 2.
La première idée est souvent d'utiliser le backup le plus récent antérieur au point de recover choisi. 20180218T185648 semble donc un choix naturel mais attention :
Les informations de journalisation doivent absolument être appliquées de manière séquentielle. Lors d'un recover, il est impossible de sauter des informations de journalisation ou de revenir en arrière par exemple.
La timeline 3 est issue d'un PITR effectué dans la timeline 1. Cela signifie que faire un PITR dans la timeline 3 implique d'utiliser un backup de la timeline 3 effectué avant le point de recover souhaité ou encore un backup de la timeline 1 effectué avant l'embranchement correspondant au PITR effectué le 18/02/2018 à 18h30.
Restaurer un backup de la timeline 2 puis effectuer un recover dans cette timeline nous conduirait à un cul-de-sac. Nous allons donc utiliser le backup effectué dans la timeline 1 :
Nous aurions pu nous tromper de backup de base à utiliser mais il y a un second piège à éviter. Barman ne permet pas de tout automatiser dans le cas d'un PITR à effectuer dans une timeline différente du backup de base. La commande "barman recover" accepte certes de positionner une timeline via --target-tli mais, en version 2.3, il est impossible de positionner 2 informations de targets alors que nous aurions ici besoin de --target-tli et --target-time.
Il faut par conséquent impérativement apporter l'information manquante "recovery_target_timeline" manuellement dans le fichier recovery.conf avant de relancer le cluster sous peine de suivre la timeline 1, de dépasser le point d'embranchement vers la timeline 3 et de ne pas obtenir le résultat souhaité.
Si le fichier recovery.conf est correctement renseigné alors PostgreSQL accomplit très bien ce que nous souhaitons. Il suit la timeline 1 jusqu'à l'embranchement vers la timeline 3 puis la timeline 3 jusqu'au point de recover.
La suite ne diffère pas de ce qui était indiqué dans ce scenario de PITR. Nous effectuons notamment une première sauvegarde dans la nouvelle timeline. PostgreSQL est bien capable dans une session de restauration de traverser les timelines mais cela ne veut pas dire que cela soit souhaitable. Il vaut mieux faire le plus simple possible lorsqu'il s'agit de restaurer.
Dernier point, le PITR a ici été effectué en supprimant le cluster initial et en réutilisant le même filesystem mais je conseille à nouveau fortement d'utiliser un serveur et un stockage différents lorsque c'est possible.