Quando usar o CDC para rastrear o histórico?

26

O Change Data Capture do SQL Server é um recurso que lê dados históricos dos logs de transações do SQL Server e os armazena em uma tabela especial.

Com o uso de funções especiais de valor de tabela (TVF), ele permite que o usuário consulte esses dados, possibilitando obter todas as alterações em uma tabela específica ou apenas as alterações líquidas resultantes das alterações em um período específico.

CDC tem certas vantagens

  • Ele pode ser configurado para rastrear apenas determinadas tabelas ou colunas.
  • É capaz de lidar com alterações de modelo até um certo grau.
  • Ele não afeta o desempenho tanto quanto os gatilhos, porque trabalha com os logs de transações.
  • É facilmente ativado / desativado e não requer colunas adicionais na tabela que devem ser rastreadas.

Também tem algumas desvantagens:

Eu li bastante sobre o CDC e, embora agora saiba como usá-lo, ainda não tenho certeza se é a ferramenta certa para mim.

  1. Para quais tarefas / cenários o CDC é a ferramenta certa? (por exemplo, permitir que os usuários restaurem um objeto de dados em um determinado momento? Auditoria? Mostrando o histórico completo dos dados?)
  2. Quando você prefere não usar o CDC, mas recorrer a uma solução personalizada baseada em acionador?
  3. É bom usar o CDC em um banco de dados operacional e usar os dados do CDC em um aplicativo operacional? (por exemplo, mostrá-lo ao usuário final) Ou isso é claramente um mau uso desse recurso?

Normalmente, ouço dizer que o CDC é uma ferramenta de auditoria, mas não é para isso que serve a Auditoria do SQL Server ? Ambas são ferramentas diferentes para a mesma tarefa? Ou o CDC pode ser usado para outras coisas?

Meu cenário atual é que me pedem para criar uma estrutura de dados confiável, que supostamente seja a base para vários aplicativos futuros. Os requisitos exatos são embaçados, mas um é que ele deve ser capaz de rastrear o histórico de dados e restaurar entradas mais antigas, juntamente com todos os dados relacionados de outras tabelas. Estou avaliando o CDC agora como uma opção, mas não tenho certeza se esse é o caminho a seguir, porque não consigo encontrar nenhum caso de uso recomendado.

Embora eu aprecie conselhos para o meu cenário específico, as respostas devem fornecer conselhos gerais sobre quando ou quando não usar o Change Data Capture.

magnattic
fonte
11
Idealmente, uma "estrutura" não tomaria esse tipo de decisão; seria deixado para projetos individuais. Mas, como você está sendo solicitado a fazer isso, eu diria pelo menos para quem está fornecendo esses requisitos: existem diferentes maneiras de fazer isso, e a melhor opção depende muito do uso e das necessidades exatas. Pergunte se eles podem lhe dar algum esclarecimento que possa ajudá-lo a decidir (como se o desempenho ou a flexibilidade são mais importantes). Outra opção a considerar é desenvolver as duas opções como parte da "estrutura" e deixar que os projetos reais escolham qual ativar.
jpmc26
@ jpmc26, a estrutura pode ser necessária para impedir que cada projeto gaste tempo decidindo esse tipo de pergunta.
5118 Ian McGregor #
@IanRingrose Meu argumento é que tentar tomar essa decisão sem considerar as necessidades específicas de um projeto, a longo prazo, causará mais problemas do que resolve (e, portanto, será mais caro do que gastar esse tempo). Esta é uma decisão que não pode ser efetivamente tomada em um caso geral. As especificidades do projeto devem ser consideradas. Usando uma decisão geral, o tempo será gasto usando a solução escolhida e fazendo suposições em torno dela apenas para que essas suposições sejam violadas quando for descoberto que não era uma solução apropriada. Em seguida, o sistema precisará ser redesenhado.
precisa saber é o seguinte
11
@ jpmc26 Na verdade, posso usar a solução que você propôs, caso encontre uma maneira de fazê-lo: desenvolver o rastreamento de histórico baseado em acionador e baseado em CDC, comutável e por trás de uma interface comum. Os aplicativos podem escolher um ou outro, dependendo de seus requisitos, mas não precisam se preocupar em implementá-los. É claro que eu ainda gostaria de obter uma boa resposta para minha pergunta acima, porque se o CDC não for adequado para esse tipo de tarefa de qualquer maneira (por exemplo, porque é apenas bom para a auditoria), posso me salvar do problema e sempre usar gatilhos. .
magnattic
"Se o agente não estiver em execução ou falhar, nenhum histórico será rastreado" - mas se fosse reiniciado, nenhuma alteração seria perdida, certo?
Andy Joiner

Respostas:

12

Primeiramente,

A captura de dados alterados está disponível apenas nas edições Enterprise, Developer e Evaluation do SQL Server.

Portanto, você pode decidir se algum de seus clientes não terá as edições corporativas ou se ainda não sabe que estará usando as edições corporativas. (Como a especificação inclui "vários aplicativos futuros", isso pode ser um problema real para você)

Ao contrário dos gatilhos, não é em tempo real, isso é uma vantagem e uma desvantagem. O uso de gatilhos sempre atrasa uma atualização.

Trabalhei em um sistema quando usamos gatilhos (gerados pelo CodeSmith), além de rastrear todas as alterações nos registros, também vinculamos as alterações a uma tabela "histórico" que incluía o módulo do aplicativo que fez a alteração, e o item da interface do usuário que o usuário usou para fazer a alteração.

