Inutile de compliquer les choses
Avec PostgreSQL, les informations de journalisation correspondant aux transactions sont enregistrées dans des fichiers WAL (write ahead log). Ces WAL sont produits et archivés au fil du temps et appartiennent donc à une timeline, une ligne de temps.
La séquence de WAL pourrait se poursuivre indéfiniment dans la même timeline mais il est parfois nécessaire de faire revenir le cluster en arrière pour annuler des transactions erronées ou encore une corruption. La restauration est alors un PITR (point in time recovery).
Après un PITR, une nouvelle timeline (incarnation dans le vocabulaire Oracle Database) est créée.
Les timelines sont souvent décrites avec du vocabulaire de science-fiction. J'aime beaucoup le Maître des Montagnes ou la Fin de l'Eternité mais nous allons ici simplifier les choses. Il est en effet douteux que vous vous intéressiez aux paradoxes spatio-temporels en situation de crise.
Pour UN cluster donné, chaque transaction a été validée à UN timestamp et enregistrée dans UN fichier WAL qui appartient à UNE timeline. Une timeline peut ainsi être vue comme un ensemble de fichiers WAL produits dans un intervalle de temps. Il n'y aucun chevauchement possible.
Les PITR non planifiés sont la plupart du temps effectués en fonction d'un timestamp et avoir plusieurs timelines ne complique pas les choses. Si vous avez suivi le conseil que je donne dans cette page consacrée au PITR alors vous disposez d'au moins un backup de base effectué au début de chaque timeline avant toute activité transactionnelle significative.
Nous allons supposer que nous disposons d'une sauvegarde Barman 2.x distante pour notre environnement PostgreSQL 10 sur Debian 10 et que voulons réaliser un PITR au 18/02/2018 20:00:00 :
Notre "ls" n'est pas très précis , d'autant plus que les fichiers WAL ne sont pas archivés instantanément dans Barman, mais c'est suffisant pour affirmer que la timeline à considérer n'est pas la timeline courante, 5, mais la 3. Le dossier correspondant à la timeline 3 comprend des fichiers WAL produits entre le 18/02/2018 19:20 et le 18/02/2018 20:10.
Le backup à considérer est ici 20180218T192046 effectué au cours de la timeline 3 comme le confirment un barman show-backup ou un barman diagnose.
A présent place au PITR :
L'existence de plusieurs timelines n'a pas changé la manière d'effectuer notre PITR qui a donné le résultat escompté. En situation réelle, je conseille d'effectuer le PITR vers un serveur et un stockage différents de ceux du cluster de production afin d'éviter le suraccident, d'effectuer des comparaisons etc.
Le recover opère par défaut sur la timeline dans laquelle a été effectuée le backup de base. C'est pourquoi je recommande d'effectuer un premier backup au début de chaque timeline. PostgreSQL est capable de traverser les timelines comme Oracle Database est capable depuis la version 10g de traverser les incarnations donc il serait malgré tout possible de s'en passer, cela fait l'objet de cette page.