PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 06/12/2019 11:01:25

litroma
Membre

PIT Restore

Bonjour a tous,

Je suis nouveau ici et également très jeune dans le monde de PostgreSQL.

Je vous explique mon problème.

Je cherche a valider le fonctionnement des PIT (Point In Time) Restore dans PostgreSQL version 12.
Voila ce que j'ai mis en place:

Je n'ai pas d'autre serveur avec réplication ou autre, uniquement mon serveur "on va dire de prod" (c'est plutôt un test pour l'instant) smile
J'ai un tablespace avec la base dvdrental dedans.
Ce tablespace est stocké sous /mnt/dvdrental qui correspond à une lun iSCSI

[root@postgresql12 ~]# psql -U postgres -d dvd
psql (12.1)
Type "help" for help.

dvd=# \db+
                                     List of tablespaces
    Name    |  Owner   |    Location    | Access privileges | Options |  Size  | Description
------------+----------+----------------+-------------------+---------+--------+-------------
 dvdrental  | postgres | /mnt/dvdrental |                   |         | 16 MB  |
 pg_default | postgres |                |                   |         | 24 MB  |
 pg_global  | postgres |                |                   |         | 623 kB |
(3 rows)


dvd=# \l+
                                                                    List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description
-----------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 dvd       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 16 MB   | dvdrental  |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 8193 kB | pg_default | default administrative connection database
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 8049 kB | pg_default | unmodifiable empty database
           |          |          |             |             | postgres=CTc/postgres |         |            |
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 8049 kB | pg_default | default template for new databases
           |          |          |             |             | postgres=CTc/postgres |         |            |
(4 rows)

Localement (sur mon serveur postgresql) j'ai un montage (lun iSCSI) sous /mnt/WAL dans laquelle j'archive tous les WAL à chaque sauvegarde.
Mon fichier postgresql.conf est configuré de la sorte:

wal_level = replica 
archive_mode = on               
archive_command = 'test ! -f /mnt/WAL/%f && cp %p /mnt/WAL/%f'
archive_timeout = 60
restore_command = 'cp /mnt/WAL/%f %p'
recovery_target_inclusive = off

Mon répertoire de WAL n'a pas changé et se trouve par défaut sous /var/lib/pgsql/12/data/pg_wal

J'effectue des sauvegardes de la sorte:
pg_start_backup
puis effectue une copie sur la baie de disque qui héberge les LUN iSCSI
puis termine avec un pg_stop_backup

Si je restore complètement mon tablespace, aucun souci, je retrouve bien ma DB dvdrental telle qu'elle était au moment de la sauvegarde.

Mais, je souhaiterai pouvoir utiliser mes archives WAL pour effectuer un recovery jusqu'à un instant T
Pour cela, j'imagine restorer mon tablespace à l'instant T-10 jours par exemple
Puis indiquer à postgresql de rejouer les transactions des archives présentes sous /mnt/WAL

Déjà, pouvez-vous me confirmer que j'ai bien compris le principe des PIT restore?

Seulement, je rencontre toujours le problème suivant et n'arrive jamais a rejouer mes transactions.


Voila ce que je fais:

j'arrête mon serveur postgresql via systemctl stop postgresql-12.service
je demonte la lun où se trouve mon tablespace
je restore mon tablespace à l'instant T-10 (par exemple)
je remonte ma lun où se trouve mon tablespace


A ce moment-là, j'ai dans mon répertoire /var/lib/pgsql/12/data/pg_wal les WAL résultant de l'activité de la DB et ceux des sauvegardes.
La plupart du temps j'en au toujours plus que dans mes archives sous /mnt/WAL


Exemple de WAL présent dans /var/lib/pgsql/12/data/pg_wal

[root@postgresql12 data]# ll pg_wal
total 65540
-rw------- 1 postgres postgres 16777216 Dec  6 09:30 00000001000000000000002E
-rw------- 1 postgres postgres      361 Dec  6 09:30 00000001000000000000002E.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 09:30 00000001000000000000002F
-rw------- 1 postgres postgres 16777216 Dec  6 09:30 000000010000000000000030
-rw------- 1 postgres postgres 16777216 Dec  6 08:35 000000010000000000000031
drwx------ 2 postgres postgres      133 Dec  6 09:30 archive_status

Puis les WAL présent au même moment dans les archives sous /mnt/WAL

