DBAtlas · Atlas de operaciones de bases de datos

Sincronizar los valores de las secuencias en el suscriptor en la replicación lógica

PostgreSQLReplicación lógica

Comando

# 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

Qué hace

Como la replicación lógica no transporta los valores de las secuencias (incluidas las identity), lee el último valor de cada secuencia en el publicador y genera y aplica directamente comandos setval que fijan el mismo valor en el suscriptor.

Cuándo usarlo

En el cambio final de un upgrade/migración mediante replicación lógica, justo antes de apuntar la aplicación al suscriptor.

Precaución

Si se ejecuta mientras el publicador sigue recibiendo escrituras, los valores quedan obsoletos de inmediato y tras el cambio aparecen errores de clave duplicada; ejecútelo después de detener las escrituras o añada un margen de seguridad. El DDL tampoco se replica: aplique los cambios de esquema (ALTER TABLE, índices nuevos) por separado en ambos lados, primero en el suscriptor. pg_sequences devuelve last_value NULL para las secuencias que no puede leer; ejecute el comando como propietario o como superusuario.

Abrir en DBAtlas →

Relacionado