SkillsTecnológicas
Menu
Back-end

Change Data Capture: o que é CDC e como funciona

Entenda como o CDC captura alterações no banco de dados, sincroniza sistemas e quais cuidados aplicar em snapshots, reentregas e consumidores.

Marcos RodriguesPublicado em 16 de agosto de 2026Atualizado em 14 de agosto de 202611 min de leitura
Engenheiro acompanha mudanças de um banco de dados distribuídas para sistemas consumidores

Quando um pedido muda de status, vários sistemas podem precisar saber disso: estoque, entrega, atendimento, análise de dados e notificações.

Consultar repetidamente a tabela inteira funciona em cenários pequenos, mas gera atraso, carga e casos difíceis de tratar, como exclusões.

Change Data Capture, ou CDC, é uma abordagem para identificar inserções, atualizações e exclusões realizadas em uma fonte de dados e disponibilizá-las para outros processos.

Em implementações baseadas no log transacional, o capturador acompanha mudanças já confirmadas pelo banco e as transforma em um fluxo de eventos.

Isso permite sincronizar destinos com baixa latência sem executar uma consulta completa a cada ciclo.

CDC não elimina os desafios de consistência. É preciso planejar snapshot inicial, posição de leitura, reentregas, ordenação, mudanças de esquema, exclusões, segurança e recuperação.

Este guia mostra como essas peças se conectam e quando a técnica realmente vale a pena.

O que é Change Data Capture?

Change Data Capture é o processo de detectar alterações em dados e entregá-las a sistemas interessados.

A mudança pode ser a criação de uma linha, a atualização de colunas ou a exclusão de um registro.

Em vez de perguntar constantemente “o que mudou desde a última consulta?”, um mecanismo CDC acompanha uma fonte de alterações.

Nos bancos relacionais, essa fonte costuma ser o log usado pelo próprio banco para durabilidade e recuperação.

No PostgreSQL, a decodificação lógica transforma registros do WAL em uma forma compreensível para consumidores. No MySQL, o binary log registra eventos usados na replicação e pode representar mudanças por linha, instrução ou formato misto.

Entender transações, chaves e integridade ajuda a evitar decisões erradas. O artigo sobre bancos de dados relacionais apresenta essa base.

Para que serve CDC?

  • atualizar um índice de busca quando os dados operacionais mudam;
  • alimentar data warehouse, lakehouse ou pipelines analíticos;
  • manter um cache ou uma visão de leitura sincronizada;
  • propagar mudanças entre serviços sem consultar repetidamente a origem;
  • atualizar embeddings quando documentos são alterados ou removidos;
  • modernizar sistemas legados de forma gradual;
  • integrar fontes diferentes com menor atraso.

Em uma aplicação de busca semântica, por exemplo, o CDC pode avisar que um documento mudou.

O pipeline refaz os trechos e atualiza o banco de dados vetorial, evitando que resultados antigos continuem aparecendo.

Como Change Data Capture funciona

Uma arquitetura comum possui quatro partes: banco de origem, conector CDC, meio de transporte e consumidores. O conector lê mudanças confirmadas, converte cada uma em uma representação estável e registra até onde avançou.

O transporte pode ser um broker, fila, stream ou mecanismo próprio. Os consumidores transformam ou aplicam as mudanças em destinos como outro banco, índice de busca e armazenamento analítico.

Snapshot inicial

O log normalmente contém mudanças recentes, não uma cópia completa de tudo que já existe.

Por isso, um novo pipeline costuma começar com um snapshot consistente das tabelas e depois continuar pelo log a partir de uma posição coordenada.

Se snapshot e streaming não forem sincronizados, mudanças feitas durante a cópia podem ser perdidas ou aplicadas fora de ordem.

A documentação do conector PostgreSQL do Debezium descreve modos de snapshot e retomada por LSN.

Leitura contínua e posição no log

Depois do snapshot, o conector acompanha o log e guarda um offset. No PostgreSQL, essa posição pode ser um LSN; em outras fontes, pode ser outro identificador de arquivo, transação ou sequência.

Após uma reinicialização, o processo usa a posição persistida para retomar.

Como a confirmação do offset e a entrega do evento podem ocorrer em momentos diferentes, algumas alterações podem reaparecer.

Esse comportamento é um motivo para projetar consumidores idempotentes.

Alterações ordenadas saem de um banco de dados e passam por um capturador de eventos

O que existe em um evento CDC

O formato varia, mas um evento pode conter a operação, chave primária, estado anterior, estado posterior, tabela de origem, horário, posição no log e identificadores de transação.

{
  "operacao": "atualizacao",
  "chave": { "pedido_id": 8421 },
  "antes": { "status": "pago" },
  "depois": { "status": "separacao" },
  "origem": { "tabela": "pedidos", "posicao": "..." }
}

