Noções Básicas de Replicação Lógica
A replicação lógica decodifica o WAL em alterações em nível de linha e as aplica em um assinante. Diferente do streaming físico, ela pode replicar tabelas selecionadas entre bancos de dados ou versões principais.
Receita
Publicador no PostgreSQL 18.4 primário; assinante na mesma versão principal ou mais nova.
-- Publicador
ALTER SYSTEM SET wal_level = logical;
SELECT pg_reload_conf(); -- reinicie se wal_level não era logical
CREATE PUBLICATION app_pub FOR TABLE orders, order_items;-- Assinante
CREATE SUBSCRIPTION app_sub
CONNECTION 'host=primary.db.internal dbname=appdb user=repl_user password=secret'
PUBLICATION app_pub
WITH (copy_data = true, create_slot = true);Quando usar isso: Atualizações de versão principal, sincronização seletiva de tabelas ou alimentação de repositórios de análise sem clonar o cluster completo.
Exemplo de Trabalho
Replicação lógica de ponta a ponta com verificações de status:
-- Publicador: garanta a chave primária ou REPLICA IDENTITY em tabelas replicadas
ALTER TABLE orders REPLICA IDENTITY FULL; -- se não houver PK em tabela legada
CREATE PUBLICATION orders_pub FOR TABLE orders;-- Assinante
CREATE SUBSCRIPTION orders_sub
CONNECTION 'host=primary.db.internal port=5432 dbname=appdb user=repl_user password=secret sslmode=verify-full'
PUBLICATION orders_pub;-- Monitorar no publicador
SELECT subname, pid, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_stat_subscription; -- vazio no publicador
SELECT slot_name, plugin, active,
pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn) AS lag_bytes
FROM pg_replication_slots
WHERE slot_type = 'logical';
-- Monitorar no assinante
SELECT subname, pid, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_stat_subscription;O que isso demonstra:
wal_level = logicalhabilita a decodificação lógica no publicador.- Publicações definem quais tabelas (e opcionalmente linhas/colunas) replicar.
- Assinaturas criam um slot lógico no publicador e aplicam alterações localmente.
Mergulho Profundo
Componentes
| Objeto | Executa em | Propósito |
|---|---|---|
| Publicação | Publicador | Filtro de tabela/coluna/linha para alterações |
| Assinatura | Assinante | Conexão + workers de aplicação |
| Slot Lógico | Publicador | Retém WAL até que o assinante confirme |
| Worker de Aplicação | Assinante | Insere/atualiza/exclui linhas |
O que Replicar
- DML em tabelas publicadas:
INSERT,UPDATE,DELETE,TRUNCATE(PostgreSQL 18 suporta truncate em publicações). - DDL não replica automaticamente.
- Sequências requerem sincronização manual ou opções de publicação de sequência PostgreSQL 18+.
Sincronização Inicial
copy_data = true (padrão) executa CREATE TABLE AS ou cópia paralela na assinatura. Tabelas grandes precisam de janela de manutenção ou copy_data = false com semeadura manual.
Armadilhas
- Sem chave primária e REPLICA IDENTITY padrão - Atualizações/exclusões podem não replicar corretamente. Correção: Adicione PK ou
REPLICA IDENTITY FULL(WAL mais amplo). - DDL apenas no publicador - O esquema do assinante se desvia. Correção: Expanda-contraia migrações em ambos os lados ou use ferramentas de migração.
- Inchaço do slot lógico quando o assinante está inativo - O disco do publicador enche. Correção: Alerte sobre slots lógicos inativos; defina a política de retenção.
- Alteração de
wal_levelsem reinicialização - A decodificação lógica não está disponível. Correção: Reinicie o PostgreSQL após aumentarwal_level. - Conflitos de escrita no assinante - O worker de aplicação para em caso de conflito. Correção: Assinante somente leitura para as mesmas tabelas, ou use manipuladores de conflito (dependente da versão).
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Streaming físico | HA de cluster completo, menor sobrecarga | Transição entre versões principais |
| ETL / CDC (Debezium) | Transformar em trânsito | Um espelho de tabela simples é suficiente |
| Foreign Data Wrapper | Leituras ocasionais entre bancos de dados | Necessidade de sincronização contínua quase em tempo real |
FAQs
Mesma versão principal é necessária?
O assinante deve ser da mesma versão principal ou mais nova que o publicador para replicação lógica.
O assinante pode aceitar escritas em outras tabelas?
Sim, mas evite escritas em tabelas publicadas, a menos que você lide com conflitos deliberadamente.
A replicação lógica substitui backups?
Não. Ela espelha alterações de linha; não substitui backups base e arquivo WAL para PITR.
Quantas assinaturas por publicação?
Múltiplos assinantes podem usar a mesma publicação; cada um cria seu próprio slot lógico.
Patroni e replicação lógica?
Execute o publicador lógico no primário do Patroni; após o failover, os slots se movem com o primário. Verifique as configurações de sincronização de slot no Patroni 3.x.
Relacionado
- Publicações e Assinaturas - filtros e listas de colunas
- Lógica vs. Física - guia de decisão
- Atualizar com Replicação Lógica - atualização principal blue/green
- Slots de Replicação - risco de disco do slot lógico
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.