Temos 2 servidores SQL 2012 SP2 Enterprise que possuem alguns bancos de dados espelhados. Um desses bancos de dados também possui o CDC ativado em várias tabelas para que possamos executar alguma lógica de negócios quando houver alterações na tabela.
Ontem fizemos algumas manutenções no servidor espelho (o primário estava rodando exposto). Algumas horas depois, reativamos o espelho e ele sincronizou conforme o esperado.
O que descobrimos foi que os dados do CDC que normalmente processamos quase em tempo real não foram coletados até que o espelhamento fosse retomado.
2 perguntas fora disso:
- Quando você tem um espelho configurado, os dados do CDC são coletados apenas quando o espelho é sincronizado?
- Existe alguma maneira de fazer a captura do CDC ser executada quando um espelho é pausado?
O CDC usa o leitor de log, da mesma forma que a replicação. Quando espelhamento ou grupos de disponibilidade são usados, por padrão, o leitor de log não processará registros de log que ainda não tenham sido protegidos em todas as réplicas secundárias de espelhamento/grupo de disponibilidade.
Isso pode ser alterado com o Trace Flag 1448, que permite que o leitor de log de replicação avance mesmo se as réplicas secundárias assíncronas não tiverem confirmado o recebimento de uma alteração. Mesmo com esse sinalizador de rastreamento ativado, o leitor de log sempre aguarda as réplicas secundárias síncronas.
Referências:
https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/replicate-track-change-data-capture-always-on-availability#CDC
https://support.microsoft.com/en-us/help/937041/fix-changes-in-the-publisher-database-are-not-replicated-to-the-subscr