No entanto, você pode resolver isso melhor no nível do aplicativo, digitando todas as atualizações em uma fila de mensagens que são reproduzidas para criar um banco de dados a qualquer momento, consulte Padrões Temporais no blog Martin Flowler para obter uma boa visão geral das opções.

Ian Ringrose
fonte
O link é uma leitura muito interessante, obrigado por isso. Ainda assim, resolver isso no nível do aplicativo não é uma opção no meu caso. A estrutura que estou construindo deve executar a maior parte do trabalho, incluindo o rastreamento do histórico, para os aplicativos baseados nela. Os aplicativos estão trabalhando com uma interface comum para armazenar / recuperar dados, para que eles não precisem se preocupar com a forma como os dados são armazenados. Estou ciente de que esta tarefa está longe de ser trivial.
magnattic
Além disso, atualmente não estou considerando o Enterprise Edition ou não um fator decisivo no nosso caso. Os futuros aplicativos de que estou falando provavelmente serão todos criados e hospedados por nós.
magnattic
@atticae, Sua estrutura não precisa se limitar ao banco de dados, pode incluir código executado fora do banco de dados.
Ian Ringrose
Não se limita ao banco de dados, é claro. (Eu não chamaria isso de estrutura neste caso.) Entendo agora o que você quer dizer com "nível de aplicativo" e atualmente estou de fato usando uma variação do padrão de Propriedade Temporal sobre a qual o seu link fala. A estrutura que eu construo fornece essa interface para os aplicativos que a utilizam. Ainda assim, isso faz parte do lado da interface e nada disso realmente responde às minhas perguntas descritas acima.
magnattic
Obrigado novamente por sua resposta. Esse é provavelmente o fator decisivo para a maioria das pessoas, por isso acho que é uma boa resposta e provavelmente ajuda os futuros visitantes a decidir não usar o CDC. No entanto, eu sinto que realmente não responde à maioria das minhas perguntas, então terei que dar a recompensa a stacylaray, que foi o único a tentar responder a todas as perguntas que eu tinha. (Embora eu estava esperando por uma resposta um pouco mais elaborado.)
magnattic
12

Aqui está uma série de 9 partes muito bem escrita que analisa as diferentes maneiras de auditar as alterações de dados do SQL Server. As partes 3, 4 e 5 concentram-se no CDC. Vale a pena ler todos os artigos, pois isso responderá às suas perguntas, como os diferentes cenários em que os recursos seriam adequados e gerais. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server

brynn
fonte
11
Depois de folhear o artigo, ainda não sou muito mais inteligente. Como a maioria dos artigos, ele detalha como usar o CDC e como ele se compara ao acompanhamento de alterações. Isso realmente não responde às minhas perguntas acima.
magnattic
9

Para quais tarefas / cenários o CDC é a ferramenta certa? (por exemplo, permitir que os usuários restaurem um objeto de dados em um determinado momento?

Talvez depende.

Auditoria?

Sim.

Mostrando o histórico completo dos dados?)

Sim.

Quando você prefere não usar o CDC, mas recorrer a uma solução personalizada baseada em acionador?

Quando os dados na tabela de alterações não atendem às suas necessidades.

Posso usar o CDC em um banco de dados operacional e usar os dados do CDC em um aplicativo operacional? (por exemplo, mostrando ao usuário final)

Sim.

Ou isso é claramente um mau uso desse recurso?

Não, não é um mau uso desse recurso.

Normalmente, ouço dizer que o CDC é uma ferramenta de auditoria, mas não é para isso que serve a Auditoria do SQL Server?

Sim.

Ambas são ferramentas diferentes para a mesma tarefa?

Não.

Ou o CDC pode ser usado para outras coisas?

O CDC pode ser usado para outras coisas.

Há controle de alterações e há captura de dados de alterações. Ambos têm suas raízes na replicação.

O Rastreamento de alterações fornece uma maneira de fornecer as alterações líquidas em uma tabela. Um exemplo de uso seria uma sincronização de dispositivo portátil.

O CDC, por outro lado, acompanha todas as pequenas mudanças, uma história. Pode-se usar esse histórico para atualizar um armazém de dados em vez de copiar em massa dados, ou pode-se usar esse histórico como dados em si e gerar relatórios a partir dele. A tabela de alterações não está oculta nem possui um esquema estranho ou algo assim. Você pode consultá-lo e usar os dados da maneira que desejar. Apenas tenha em mente ... não é em tempo real, como Ian disse. Os dados são provenientes do log de transações, portanto, cuide dele como se estivesse usando replicação, espelhamento ou envio de log. Em geral, será mais rápido que os gatilhos. Você precisará usar o isolamento de instantâneo, que tem sobrecarga, e precisará pensar na recuperação de falhas.

stacylaray
fonte
2

Um ponto de correção. Ao mesmo tempo, a captura de dados alterados estava disponível apenas nas versões listadas acima. No entanto, a captura de dados alterados ficou disponível na edição padrão a partir do 2016 SP1. Assim, muitos artigos escritos antes de 2016 SP1 fazem parecer que o CDC está fora de alcance para aqueles que usam a edição Standard. Este não é mais o caso. O documento da Microsoft que descreve o CDC disponível está no link abaixo.

https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017#DW

Robert Sievers
fonte