Esse exemplo é didático. O formato real depende do conector e da configuração do banco.

Em algumas tabelas, o estado anterior não estará completo; em exclusões, pode haver apenas a chave necessária para remover o registro no destino.

Principais formas de capturar mudanças

Consultas periódicas

O consumidor consulta linhas com updated_at posterior à última execução.

É simples para baixo volume, mas exige cuidado com empates de horário, relógios, transações demoradas e paginação.

Exclusões não aparecem sem uma marca lógica ou tabela auxiliar.

Triggers e tabelas auxiliares

Triggers gravam as mudanças em uma tabela de auditoria ou outbox.

A abordagem oferece controle sobre o conteúdo, mas acrescenta trabalho à transação da aplicação e precisa acompanhar alterações no esquema.

CDC baseado em log

O conector lê a trilha transacional mantida pelo banco. Isso reduz a necessidade de varrer tabelas e permite capturar exclusões e metadados de ordenação.

Em troca, exige permissões específicas, retenção de logs, conhecimento do motor e uma estratégia para mudanças de esquema.

AbordagemVantagemCuidado principal
Consulta periódicaImplementação inicial simplesAtraso, carga e exclusões
TriggerControle do evento gravadoImpacto na escrita e manutenção
Baseada em logBaixa interferência e boa coberturaOperação, permissões e retenção

Exemplo prático em um e-commerce

Considere a tabela pedidos. Quando o serviço de pagamento confirma uma compra, a mesma transação atualiza o status.

O conector CDC lê a mudança confirmada e publica um evento.

  1. O consumidor de estoque reserva os itens.
  2. O serviço de entrega prepara a expedição.
  3. O índice de atendimento atualiza a visão do pedido.
  4. O pipeline analítico registra a conversão.

Em uma arquitetura de microsserviços, cada consumidor mantém sua responsabilidade.

Mesmo assim, o evento de linha não explica necessariamente a intenção “pagamento aprovado”; ele apenas descreve que um valor mudou.

CDC, replicação e event sourcing são iguais?

Não. Replicação busca manter outra cópia do banco para disponibilidade ou leitura. CDC expõe alterações para integrações e múltiplos consumidores. As duas técnicas podem usar o mesmo log, mas têm objetivos diferentes.

No event sourcing, eventos de domínio são a fonte de verdade e o estado é derivado deles.

No CDC tradicional, a tabela continua sendo a fonte e os eventos são derivados das mudanças persistidas. Um evento “linha atualizada” também possui menos significado de negócio que “pedido aprovado”.

Equipe observa eventos repetidos sendo verificados antes de chegar ao banco de destino

Entrega, duplicidade e idempotência

Muitos pipelines priorizam não perder alterações e aceitam que um evento seja entregue novamente após falha.

A documentação do Debezium sobre garantias de entrega informa que o padrão é at least once: mudanças não são omitidas, mas um registro pode aparecer mais de uma vez.

Um consumidor idempotente chega ao mesmo estado mesmo processando a mesma mudança duas vezes. Para sincronizar uma tabela, isso pode significar fazer upsert pela chave e guardar a última versão ou posição aplicada.

Operações como “incrementar saldo” ou “enviar e-mail” não são naturalmente idempotentes.

Elas precisam de uma chave de deduplicação, registro de processamento ou desenho transacional que impeça a repetição do efeito.

Ordenação e limites de transação

O log oferece uma ordem na origem, mas o transporte pode particionar eventos e os consumidores podem processá-los em paralelo.

Preserve a ordem necessária por entidade usando uma chave estável, como pedido_id.

Não presuma uma ordem global entre tabelas e partições. Se duas mudanças precisam ser interpretadas juntas, mantenha metadados da transação ou modele um evento de domínio que represente a operação completa.

Exclusões, tombstones e dados antigos

CDC baseado em log pode capturar exclusões, mas o evento talvez contenha somente a chave. O consumidor deve interpretar esse sinal e remover, ocultar ou marcar o item no destino.

Alguns streams usam um registro adicional chamado tombstone para permitir limpeza em tópicos compactados.

Defina claramente a diferença entre exclusão física, exclusão lógica e expiração, especialmente quando dados pessoais precisam desaparecer de todas as cópias.

Mudanças de esquema

Adicionar, renomear ou remover uma coluna altera o contrato dos eventos.

Consumidores rígidos podem falhar mesmo quando o banco aceita a migração.

  • prefira mudanças compatíveis e em etapas;
  • adicione campos antes de torná-los obrigatórios;
  • mantenha consumidores capazes de ignorar campos desconhecidos;
  • versione contratos quando a semântica mudar;
  • teste migração, captura e destino no mesmo cenário.

