Sincronizar valores de sequences com o subscriber na replicação lógica
PostgreSQLReplicação 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> -XO que faz
Como a replicação lógica não transporta valores de sequences (incluindo identity), isto lê o último valor de cada sequence no publisher e gera e aplica diretamente comandos setval que definem o mesmo valor no subscriber.
Quando usar
Na virada de um upgrade/migração via replicação lógica, logo antes de apontar a aplicação para o subscriber.
Atenção
Se executado enquanto o publisher ainda recebe gravações, os valores ficam desatualizados imediatamente e surgem erros de chave duplicada após a virada; execute após parar as gravações ou adicione uma margem de segurança. DDL também não é replicado: aplique as mudanças de schema (ALTER TABLE, novos índices) nos dois lados separadamente, primeiro no subscriber. pg_sequences retorna last_value NULL para sequences que você não pode ler; execute o comando como dono ou superusuário.
Relacionados
- Adicionar uma tabela a uma publication e atualizar a subscription (REFRESH PUBLICATION)
- Monitorar a replicação lógica (pg_stat_subscription, erros de apply, lag de slot)
- Resolver um conflito de replicação lógica (disable_on_error, SKIP)
- Remover uma subscription e limpar um slot lógico órfão no publisher