Eu tenho dois bancos de dados do 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 sincronizar, como replicação, registro de data e 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 atualizo e sincronizo com o servidor.
qual método você acha que devo usar em tais circunstâncias? Lembre-se de que a cada vários minutos eu 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 (de preferência específica) 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 ao cliente. Você acha que esse é um método simples, mas útil ou não?por favor me sugira qualquer abordagem útil, se puder. Muito obrigado.
EDIT: Lembre-se de que esta é uma sincronização em tempo real e isso a torna especial. Isso significa que, quando o usuário cliente está usando a tabela, o processo de sincronização com o servidor deve ocorrer a cada vários minutos, para que nenhuma tabela seja bloqueada.
fonte
Respostas:
Bem, eu posso não entender, mas tento responder.
Você disse que precisa de uma solução de alto desempenho que seja executada com frequência (mínimo todos os 2 minutos) e que precisa de uma boa abordagem, que deve ser rápida sem travar. Mas você não quer um sistema de caixa preta.
Em vez de um sistema de caixa preta, usado em milhões de instalações com bons resultados, você tenta inventar a roda novamente e criar sua própria solução? Hum, parece um pouco estranho.
De fato, essas são minhas sugestões.
ISOLATION LEVEL
comoREAD_COMMITTED_SNAPSHOT
. Você pode ler mais sobre isso aqui . Isso consumirá parte do seu tempdb, mas sua tabela é sempre de leitura e gravação 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 após umINSERT
,UPDATE
ouDELETE
.CDC
reterá essas informações por um período de tempo (você pode especificá-las por conta própria). A abordagem poderia ser usarCDC
em determinadas tabelas que você precisa observar e replicar manualmente essas alterações no outro banco de dados. A propósito, tambémCDC
usa a Replicação do SQL Server sob o capô. ;-) Você pode ler mais sobre isso aqui .Bem, estes são os meus 2 centavos. Espero que você tenha uma boa visão geral e talvez tenha encontrado uma solução que funcione para você.
fonte
Vou tentar enumerar algumas opções aqui 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 várias tabelas ao seu banco de dados e não é tão eficiente quanto a replicação. Como é implementado fora do SQL Server como um componente, será mais difícil de configurar. Não tenho experiência com ele, apenas tentei e decidi não usá-lo.
Rastreamento de alterações no banco de dados . É uma função interna do SQL Server que faz para você alterar o rastreamento, incluindo inserções, atualizações e exclusões. Tudo o mais, como enviar e aplicar alterações, resolver conflitos etc., você terá que codificar a si mesmo.
CDC, conforme mencionado na resposta da Ionic - não tenho experiência com ele, pois está disponível apenas nas edições Enterprise ou Developer.
Usar seu próprio truque para registrar procedimentos armazenados executados - depende muito da natureza do seu aplicativo de banco de dados. Mas quando os procedimentos ficam um pouco diferentes, você pode obter uma grande bagunça nos dados. E como você lida com conflitos?
Da sua pergunta, parece que você precisa sincronizar apenas algumas tabelas e não todos os grandes bancos de dados. Para esse fim, você deve analisar suas necessidades com mais detalhes do que especificou na pergunta, como:
Se você descobrir que exclusões e conflitos não são problema seu e que sua estrutura não mudará muito, considere escrever sua própria lógica, mas ela pode aumentar facilmente para 1000 linhas de código.
fonte
Obrigado a todos por seus comentários.
Resolvi com êxito o processo de sincronização capturando os procedimentos armazenados executados não como um grupo, mas um por um que funcionou muito bem no meu caso. Como a integridade e tudo são cuidadosamente considerados, o sistema tem trabalhado em tempo real até agora.
fonte
Resposta tardia, mas pode ser útil enfiar os visitantes
Tive um desafio semelhante ao tentar distribuir dados por diferentes servidores e resolvi-os usando ferramentas de terceiros ( Dif 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:
Esse 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 sincronização /
fonte