[root@postgresql12 data]# ll /mnt/WAL
total 606276
-rw------- 1 postgres postgres 16777216 Dec  5 17:34 00000001000000000000000B
-rw------- 1 postgres postgres 16777216 Dec  5 17:34 00000001000000000000000C
-rw------- 1 postgres postgres      358 Dec  5 17:34 00000001000000000000000C.00000060.backup
-rw------- 1 postgres postgres 16777216 Dec  5 17:39 00000001000000000000000D
-rw------- 1 postgres postgres 16777216 Dec  5 18:30 00000001000000000000000E
-rw------- 1 postgres postgres      358 Dec  5 18:30 00000001000000000000000E.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  5 18:35 00000001000000000000000F
-rw------- 1 postgres postgres 16777216 Dec  5 19:30 000000010000000000000010
-rw------- 1 postgres postgres      361 Dec  5 19:30 000000010000000000000010.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  5 19:35 000000010000000000000011
-rw------- 1 postgres postgres 16777216 Dec  5 20:30 000000010000000000000012
-rw------- 1 postgres postgres      361 Dec  5 20:30 000000010000000000000012.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  5 20:35 000000010000000000000013
-rw------- 1 postgres postgres 16777216 Dec  5 21:30 000000010000000000000014
-rw------- 1 postgres postgres      361 Dec  5 21:30 000000010000000000000014.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  5 21:35 000000010000000000000015
-rw------- 1 postgres postgres 16777216 Dec  5 22:30 000000010000000000000016
-rw------- 1 postgres postgres      361 Dec  5 22:30 000000010000000000000016.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  5 22:30 000000010000000000000017
-rw------- 1 postgres postgres 16777216 Dec  5 22:35 000000010000000000000018
-rw------- 1 postgres postgres 16777216 Dec  5 23:30 000000010000000000000019
-rw------- 1 postgres postgres      361 Dec  5 23:30 000000010000000000000019.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  5 23:35 00000001000000000000001A
-rw------- 1 postgres postgres 16777216 Dec  6 00:30 00000001000000000000001B
-rw------- 1 postgres postgres      361 Dec  6 00:30 00000001000000000000001B.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 00:30 00000001000000000000001C
-rw------- 1 postgres postgres 16777216 Dec  6 00:35 00000001000000000000001D
-rw------- 1 postgres postgres 16777216 Dec  6 01:30 00000001000000000000001E
-rw------- 1 postgres postgres      361 Dec  6 01:30 00000001000000000000001E.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 01:35 00000001000000000000001F
-rw------- 1 postgres postgres 16777216 Dec  6 02:30 000000010000000000000020
-rw------- 1 postgres postgres      361 Dec  6 02:30 000000010000000000000020.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 02:35 000000010000000000000021
-rw------- 1 postgres postgres 16777216 Dec  6 03:30 000000010000000000000022
-rw------- 1 postgres postgres      361 Dec  6 03:30 000000010000000000000022.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 03:35 000000010000000000000023
-rw------- 1 postgres postgres 16777216 Dec  6 04:30 000000010000000000000024
-rw------- 1 postgres postgres      361 Dec  6 04:30 000000010000000000000024.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 04:35 000000010000000000000025
-rw------- 1 postgres postgres 16777216 Dec  6 05:30 000000010000000000000026
-rw------- 1 postgres postgres      361 Dec  6 05:30 000000010000000000000026.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 05:35 000000010000000000000027
-rw------- 1 postgres postgres 16777216 Dec  6 06:30 000000010000000000000028
-rw------- 1 postgres postgres      361 Dec  6 06:30 000000010000000000000028.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 06:35 000000010000000000000029
-rw------- 1 postgres postgres 16777216 Dec  6 07:30 00000001000000000000002A
-rw------- 1 postgres postgres      361 Dec  6 07:30 00000001000000000000002A.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 07:35 00000001000000000000002B
-rw------- 1 postgres postgres 16777216 Dec  6 08:30 00000001000000000000002C
-rw------- 1 postgres postgres      361 Dec  6 08:30 00000001000000000000002C.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 08:35 00000001000000000000002D
-rw------- 1 postgres postgres 16777216 Dec  6 09:30 00000001000000000000002E
-rw------- 1 postgres postgres      361 Dec  6 09:30 00000001000000000000002E.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  6 09:30 00000001000000000000002F

Résultat, il y a toujours de WAL plus récent sous /var/lib/pgsql/12/data/pg_wal que sous /mnt/WAL
Mais, cela me semble normale, vu que le la commande archive_command n'est déclenchée que au moment du pg_stop_backup

Par contre, là où je ne comprends pas ce que je fais de mal, c'est si je veux déclencher un PIT restore.
Pour cela, je crée un fichier recovery.signal et positionne dans mon fichier postgresql.conf les champs suivants:

recovery_target_time = '2019-12-05 14:00:00 CET'

Puis je redémarre postgresql via systemctl start postgresql-12.service
Et voila ce que je constate dans les logs:

