AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 105965
Accepted
Emad Farrokhi
Emad Farrokhi
Asked: 2015-07-05 08:01:22 +0800 CST2015-07-05 08:01:22 +0800 CST 2015-07-05 08:01:22 +0800 CST

Sincronizando dois bancos de dados no SQL Server

  • 772

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.

  1. 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.

  2. 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 .sqlarquivo 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?

  3. 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.

sql-server data-synchronization
  • 5 5 respostas
  • 80735 Views

5 respostas

  • Voted
  1. Best Answer
    Ionic
    2015-07-05T14:13:24+08:002015-07-05T14:13:24+08:00

    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.

    1. Replicação mesmo se você disser que não vai usá-la. É a solução mais fácil e melhor que você pode usar para isso. A replicação é fácil de configurar, replicar rápido e você não precisa inventar a roda novamente. Se você apenas estranho sobre o bloqueio, você pode tentar definir o ISOLATION LEVELpara READ_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:

    ALTER DATABASE yourDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
    ALTER DATABASE yourDatabase SET READ_COMMITTED_SNAPSHOT ON
    
    1. O CDC (Change Data Capture) também pode ser uma solução. Mas desta forma você precisa construir quase tudo por conta própria. E eu fiz a experiência que CDCpode ser uma coisa frágil em algumas circunstâncias. CDCirá 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 um INSERT, UPDATEou DELETE. CDCreterá essas informações por um período de tempo (você pode especificá-las por conta própria). A abordagem pode ser usar CDCem determinadas tabelas que você precisa observar e replicar manualmente essas alterações para o outro banco de dados. By the way, CDCusa o SQL Server Replication sob o capô também. ;-) Você pode ler mais sobre isso aqui .

    Aviso: CDCnão estará ciente de DDL-alterações. Isso significa que, se você alterar uma tabela e adicionar uma nova coluna, CDCobservará a tabela, mas ignorará todas as alterações na nova coluna. Na verdade ele só registra NULLcomo valor antes e valor depois. Você precisa reinicializá-lo após DDL-Alterar para uma tabela monitorada.

    1. A maneira que você descreveu acima é algo como capturar uma carga de trabalho usando o SQL Server Profiler e executá-la novamente em outro banco de dados para alguns benchmarks. Bem, poderia funcionar. Mas o fato de haver muitos efeitos colaterais é um pouco pesado demais para mim. O que você faz se capturar uma chamada de procedimento em seu cliente. Depois de executar o mesmo comando em seu banco de dados principal, pois está fora de sincronia? O procedimento pode ser executado, mas pode excluir/atualizar/inserir linhas que não estavam presentes em seu cliente. Ou como você lida com vários clientes com um princípio. Eu acho que isso é muito complicado. Na pior das hipóteses, você provavelmente destrói sua integridade.
    2. Outra ideia pode ser baseada em aplicativos ou usando um gatilho. Dependendo de quantas tabelas você deseja sincronizar. Você pode gravar todas as alterações em uma tabela de preparo separada e executar um trabalho do SQL Server Agent todos os x minutos para sincronizar essas linhas na tabela de preparo com seu mestre. Mas isso pode ser um pouco pesado se você tentar sincronizar (por exemplo) 150 tabelas. Você teria uma grande sobrecarga.

    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ê.

    • 14
  2. Vojtěch Dohnal
    2015-07-08T02:12:58+08:002015-07-08T02:12:58+08:00

    Vou tentar enumerar aqui algumas opções com vantagens e desvantagens à medida que as percebo:

    1. Replicação do SQL Server - esta é a melhor e mais otimizada ferramenta nativa do SQL Server para esta tarefa. Mas há vários problemas: a. para todos os seus clientes, independentemente de serem bancos de dados SQL Express ou não, você precisará da licença SQL Server CAL. Isso pode ser evitado usando o licenciamento por processador. b. Você não pode sincronizar o cliente SQL CE conforme aqui . c. SQL Express ou LocalDB não podem atuar como um editor ou distribuidor , então você tem menos controle sobre o cliente sobre o processo de replicação.
    2. 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.

    3. 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.

    4. Colunas de versão de linha (timestamp) Se você não permitir todas as exclusões (sem sincronização de registros excluídos) - você pode implementar sua própria solução com base apenas nas informações de versão de linha. As colunas Rowversion também são usadas pela Replicação do SQL Server, portanto, você precisará adicioná-las de qualquer maneira.
    5. 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.

    6. 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:

    • As exclusões podem acontecer e o que acontece então?
    • Podem ocorrer conflitos, como preveni-los e como resolvê-los?
    • Como lidarei com as mudanças na estrutura da tabela?
    • ...

    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.

    • 9
  3. Emad Farrokhi
    2016-04-25T03:51:35+08:002016-04-25T03:51:35+08:00

    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.

    • 2
  4. Monte Chavis
    2017-04-01T05:13:01+08:002017-04-01T05:13:01+08:00

    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:

    #check for the existence of the Outputs folder
    function CheckAndCreateFolder($rootFolder, [switch]$Outputs)
    {
    $location = $rootFolder
    
    #setting up location 
    if($Outputs -eq $true)
    {
        $location += "\Outputs"
    }
    
    #if the folder doesn't exist it will be created
    if(-not (Test-Path $location))
    { mkdir $location -Force:$true -Confirm:$false | Out-Null }
    
    return $location
    }
    
    #root folder for the schema sync process
    $rootFolder = "SchemaSync"
    
    #schema output summaries location 
    $outsLoc = CheckAndCreateFolder $rootFolder -Outputs
    
    #ApexSQL Diff location, date stamp variable is defined, along with tool’s parameters 
    $diffLoc   = "ApexSQLDiff"
    $stamp = (Get-Date -Format "MMddyyyy_HHMMss") 
    $Params = "/pr:""MyProject.axds""    /out:""$outsLoc\SchemaOutput_$stamp.txt"" /sync /v /f" 
    $returnCode = $LASTEXITCODE
    
    #initiate the schema comparison and synchronization process
    (Invoke-Expression ("& `"" + $diffLoc +"`" " +$Params))
    
    #write output to file
    "$outsLoc\SchemaOutput_$dateStamp.txt"
    
    #schema changes are detected
    if($returnCode -eq 0)
    {
    "`r`n $returnCode - Schema changes were successfully synchronized" >> 
    
    }
    else
    {
    #there are no schema changes
    if($returnCode -eq 102)
    {
    "`r`n $returnCode - There are no schema changes. Job aborted" >> 
    }
    #an error is encountered
    else
    {
    "`r`n $returnCode - An error is encountered" >> 
    
    #output file is opened when an error is encountered
    Invoke-Item "$outsLoc\SchemaOutput_$stamp.txt"
    }
    
    }
    

    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/

    • 0
  5. Emad Farrokhi
    2020-09-07T03:36:01+08:002020-09-07T03:36:01+08:00

    Fiz essa pergunta há vários anos e resolvi finalmente e usei a solução em muitos projetos

    1. 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.

    2. 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.

    CREATE TRIGGER [dbo].[Delete_UNIT] ON [DB2].[dbo].[UNIT]
    AFTER DELETE
    AS
    BEGIN
    DELETE S
    FROM CRM.dbo.UNIT S
    INNER JOIN Deleted D ON S.Unit_Code = D.Unit_Code 
    END
    
    
    
    CREATE TRIGGER [dbo].[Insert_UNIT] ON [DB2].[dbo].[UNIT]
    AFTER INSERT
    AS
    BEGIN
    INSERT INTO CRM.dbo.UNIT(Unit_Code, Unit_Name)
    SELECT Unit_Code, Unit_Name
    FROM inserted
    END
    
    
    CREATE TRIGGER [dbo].[Update_UNIT] ON [DB2].[dbo].[UNIT]
    AFTER UPDATE
    AS
    BEGIN
    UPDATE CRM.dbo.[UNIT] SET
          CRM.dbo.[UNIT].Unit_Code = S.Unit_Code
         ,CRM.dbo.[UNIT].Unit_Name = S.Unit_Name
    FROM DB2.dbo.[UNIT] S
    INNER JOIN Inserted I ON S.Unit_Code = I.Unit_Code
    WHERE CRM.dbo.[UNIT].Unit_Code = S.Unit_Code 
    END
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve