DBAtlas · Atlas für Datenbankbetrieb

Sequence-Werte in der logischen Replikation zum Subscriber synchronisieren

PostgreSQLLogische Replikation

Befehl

# 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

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

In DBAtlas öffnen →

Verwandte Einträge