2019-12-06 09:53:07.084 CET [16660] LOG:  database system was shut down at 2019-12-06 09:49:08 CET
cp: cannot stat ‘/mnt/WAL/00000002.history’: No such file or directory
2019-12-06 09:53:07.090 CET [16660] LOG:  starting point-in-time recovery to 2019-12-06 04:00:00+01
cp: cannot stat ‘/mnt/WAL/000000010000000000000031’: No such file or directory
2019-12-06 09:53:07.100 CET [16660] LOG:  consistent recovery state reached at 0/310000A0
2019-12-06 09:53:07.100 CET [16660] LOG:  invalid record length at 0/310000A0: wanted 24, got 0
2019-12-06 09:53:07.100 CET [16660] LOG:  redo is not required
2019-12-06 09:53:07.101 CET [16656] LOG:  database system is ready to accept read only connections
cp: cannot stat ‘/mnt/WAL/000000010000000000000031’: No such file or directory
cp: cannot stat ‘/mnt/WAL/00000002.history’: No such file or directory
2019-12-06 09:53:07.116 CET [16660] LOG:  selected new timeline ID: 2
2019-12-06 09:53:07.186 CET [16660] LOG:  archive recovery complete
cp: cannot stat ‘/mnt/WAL/00000001.history’: No such file or directory
2019-12-06 09:53:07.207 CET [16656] LOG:  database system is ready to accept connections

Que dois-je faire pour que postgreSQL rejoue les logs jusqu'à l'instant T que je lui ai indiqué?
Est-ce que je dois vider le repertoire /var/lib/pgsql/12/data/pg_wal avant de redemarrer PostgreSQL?
Si c'est la cas je tombe toujours sur ce message d'erreur au moment de redemarrer PostgreSQL:

Job for postgresql-12.service failed because the control process exited with error code. See "systemctl status postgresql-12.service" and "journalctl -xe" for details.

Avec ceci dans les logs

2019-12-06 09:57:54.288 CET [16721] LOG:  database system was shut down at 2019-12-06 09:56:45 CET
cp: cannot stat ‘/mnt/WAL/00000003.history’: No such file or directory
2019-12-06 09:57:54.294 CET [16721] LOG:  starting point-in-time recovery to 2019-12-06 04:00:00+01
2019-12-06 09:57:54.299 CET [16721] LOG:  restored log file "00000002.history" from archive
cp: cannot stat ‘/mnt/WAL/000000020000000000000032’: No such file or directory
cp: cannot stat ‘/mnt/WAL/000000010000000000000032’: No such file or directory
2019-12-06 09:57:54.313 CET [16721] LOG:  invalid primary checkpoint record
2019-12-06 09:57:54.313 CET [16721] PANIC:  could not locate a valid checkpoint record
2019-12-06 09:57:54.313 CET [16718] LOG:  startup process (PID 16721) was terminated by signal 6: Aborted
2019-12-06 09:57:54.313 CET [16718] LOG:  aborting startup due to startup process failure
2019-12-06 09:57:54.316 CET [16718] LOG:  database system is shut down

Merci d'avance pour votre aide afin de m'expliquer ce que je fais mal ici?

Hors ligne

#2 06/12/2019 15:46:11

gleu
Administrateur

Re : PIT Restore

Déjà, pouvez-vous me confirmer que j'ai bien compris le principe des PIT restore?

Ça semble être ça, oui.

Exemple de WAL présent dans /var/lib/pgsql/12/data/pg_wal

Pour éviter tout problème, ce répertoire devrait être vide.

Résultat, il y a toujours de WAL plus récent sous /var/lib/pgsql/12/data/pg_wal que sous /mnt/WAL

Normal à condition qu'il n'y ait pas une trop grosse différence.

Mais, cela me semble normale, vu que le la commande archive_command n'est déclenchée que au moment du pg_stop_backup

Absolument faux. L'archivage se fait toujours au fil de l'eau.

Que dois-je faire pour que postgreSQL rejoue les logs jusqu'à l'instant T que je lui ai indiqué?

Déjà, il faudrait que la sauvegarde restaurée ne date pas d'après le point de restauration. Dans votre exemple, la sauvegarde date de "2019-12-06 04:00:00+01" et vous voulez le restaurer au "2019-12-05 14:00:00 CET". Ça ne peut pas fonctionner. Le PITR fonctionne en marche avant, pas en marche arrière.

Ensuite, vous indiquez restaurer votre tablespace. On est d'accord qu'en fait, vous restaurez l'instance complète ? c'est-à-dire le répertoire des données principal et tous les tablespaces utilisateurs ?

Est-ce que je dois vider le repertoire /var/lib/pgsql/12/data/pg_wal avant de redemarrer PostgreSQL?

Ce n'est pas obligatoire mais ça permet d'éviter des problèmes.


Guillaume.

Hors ligne

#3 06/12/2019 17:47:42

litroma
Membre

Re : PIT Restore

Merci Guillaume pour la réponse.

Mes captures d'écran ne sont pas bonnes en effet.
Je restaure bien la Lun contenant le répertoire ou se trouve le tablespace dvd:

