Sincronizar los valores de las secuencias en el suscriptor en la replicación lógica
PostgreSQLReplicación lógicaComando
# 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> -XQué 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.
Relacionado
- Añadir una tabla a una publicación y refrescar la suscripción (REFRESH PUBLICATION)
- Monitorear la replicación lógica (pg_stat_subscription, errores de apply, lag de slots)
- Resolver un conflicto de replicación lógica (disable_on_error, SKIP)
- Eliminar una suscripción y limpiar un slot lógico huérfano en el publicador