DBAtlas · Atlas de operações de banco de dados

Sincronizar valores de sequences com o subscriber na replicação lógica

PostgreSQLReplicação 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

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

Abrir no DBAtlas →

Relacionados