dvd=# \db+
                                     List of tablespaces
    Name    |  Owner   |    Location    | Access privileges | Options |  Size  | Description
------------+----------+----------------+-------------------+---------+--------+-------------
 dvdrental  | postgres | /mnt/dvdrental |                   |         | 16 MB  |

Cette lun est bien monté sous /mnt/dvdrental
Et dans ce tablespace, il n'y a que la database dvdrental:

dvd=# \l+
                                                                    List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description
-----------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 dvd       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 16 MB   | dvdrental  |

Pour ce test, je n'ai pas d'autres databases sur mon serveur postgresql

Par contre, j'ai bien restauré la lun a une date antérieure à ma recovery_target_time (en l’occurrence la sauvegarde date du 5/12/2019 à 17h34)
Et ma recovery_target_time est bien dans le futur comme indiqué dans les logs:

019-12-06 09:53:07.090 CET [16660] LOG:  starting point-in-time recovery to 2019-12-06 04:00:00+01

Mais, pas comme je vous l'ai indiqué dans mon post et je m'excuse pour cette confusion.

Donc, je cherche bien à faire un PITR en marche avant, mais sans succès.

J'ai bien essayé de vider mon repertoire pg_wal avant de redemarrer en recovery PostgreSQL,
mais comme je vous l'ai indiqué, alors postgreSQL m'affiche systématiquement ce type de message d'erreur:

cp: cannot stat ‘/mnt/WAL/00000003.history’: No such file or directory
2019-12-06 09:57:54.294 CET [16721] LOG:  starting point-in-time recovery to 2019-12-06 04:00:00+01
2019-12-06 09:57:54.299 CET [16721] LOG:  restored log file "00000002.history" from archive
cp: cannot stat ‘/mnt/WAL/000000020000000000000032’: No such file or directory
cp: cannot stat ‘/mnt/WAL/000000010000000000000032’: No such file or directory
2019-12-06 09:57:54.313 CET [16721] LOG:  invalid primary checkpoint record
2019-12-06 09:57:54.313 CET [16721] PANIC:  could not locate a valid checkpoint record
2019-12-06 09:57:54.313 CET [16718] LOG:  startup process (PID 16721) was terminated by signal 6: Aborted
2019-12-06 09:57:54.313 CET [16718] LOG:  aborting startup due to startup process failure
2019-12-06 09:57:54.316 CET [16718] LOG:  database system is shut down

Soit principalement cette erreur PANIC:  could not locate a valid checkpoint record
Et une fois dans cette situation, ma seule façon de m'en sortir est d'executer un pg_resetwal sur mon datadir
Alors postgreSQL redemarre, mais sans aucune recovery et donc sans rejouer aucune transaction.

Vraiment, je ne comprends pas ce que fait de mal???

Merci d'avance pour votre aide.

Hors ligne

#4 06/12/2019 19:14:08

gleu
Administrateur

Re : PIT Restore

Soit principalement cette erreur PANIC:  could not locate a valid checkpoint record

Cette erreur indique qu'il n'arrive pas à trouver le premier journal de transactions dont il a besoin pour commencer la restauration. Donc la première question est "est-ce que le fichier /mnt/WAL/0000000?0000000000000032 existe ?"

Et une fois dans cette situation, ma seule façon de m'en sortir est d'executer un pg_resetwal sur mon datadir

pg_resetwal supprime les journaux de transactions et modifie le fichier pg_control pour qu'il ne lance pas de restauration. Autrement dit, dans le cas en question, vous corrompez votre serveur. pg_resetwal ne doit être utilisé qu'en dernier recours, et encore...

Alors postgreSQL redemarre, mais sans aucune recovery et donc sans rejouer aucune transaction.

Logique, pg_resetwal est fait pour ça.

Vraiment, je ne comprends pas ce que fait de mal???

Difficile pour nous de vous aider sans avoir toutes les étapes de la restauration (et je dirais même de la sauvegarde).


Guillaume.

Hors ligne

#5 09/12/2019 13:42:21

litroma
Membre

Re : PIT Restore

Bonjour,

Merci Guillaume pour les informations.
Voici ce que j'ai comme données concernant le backup.

Prenons le backup effectué ce matin à 8h30

Résultat du pg_start_backup:

(Mon Dec  9 08:30:37 2019) stdout: [ pg_start_backup
(Mon Dec  9 08:30:37 2019) -----------------
(Mon Dec  9 08:30:37 2019)  0/C1000028
(Mon Dec  9 08:30:37 2019) (1 row)]

Puis résultat du pg_stop_backup consécutif:

