web-dev-qa-db-fra.com

Le segment WAL demandé Postgres a déjà été supprimé (mais il est en fait dans le répertoire de l'esclave)

J'utilise repmgr comme mon outil de réplication. Sur l'esclave, je continue à obtenir une erreur:

le segment WAL demandé a déjà été supprimé

Quand je vérifie le maître en effet, ce n'est pas là; Cependant, c'est dans les annuaires de l'esclave à la fois en pg_xlogs et pg_xlogs/archive_status. Je ne comprends pas pourquoi il rechercherait ce fichier si c'est déjà dans l'esclave?

En fait, il a xlogs en passant devant le demandé. Les solutions dans que faire avec des fichiers wal pour la réinitialisation des esclaves Postgres sont pour un problème légèrement différent. Ils semblent être pour un scénario où le maître supprime un fichier journal avant que l'esclave ne reçoit. Dans mon cas, il est très présent sur l'esclave et plusieurs autres fichiers de la séquence après que celui-ci soit demandé.

Cela me dit également que je n'ai pas besoin d'augmenter l'option Gardez les segments Wal car il ne semblait pas tomber derrière?

2
sqwale

J'ai simplement pris un gamble et copié le dossier du maître qui manquait. Cela a fonctionné, je ne sais toujours pas ce qui a causé la question.

1
sqwale

De la réplication de streaming dans la documentation PostgreSQL:

Si vous utilisez une réplication en continu sans archivage continu de fichier basé sur un fichier, le serveur peut recycler les anciens segments WAL avant que la veille ne les a reçue. Si cela se produit, la veille devra être réinitialisée à partir d'une nouvelle sauvegarde de base. Vous pouvez éviter cela en définissant Wal_ekeeGments à une valeur suffisamment grande pour vous assurer que les segments WAL ne sont pas recyclés trop tôt ou en configurant une fente de réplication pour la veille. Si vous configurez une archive WAL qui est accessible depuis la veille, ces solutions ne sont pas nécessaires, car la veille peut toujours utiliser les archives pour rattraper à condition qu'il conserve suffisamment de segments.

Pour résoudre le problème, vous devez réinitialiser les données du serveur principal. Supprimer le répertoire de données sur esclave:

root@replica:~# su postgres
postgres@replica:~# mv /var/lib/postgresql/12/main /var/lib/postgresql/12/main_old

Copier toutes les données du serveur principal:

Sudo -u postgres pg_basebackup -h [PRIMARY_IP] -D /var/lib/postgresql/12/main -U replication -P -v

si la version est 12, créez le fichier veille.signal, sinon configurez Replica.conf:

touch /var/lib/postgresql/12/main/standby.signal

Configuration esclave:

listen_addresses = 'localhost,[IP_ADDRESS_OF_REPLIACA_ON_LAN]'              # what IP address(es) to listen on; 
max_connections = 100 # Ensure that this value is the same as the primary's
wal_level = 'replica'
archive_mode = on
archive_command = 'cd .'
primary_conninfo = 'Host=[PRIMARY_IP] port=5432 user=replication password=[REPLICATION PASSWORD]'
hot_standby = on

max_wal_senders = 48

Combien de temps dure la prise pg_basebackup? N'oubliez pas que les segments sont générés toutes les 5 minutes, donc si la sauvegarde prend une heure, vous avez besoin d'au moins 12 segments stockés. À 2 heures, vous avez besoin de 24, etc., je définirais la valeur d'environ 12,2 segments/heure de sauvegarde.

https://www.gab.lc/articles/postgresql-12-ReClication/

0
Sarvar Nishonboev