Sequence-Werte in der logischen Replikation zum Subscriber synchronisieren
PostgreSQLLogische ReplikationBefehl
# 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> -XWas es tut
Da logische Replikation keine Sequence-Werte (auch nicht für Identity) überträgt, liest dies den letzten Wert jeder Sequence auf dem Publisher und erzeugt setval-Befehle, die auf dem Subscriber denselben Wert setzen, und wendet sie direkt an.
Wann einsetzen
Bei der Umstellung eines Upgrades/einer Migration per logischer Replikation, unmittelbar bevor die Anwendung auf den Subscriber gerichtet wird.
Vorsicht
Wird es ausgeführt, während der Publisher noch Schreibvorgänge annimmt, sind die Werte sofort veraltet und nach der Umstellung folgen Fehler wegen doppelter Schlüssel; führe es nach dem Stoppen der Schreibvorgänge aus oder plane einen Sicherheitsabstand ein. Auch DDL wird nicht repliziert: Schemaänderungen (ALTER TABLE, neue Indizes) auf beiden Seiten separat anwenden, zuerst auf dem Subscriber. pg_sequences liefert last_value NULL für Sequences, die du nicht lesen darfst; führe den Befehl als Eigentümer oder Superuser aus.
Verwandte Einträge
- Tabelle zu einer Publication hinzufügen und Subscription aktualisieren (REFRESH PUBLICATION)
- Logische Replikation überwachen (pg_stat_subscription, Apply-Fehler, Slot-Lag)
- Konflikt in der logischen Replikation lösen (disable_on_error, SKIP)
- Subscription entfernen und verwaisten logischen Slot auf dem Publisher bereinigen