(Mon Dec  9 08:30:51 2019) stdout: [ pg_stop_backup
(Mon Dec  9 08:30:51 2019) ----------------
(Mon Dec  9 08:30:51 2019)  0/C2000088
(Mon Dec  9 08:30:51 2019) (1 row)]
(Mon Dec  9 08:30:51 2019) stderr: [psql: NOTICE:  all required WAL segments have been archived]

Donc, il semble que le pg_start_backup et pg_stop_backup ce sont bien passés et que les WAL correspondants ont bien été archivés

Maintenant à 12h19 je restore la lun contenant le tablespace dvd avec la database dvdrental avec la sauvegarde de 8h30
Je positionne une recovery_target_time à 10h00 aujourd'hui (donc bien dans le futur par rapport à ma sauvegarde)
Je vide mon pg_wal
Je ne touche pas à mon répertoire d'archive (/mnt/WAL)
Celui-ci contient alors les WAL suivants, entre autres:

-rw------- 1 postgres postgres 16777216 Dec  9 07:30 0000000200000000000000BF
-rw------- 1 postgres postgres      361 Dec  9 07:30 0000000200000000000000BF.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  9 07:35 0000000200000000000000C0
-rw------- 1 postgres postgres 16777216 Dec  9 08:30 0000000200000000000000C1
-rw------- 1 postgres postgres      361 Dec  9 08:30 0000000200000000000000C1.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  9 08:30 0000000200000000000000C2
-rw------- 1 postgres postgres 16777216 Dec  9 08:35 0000000200000000000000C3
-rw------- 1 postgres postgres 16777216 Dec  9 09:00 0000000200000000000000C4
-rw------- 1 postgres postgres 16777216 Dec  9 09:05 0000000200000000000000C5
-rw------- 1 postgres postgres 16777216 Dec  9 09:13 0000000200000000000000C6
-rw------- 1 postgres postgres 16777216 Dec  9 09:14 0000000200000000000000C7
-rw------- 1 postgres postgres 16777216 Dec  9 11:59 0000000300000000000000CF
-rw------- 1 postgres postgres 16777216 Dec  9 11:59 0000000300000000000000D0
-rw------- 1 postgres postgres      361 Dec  9 11:59 0000000300000000000000D0.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  9 12:03 0000000300000000000000D1
-rw------- 1 postgres postgres 16777216 Dec  9 12:04 0000000300000000000000D2
-rw------- 1 postgres postgres      328 Dec  9 12:04 0000000300000000000000D2.00000028.backup
-rw------- 1 postgres postgres 16777216 Dec  9 12:12 0000000300000000000000D3

Dès que je redemarre PostgreSQL j'obtien les messages suivants:

2019-12-09 12:19:35.866 CET [2244] LOG:  database system was shut down at 2019-12-09 12:12:01 CET
2019-12-09 12:19:35.867 CET [2244] LOG:  creating missing WAL directory "pg_wal/archive_status"
cp: cannot stat ‘/mnt/WAL/00000004.history’: No such file or directory
2019-12-09 12:19:35.873 CET [2244] LOG:  starting point-in-time recovery to 2019-12-09 10:00:00+01
cp: cannot stat ‘/mnt/WAL/00000003.history’: No such file or directory
cp: cannot stat ‘/mnt/WAL/0000000300000000000000D4’: No such file or directory
2019-12-09 12:19:35.884 CET [2244] LOG:  invalid primary checkpoint record
2019-12-09 12:19:35.884 CET [2244] PANIC:  could not locate a valid checkpoint record
2019-12-09 12:19:35.885 CET [2241] LOG:  startup process (PID 2244) was terminated by signal 6: Aborted
2019-12-09 12:19:35.885 CET [2241] LOG:  aborting startup due to startup process failure
2019-12-09 12:19:35.888 CET [2241] LOG:  database system is shut down
2019-12-09 12:21:08.859 CET [2303] LOG:  database system was shut down at 2019-12-09 12:21:01 CET
2019-12-09 12:21:08.871 CET [2300] LOG:  database system is ready to accept connections

Est-ce que les fichiers .history doivent se trouver également copiés dans mon répertoire d'archive (/mnt/WAL)?
Car ce n'est jamais le cas, pour moi.
Et pourquoi est-ce que PostgreSQL cherche le WAL référence ...D4 dans mes archives alors qu'il est postérieur à la recovery_target_time que je souhaite atteindre?
Pourquoi ne se content-il pas de d'utiliser les WAL jusqu'à la référence ...C7, qui correspond à la derniere archive avant ma recovery_target_time?

Vraiment je suis perdu sad

Merci d'avance pour votre aide

Dernière modification par litroma (09/12/2019 18:59:59)

Hors ligne

#6 09/12/2019 22:59:56

rjuju
Administrateur

Re : PIT Restore

À priori il manque des fichiers.

Comment effectuez-vous la sauvegarde exactement ?  Comment appelez-vous pg_start_backup, et avec quel(s) arguments ?  Quel est le contenu du répertoire de donnée après restauration ?


