DBAtlas · Atlas d'exploitation des bases de données

Synchroniser les valeurs des séquences vers le subscriber en réplication logique

PostgreSQLRéplication logique

Commande

# 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> -X

Ce 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.

Ouvrir dans DBAtlas →

Voir aussi