Eu tenho dois bancos de dados SQL Server. Um é cliente (aplicativo Windows) e o segundo está no servidor. Eu quero sincronizar esses dois bancos de dados de vez em quando (por exemplo, a cada 2 minutos!).
Eu li sobre diferentes maneiras de sincronização, como replicação, carimbo de data/hora, tabelas de log usando gatilhos, Microsoft Sync Framework e assim por diante.
Na verdade, não gosto de usar um método de sincronização que pode ser uma caixa preta (como replicação) porque não quero que as tabelas específicas do SQL Server sejam bloqueadas enquanto as estou atualizando e sincronizando com o servidor.
qual método você acha que eu deveria usar em tal circunstância? Lembre-se de que a cada vários minutos devo enviar várias alterações de tabela do cliente para o servidor e buscar também duas alterações de tabela do servidor.
Eu encontrei um método que é estranho, mas novo. É possível que eu registre todos os procedimentos armazenados executados (para preferências específicas) no cliente e os envie com seus parâmetros em um
.sql
arquivo para o servidor e os execute lá? O mesmo acontecerá no servidor e enviado para o cliente. Você acha que este é um método simples, mas útil ou não?por favor, sugira-me qualquer abordagem útil, se puder. Muito obrigado.
EDIT: Lembre-se que esta é uma sincronização em tempo real e isso a torna especial. Isso significa que quando o usuário cliente estiver usando a tabela, o processo de sincronização com o servidor deve ocorrer a cada vários minutos para que nenhuma das tabelas seja bloqueada.
Bem, eu posso não entender, mas eu tento responder.
Você disse que precisa de uma solução de alto desempenho que seja executada com frequência (mínimo de 2 minutos) e precisa de uma boa abordagem que seja rápida sem travar. Mas você não quer um sistema de caixa preta.
Em vez de um sistema blackbox, que é usado em milhões de instalações com bons resultados, você tenta inventar a roda novamente e construir sua própria solução? Hm, soa um pouco estranho.
Na verdade, essas são minhas sugestões.
ISOLATION LEVEL
paraREAD_COMMITTED_SNAPSHOT
. Você pode ler mais sobre isso aqui . Isso usará uma parte do seu tempdb, mas sua tabela sempre pode ser lida e gravada e a replicação pode funcionar em segundo plano.Veja o exemplo abaixo:
CDC
pode ser uma coisa frágil em algumas circunstâncias.CDC
irá capturar todos os dados em uma tabela monitorada (você precisa especificar cada tabela monitorada manualmente). Depois, você obterá o valor antes e o valor depois de umINSERT
,UPDATE
ouDELETE
.CDC
reterá essas informações por um período de tempo (você pode especificá-las por conta própria). A abordagem pode ser usarCDC
em determinadas tabelas que você precisa observar e replicar manualmente essas alterações para o outro banco de dados. By the way,CDC
usa o SQL Server Replication sob o capô também. ;-) Você pode ler mais sobre isso aqui .Bem, esses são meus 2 centavos. Espero que você tenha uma boa visão geral e talvez tenha encontrado uma solução que funcione para você.
Vou tentar enumerar aqui algumas opções com vantagens e desvantagens à medida que as percebo:
Microsoft Sync Framework - me parece mais adequado para bancos de dados menores de aplicativos móveis. Ele adiciona muitas tabelas ao seu banco de dados e não é tão eficiente quanto a replicação. Como ele é implementado fora do SQL Server como um componente, será mais difícil de configurar. Não tenho experiência com isso, apenas tentei e decidi não usá-lo.
Acompanhamento de alterações do banco de dados . É uma função interna do SQL Server que faz o controle de alterações, incluindo inserções, atualizações e exclusões. Todo o resto, como enviar e aplicar alterações, resolver conflitos, etc., você terá que codificar.
CDC conforme mencionado na resposta do Ionic - não tenho experiência com ele, pois está disponível apenas nas edições Enterprise ou Developer.
Usar seu próprio truque com o registro de procedimentos armazenados executados - depende muito da natureza do seu aplicativo de banco de dados. Mas quando os procedimentos ficam um pouco diferentes, aí você pode ter uma grande confusão nos dados. E como você lidaria com os conflitos?
Pela sua pergunta, parece que você precisa sincronizar apenas algumas tabelas e não todos os grandes bancos de dados. Para isso, você deve analisar suas necessidades com mais detalhes do que você especificou na pergunta, como:
Se você eventualmente descobrir que exclusões e conflitos não são seu problema e que sua estrutura não mudará muito, você pode considerar escrever sua própria lógica, mas ela pode facilmente crescer para 1000 linhas de código.
Obrigado a todos por seus comentários.
Resolvi com sucesso o processo de sincronização capturando os procedimentos armazenados executados não como um monte, mas um por um, o que funcionou muito bem no meu caso. Como a integridade e tudo são cuidadosamente considerados, o sistema tem funcionado em tempo real até agora.
Resposta atrasada, mas pode ser útil para os visitantes do tópico
Eu tive um desafio semelhante ao tentar distribuir dados entre diferentes servidores e o resolvi usando ferramentas de terceiros ( Diff para alterações de esquema e DataDiff para sincronização de alterações de dados) e seguindo o script do PowerShell necessário para automatizar o processo:
Este método agenda a comparação entre dois bancos de dados e sincroniza as alterações encontradas em tempo real. Aqui estão alguns artigos que oferecem instruções passo a passo:
https://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatically-keep-two-sql-server-database- esquemas em sincronia/
Fiz essa pergunta há vários anos e resolvi finalmente e usei a solução em muitos projetos
Se suas tabelas forem exatamente iguais (sejam do mesmo servidor ou não), use a Replicação Transnacional. É muito fácil de configurar e não levará mais de uma hora para a configuração inicial. No entanto, pode precisar de algumas dicas para melhor depurar e entender o mecanismo que você pode descobrir em muitos sites.
Se suas tabelas de destino tiverem colunas extras do que suas tabelas de origem, eu definitivamente recomendo Triggers, a menos que você tenha tantas transações em um segundo ou seu servidor seja fraco.
Eu usei o método de trigger em vários projetos de sincronização e funciona muito bem.