Au passage, votre archive_command est problèmatique.  En cas d'interruption durant l'archivage, vous perdrez des données.  En cas d'arrêt brutal, vous pouvez également perdre des données.  En cas d'utilisation de ces archive pour de la réplication, vous aurez également des problèmes.

Hors ligne

#7 10/12/2019 13:57:45

litroma
Membre

Re : PIT Restore

Bonjour Julien,


Merci pour votre réponse.


La sauvegarde en tant que telle est effectuée entre le pg_start_backup et le pg_stop_backup par la prise d'un snapshot, sur la baie de disque contenant la Lun avec les fichiers données de mon tablespace.


Et le pg_start_backup est exécuté très simplement avec comme argument un label correspondant au snapshot créé dans la baie de disque, exemple:

select pg_start_backup('RG_cluster_dvd_12-10-2019_11.31.38.4279');
exit code: [0]
(Tue Dec 10 11:31:48 2019) stdout: [ pg_start_backup
(Tue Dec 10 11:31:48 2019) -----------------
(Tue Dec 10 11:31:48 2019)  1/6000028
(Tue Dec 10 11:31:48 2019) (1 row)]

J'ai modifié mon select archive_command avec ceci:

archive_command = 'cp %p /mnt/WAL/%f'           # command to use to archive a logfile segment

Est-ce que cette nouvelle archive_command est plus satisfaisante pour vous?

Le répertoire de donnée contient les fichiers de mon tablespace, à savoir quelque chose comme cela:

[root@postgresql12 data]# ls /mnt/dvdrental/PG_12_201909212/16714/
112        14022_vm   14039      1418       16781      16842      16896  16922  2336      2604_fsm  2610      2617_vm   2657  2675  2693      2832      3079      3381      3467      3599      3607      4149  4165  6110
113        14024      14041      16738      16781_fsm  16842_fsm  16898  16923  2337      2605      2610_fsm  2618      2658  2678  2696      2833      3079_fsm  3394      3468      3600      3608      4150  4166  6111
1247       14026      14042      16740      16790      16846      16900  16924  2579      2605_fsm  2610_vm   2618_fsm  2659  2679  2699      2834      3079_vm   3394_fsm  3501      3600_fsm  3609      4151  4167  6112
1247_fsm   14027      14042_fsm  16740_fsm  16792      16848      16902  16925  2600      2605_vm   2611      2618_vm   2660  2680  2701      2835      3080      3394_vm   3502      3600_vm   3712      4152  4168  6113
1247_vm    14027_fsm  14042_vm   16749      16792_fsm  16848_fsm  16904  16926  2600_fsm  2606      2612      2619      2661  2681  2702      2836      3081      3395      3503      3601      3764      4153  4169  6117
1249       14027_vm   14044      16751      16797      16858      16906  16927  2600_vm   2606_fsm  2612_fsm  2619_fsm  2662  2682  2703      2837      3085      3429      3534      3601_fsm  3764_fsm  4154  4170  826
1249_fsm   14029      14046      16751_fsm  16799      16860      16908  16928  2601      2606_vm   2612_vm   2619_vm   2663  2683  2704      2838      3118      3430      3541      3601_vm   3764_vm   4155  4171  827
1249_vm    14031      14047      16756      16799_fsm  16866      16910  16929  2601_fsm  2607      2613      2620      2664  2684  2753      2838_fsm  3119      3431      3541_fsm  3602      3766      4156  4172  828
1255       14032      14047_fsm  16758      16804      16868      16912  16930  2601_vm   2607_fsm  2615      2620_fsm  2665  2685  2753_fsm  2838_vm   3164      3433      3541_vm   3602_fsm  3767      4157  4173  pg_filenode.map
1255_fsm   14032_fsm  14047_vm   16763      16806      16869      16914  16931  2602      2607_vm   2615_fsm  2650      2666  2686  2753_vm   2839      3256      3439      3542      3602_vm   3997      4158  4174  pg_internal.init
1255_vm    14032_vm   14049      16765      16821      16871      16916  16932  2602_fsm  2608      2615_vm   2651      2667  2687  2754      2840      3257      3440      3574      3603      4143      4159  5002  PG_VERSION
1259       14034      14051      16765_fsm  16823      16886      16917  174    2602_vm   2608_fsm  2616      2652      2668  2688  2755      2840_fsm  3258      3455      3575      3603_fsm  4144      4160  548
1259_fsm   14036      14052      16774      16823_fsm  16888      16918  175    2603      2608_vm   2616_fsm  2653      2669  2689  2756      2840_vm   3350      3456      3576      3603_vm   4145      4161  549
1259_vm    14037      14054      16776      16828      16890      16919  2187   2603_fsm  2609      2616_vm   2654      2670  2690  2757      2841      3351      3456_fsm  3596      3604      4146      4162  6102
14022      14037_fsm  14056      16777      16830      16892      16920  2224   2603_vm   2609_fsm  2617      2655      2673  2691  2830      2995      3379      3456_vm   3597      3605      4147      4163  6104
14022_fsm  14037_vm   1417       16777_fsm  16840      16894      16921  2328   2604      2609_vm   2617_fsm  2656      2674  2692  2831      2996      3380      3466      3598      3606      4148      4164  6106

