Synchroniser les valeurs des séquences vers le subscriber en réplication logique
PostgreSQLRéplication logiqueCommande
# Generate the setval script on the publisher and apply it on the subscriber (at cutover, after writes are stopped):
psql -h <publisher_host> -d <db> -XAtc "SELECT format('SELECT setval(%L, %s, %s);', quote_ident(schemaname) || '.' || quote_ident(sequencename), COALESCE(last_value, start_value), (last_value IS NOT NULL)::text) FROM pg_sequences;" | psql -h <subscriber_host> -d <db> -XCe que fait la commande
Comme la réplication logique ne transporte pas les valeurs de séquences (identity compris), ceci lit la dernière valeur de chaque séquence sur le publisher, puis génère et applique directement les commandes setval qui fixent la même valeur sur le subscriber.
Quand l'utiliser
Lors de la bascule d'une mise à niveau/migration par réplication logique, juste avant de pointer l'application vers le subscriber.
Attention
Exécuté alors que le publisher reçoit encore des écritures, les valeurs sont immédiatement périmées et des erreurs de clé dupliquée suivent après la bascule ; exécutez-le après l'arrêt des écritures ou ajoutez une marge de sécurité. Le DDL n'est pas non plus répliqué : appliquez séparément les changements de schéma (ALTER TABLE, nouveaux index) des deux côtés, le subscriber en premier. pg_sequences renvoie un last_value NULL pour les séquences que vous ne pouvez pas lire ; exécutez la commande en tant que propriétaire ou superutilisateur.
Voir aussi
- Ajouter une table à une publication et rafraîchir la souscription (REFRESH PUBLICATION)
- Surveiller la réplication logique (pg_stat_subscription, erreurs d'apply, retard des slots)
- Résoudre un conflit de réplication logique (disable_on_error, SKIP)
- Supprimer une souscription et nettoyer un slot logique orphelin sur le publisher