ORMs simplificam a persistência da aplicação, mas não escondem esse contrato do pipeline. Vale conectar o planejamento com as práticas de mapeamento objeto-relacional e migrações.

CDC e transactional outbox

Publicar no banco e no broker em duas operações independentes cria o problema de dual write: uma pode confirmar e a outra falhar.

O transactional outbox grava o estado e um evento de negócio na mesma transação do banco.

Depois, um relay ou conector CDC publica a linha da outbox.

A orientação da AWS sobre transactional outbox mostra como a abordagem evita inconsistências entre o commit e a notificação.

A outbox oferece intenção de domínio, enquanto capturar diretamente qualquer tabela reduz alterações na aplicação, mas expõe detalhes do armazenamento.

Segurança e proteção de dados

Um pipeline CDC pode multiplicar dados sensíveis em tópicos, caches, logs e ambientes analíticos.

Capture apenas tabelas e colunas necessárias, aplique criptografia, controle de acesso e períodos de retenção compatíveis com a finalidade.

Credenciais do conector devem ter o menor privilégio possível. Segredos não devem aparecer na configuração versionada, e o acesso ao log não pode se transformar em acesso irrestrito a todo o banco.

As mesmas práticas de segurança desde o código precisam alcançar conectores e consumidores.

O que monitorar em produção

  • Lag: diferença entre a mudança na origem e a aplicação no destino.
  • Posição: último offset confirmado e idade do evento mais antigo.
  • Retenção: volume de WAL, binlog ou tabelas CDC aguardando consumo.
  • Taxa e erros: eventos por segundo, falhas de serialização e tentativas.
  • Consumidores: filas de mensagens mortas, reprocessamentos e divergência no destino.
  • Esquema: mudanças incompatíveis e campos inesperados.

No PostgreSQL, slots podem reter WAL quando o consumidor para de avançar. Um slot esquecido pode ocupar armazenamento indefinidamente.

Integre métricas do conector e do banco à estratégia de observabilidade com OpenTelemetry.

Quando não usar CDC

Uma tarefa diária com poucas linhas pode ser resolvida por um job incremental simples.

CDC adiciona conectores, retenção, contratos, monitoramento e recuperação. O ganho precisa justificar essa operação.

Também não use eventos de linha como API pública sem uma camada de contrato. O esquema interno pode mudar e expor campos que consumidores não deveriam conhecer.

Quando a intenção de negócio é essencial, outbox ou eventos produzidos pela aplicação tendem a ser mais claros.

Checklist de implementação

  1. Defina fonte, tabelas, colunas e consumidores.
  2. Escolha entre polling, trigger e leitura do log.
  3. Planeje snapshot e posição de transição para streaming.
  4. Defina chave, partição, ordenação e formato do evento.
  5. Torne cada consumidor idempotente.
  6. Teste inserção, atualização, exclusão e mudança de esquema.
  7. Simule parada após entrega e antes da confirmação do offset.
  8. Crie reprocessamento, reconciliação e fila de erros.
  9. Monitore lag, retenção, armazenamento e falhas.
  10. Restrinja dados, permissões e tempo de retenção.

Perguntas frequentes

CDC substitui uma fila ou um broker?

Não. CDC captura mudanças; o broker transporta, armazena e distribui eventos. Algumas plataformas combinam as funções, mas elas continuam conceitualmente diferentes.

Change Data Capture funciona em tempo real?

Normalmente funciona próximo do tempo real. A latência depende do banco, conector, transporte, volume, consumidores e destino; não há garantia de resposta instantânea.

CDC pode perder dados?

Pode, se estiver mal configurado ou se o log necessário expirar antes da leitura. Retenção, offsets, alertas e testes de recuperação são essenciais.

Por que eventos podem aparecer duplicados?

Uma falha pode ocorrer depois da entrega e antes da confirmação da posição. Ao retomar, o conector reenvia a mudança para evitar perdê-la.

CDC captura exclusões?

CDC baseado em log geralmente captura exclusões. A quantidade de dados anteriores disponível depende do banco, da chave e da configuração.

É preciso usar Kafka para ter CDC?

Não. Kafka é uma opção comum para transportar streams, mas CDC também pode alimentar filas, serviços de streaming, runtimes embutidos ou destinos diretos.

Conclusão

Change Data Capture conecta o histórico transacional do banco a sistemas que precisam reagir às mudanças.

Quando bem aplicado, reduz consultas repetitivas, diminui o atraso de sincronização e cria uma base consistente para busca, análise e integração.

O valor vem acompanhado de responsabilidades: coordenar snapshot e streaming, preservar posições, aceitar reentregas, construir consumidores idempotentes, tratar esquemas e monitorar a retenção.

Comece por um fluxo pequeno, teste falhas deliberadamente e só amplie depois que recuperação e reconciliação estiverem comprovadas.