J'ai vu sur dalibo.org, dans l'exemple sur la fonctionnalité PITR, qu'au moment du redémarrage en mode recovery le fichier <transaction_ID>.<checkpoint ID>.backup était lu.
Dans mon cas, aucun fichier .backup n'est lu d'après les logs.


A chaque fois, il cherche une archive WAL qui n'existe pas (toujours celle juste derrière la dernière présente donc mon répertoire d'archive):

2019-12-10 12:25:24.379 CET [11048] LOG:  database system was shut down at 2019-12-10 12:20:16 CET
cp: cannot stat ‘/mnt/WAL/00000004.history’: No such file or directory
2019-12-10 12:25:24.385 CET [11048] LOG:  starting point-in-time recovery to 2019-12-10 12:00:00+01
cp: cannot stat ‘/mnt/WAL/00000003.history’: No such file or directory
cp: cannot stat ‘/mnt/WAL/000000030000000100000023’: No such file or directory
2019-12-10 12:25:24.399 CET [11048] LOG:  invalid primary checkpoint record
2019-12-10 12:25:24.399 CET [11048] PANIC:  could not locate a valid checkpoint record
2019-12-10 12:25:24.400 CET [11045] LOG:  startup process (PID 11048) was terminated by signal 6: Aborted
2019-12-10 12:25:24.400 CET [11045] LOG:  aborting startup due to startup process failure
2019-12-10 12:25:24.403 CET [11045] LOG:  database system is shut down

Ici la 23
Alors que dans mes archives, je m'arrête à la 22:

[root@postgresql12 data]# ls -latr /mnt/WAL | tail -30
-rw-------  1 postgres postgres      358 Dec 10 11:32 000000030000000100000006.00000028.backup
-rw-------  1 postgres postgres 16777216 Dec 10 11:58 000000030000000100000007
-rw-------  1 postgres postgres 16777216 Dec 10 12:02 000000030000000100000008
-rw-------  1 postgres postgres 16777216 Dec 10 12:10 000000030000000100000009
-rw-------  1 postgres postgres 16777216 Dec 10 12:10 00000003000000010000000A
-rw-------  1 postgres postgres 16777216 Dec 10 12:10 00000003000000010000000B
-rw-------  1 postgres postgres 16777216 Dec 10 12:11 00000003000000010000000C
-rw-------  1 postgres postgres 16777216 Dec 10 12:11 00000003000000010000000D
-rw-------  1 postgres postgres 16777216 Dec 10 12:11 00000003000000010000000E
-rw-------  1 postgres postgres 16777216 Dec 10 12:11 00000003000000010000000F
-rw-------  1 postgres postgres 16777216 Dec 10 12:11 000000030000000100000010
-rw-------  1 postgres postgres 16777216 Dec 10 12:14 000000030000000100000011
-rw-------  1 postgres postgres 16777216 Dec 10 12:14 000000030000000100000012
-rw-------  1 postgres postgres 16777216 Dec 10 12:14 000000030000000100000013
-rw-------  1 postgres postgres 16777216 Dec 10 12:14 000000030000000100000014
-rw-------  1 postgres postgres 16777216 Dec 10 12:14 000000030000000100000015
-rw-------  1 postgres postgres 16777216 Dec 10 12:14 000000030000000100000016
-rw-------  1 postgres postgres 16777216 Dec 10 12:14 000000030000000100000017
-rw-------  1 postgres postgres 16777216 Dec 10 12:15 000000030000000100000018
-rw-------  1 postgres postgres 16777216 Dec 10 12:16 000000030000000100000019
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 00000003000000010000001A
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 00000003000000010000001B
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 00000003000000010000001C
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 00000003000000010000001D
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 00000003000000010000001E
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 00000003000000010000001F
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 000000030000000100000020
-rw-------  1 postgres postgres 16777216 Dec 10 12:19 000000030000000100000021
drwxr-xr-x  2 postgres postgres    16384 Dec 10 12:20 .
-rw-------  1 postgres postgres 16777216 Dec 10 12:20 000000030000000100000022

Toujours dans l'exemple sur dalibo.org, on voit bien le process de recovery, qui part du dernier WAL de backup puis rejoue chaque archive WAL jusqu'à la recovery_target choisie:

guillaume@laptop:~$ pg_ctl start
pg_ctl: another server might be running; trying to start server anyway
LOG:  database system was interrupted; last known up at 2008-07-13 16:38:17 CEST
LOG:  starting archive recovery
LOG:  restore_command = 'cp /tmp/pg_xlog_archives/%f %p'
cp: cannot stat `/tmp/pg_xlog_archives/00000001.history': No such file or directory
LOG:  restored log file "000000010000000000000008.004C5654.backup" from archive
LOG:  restored log file "000000010000000000000008" from archive
LOG:  automatic recovery in progress
server starting
LOG:  redo starts at 0/84C5654
LOG:  restored log file "000000010000000000000009" from archive
LOG:  restored log file "00000001000000000000000A" from archive
LOG:  restored log file "00000001000000000000000B" from archive
LOG:  restored log file "00000001000000000000000C" from archive
LOG:  restored log file "00000001000000000000000D" from archive
LOG:  restored log file "00000001000000000000000E" from archive
LOG:  restored log file "00000001000000000000000F" from archive
cp: cannot stat `/tmp/pg_xlog_archives/000000010000000000000010': No such file or directory
LOG:  could not open file "pg_xlog/000000010000000000000010" (log file 0, segment 16): No such file or directory
LOG:  redo done at 0/FB20BD4
LOG:  last completed transaction was at log time 2008-07-13 16:40:30.632653+02
LOG:  restored log file "00000001000000000000000F" from archive
cp: cannot stat `/tmp/pg_xlog_archives/00000002.history': No such file or directory
LOG:  selected new timeline ID: 2
cp: cannot stat `/tmp/pg_xlog_archives/00000001.history': No such file or directory
LOG:  archive recovery complete
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections

Je ne vois vraiment pas ce que je fais de mal, mais pourquoi dans mon cas PostgreSQL n'a pas le même comportement?
Est-ce parce que je fais un shutdown propre de PostgreSQL avant mon test de redémarrage ou bien cela n'a rien à voir?


Merci d'avance.

Hors ligne

#8 10/12/2019 16:00:13

rjuju
Administrateur

Re : PIT Restore

Le répertoire de donnée contient les fichiers de mon tablespace, à savoir quelque chose comme cela:

Il s'agit d'un tablespace, pas du répertoire de données principal.  Est-ce que vous sauvez également le répertoire principal de données ?


Est-ce que cette nouvelle archive_command est plus satisfaisante pour vous?

Non, la commande n'est pas atomique et ne garantit pas la durabilité du fichier archivé.

Hors ligne

#9 10/12/2019 16:03:24

gleu
Administrateur

Re : PIT Restore

La sauvegarde en tant que telle est effectuée entre le pg_start_backup et le pg_stop_backup par la prise d'un snapshot, sur la baie de disque contenant la Lun avec les fichiers données de mon tablespace.

S'il n'y a que ce tablespace, votre sauvegarde n'est pas bonne. La sauvegarde doit contenir tous les fichiers de PostgreSQL. Donc le répertoire /var/lib/pgsql/12/data et tous les tablespaces du serveur. J'ai bien l'impression que vous ne sauvegarder que le répertoire du tablespace de votre base.


Guillaume.

Hors ligne

#10 10/12/2019 16:22:31

litroma
Membre

Re : PIT Restore

C'est effectivement le cas, la LUN sauvegardée et restaurée (sous /mnt/dvdrental) ne contient que mon tablespace dvdrental

postgres=# \db+
                                     List of tablespaces
    Name    |  Owner   |    Location    | Access privileges | Options |  Size  | Description
------------+----------+----------------+-------------------+---------+--------+-------------
 dvdrental  | postgres | /mnt/dvdrental |                   |         | 16 MB  |
 pg_default | postgres |                |                   |         | 170 MB |
 pg_global  | postgres |                |                   |         | 623 kB |
(3 rows)

Je ne sauvegarde pas les autres tablespaces contenu dans /var/lib/pgsql/12/data


Mais, je vais ajouter cela rapidement à mes sauvegardes et refaire un test.
Je vous tient au courant.


Pour la archive_command je ne vois pas quoi d'autre utiliser pour archiver proprement mes WAL.
Avez-vous une idée?

Hors ligne

#11 10/12/2019 16:44:09

rjuju
Administrateur

Re : PIT Restore

Je vous conseille de consulter en priorité la documentation officielle concernant la sauvegarde.  Vous pouvez par exemple regarder https://www.postgresql.org/docs/current … iving.html.


Pour la archive_command je ne vois pas quoi d'autre utiliser pour archiver proprement mes WAL.

rsync permet de rendre la copie atomique.  Pour assurer la durabilité, malheureusement vous avez assez peu d'options.  À priori, à part utiliser un "sync" global il n'y a pas d'alternative.

Hors ligne

Pied de page des forums