none
Replicação de Dados

    Pergunta

  • Olá pessoal, preciso fazer replicação de dados entre dois bancos de dados, sede e filial.

     

    Segue abaixo o cenário que tenho:

    Os bancos sede e filial contemplam a mesma estrutura de tabelas.

    Preciso que a solução seja multi-banco ( sql server ou oracle )

    Preciso implementar regras para as tabelas e campos, tipo, se a sede manda na tabela ou se a filial manda na tabela.

     

    Alguma ideia de como fazer isso, utilizar stored procedure direto no banco, aplicação cliente/servidor ?

     

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    segunda-feira, 7 de fevereiro de 2011 18:09

Respostas

  • Wagner,

    Acessei o site  http://www.object.com.br e até aonde compreendi esta solução seria ideal para o que preciso, mas de momento como já citei anteriormente hoje já temos esta sincronização através de proc executada via banco a banco. Então a ideia é somente trazer isso para uma aplicação para que possamos ter mais performance no envio de dados entre a sede e a filial. E juntamente com isso iremos implementar uma interface simples para que o nosso suporte/implantação possa configurar as regras de sincronização de maneira fácil ao invés de alterar código sql. Fiz alguns teste comparando o tempo do que temos hoje com proc e utilizando a sincronização via aplicação e tivemos uma boa redução no tempo final. Mas o http://www.object.com.br já esta no meu favoritos.

     

     

     

    Vou passar todo o fluxo para o "papel" e efetuar a implementação, ocorrendo alguma duvida volto aqui para dividir com vocês e assim que tiver executando no cliente informo o percentual real de melhora.

    Obrigado a todos que colaboram com respostas, fico muito grato por compartilharem ideias e enviar sugestões. 

    Abraços, Leandro 

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    • Marcado como Resposta Leandro de Souza sexta-feira, 11 de fevereiro de 2011 12:07
    sexta-feira, 11 de fevereiro de 2011 12:02

Todas as Respostas

  • Leandro eu faria um service, mais acho melhor vc ver com o pessoal de sql tb.

    Não esqueça de usar o componente </> na barra para posta seu código.
    segunda-feira, 7 de fevereiro de 2011 18:15
  • Caro colega,

    O Sync Framework é destinado a nos ajudar (developers, não pessoal de TI) a resolver problemas de sincronização (Files and Databases). Veja a pagina do Sync Framework em http://msdn.microsoft.com/en-us/sync/default

    Há também um projeto para usar o Sync em Oracle na página http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=3761

    Espero ter ajudado!

    Abraço!


    HJ
    segunda-feira, 7 de fevereiro de 2011 18:40
  • Seilor,

    Estou estudando a opção de fazer através de TcpListener, com um serviço executando na sede aonde a filial conecta, envia e recebe pacotes de dados.

    Exemplo: A filial solicita a sede dados de uma determinada tabela, a sede efetua o select e retorna um objeto serelializado. Quando a filial receber estes dados é feito um comparativo e envia para a sede somente os registros para igualar as bases, tudo isso respeitando a regra de quem tem prioridade sobre tabela/campo, que pode ser sede ou filial. Estou utilizando para teste iniciais o  NetSockets

     O que você acha desta estrutura ? Já fez algo parecido com isso ? Alguma dica ?

     

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    segunda-feira, 7 de fevereiro de 2011 19:32
  • HJ,

    Pesquisei um pouco sobre o Sync, assisti um video de exemplo e li uns artigos. Estou com algumas duvidas.

    Ao utilizar o Sync para um determinada tabela será criado triggers para esta ?

    Será necessário informar campos para controle de Insert e Update ?


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    segunda-feira, 7 de fevereiro de 2011 22:04
  • Caro Leandro,

    Não será criado triggers não, veja detalhes específicos sobre sua dúvida na seção "Change Tracking" do endereço http://msdn.microsoft.com/en-us/sync/bb887608

    Veja um exemplo de uso em http://msdn.microsoft.com/en-us/library/bb726022(v=SQL.110).aspx

    Para vc ter uma idéia esse framework é o que está sendo usado para o serviço Windows Live Mesh de sincronização de arquivos entre clients e nuvem. Só que se trata da sincronização de files e o exemplo que eu te dei é o que você precisa, de database.

    Abraço!


    HJ
    terça-feira, 8 de fevereiro de 2011 08:55
  • HJ, obrigado pela ajuda.

     

    "Acho" que compreendi o Change Tracking, mas pelo que percebi é um recurso do Sql Server 2008. Esta afirmação esta correta ?

    Existe alguma limitação de versão do banco de dados para utilizar este recurso ?

     

     

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    terça-feira, 8 de fevereiro de 2011 13:55
  • Pesquisando sobre o Change Tracking verifiquei que é um recurso somente para o Sql Server 2008 mesmo. No meu caso além do Sql Server 2008 terei bases com Sql Server 2000 e 2005 e tambem Oracle.

    Lendo a documentação do Sync Framework 2.1 na parte de "Como provisionar um banco de dados de servidor para sincronização de colaboração (não SQL Server)" constatei que será necessario ter uma tabela de controle e também uma trigger para cada tabela e isso não será muito viavel para o meu cenário.

    Existe alguma outra maneira eficiente de efetuar um comparativo com os registro de duas bases sem ter que usar trigger ?

    Se sim, após este comparativo aplica se as regras e efetua os updates, insert ou delete necessários de cada lado.

    No aguardo de alguma dica, abraços a todos.

     

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    terça-feira, 8 de fevereiro de 2011 20:32
  • Leandro... dependendo do tamanho da sua empresa... e da quantidade de dados.... acho que vc deveria estudar a possibilidade de usar um Websphere ou um BizTalk...

    é uma solução mais cara... mas não da mais dor de cabeça...


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    terça-feira, 8 de fevereiro de 2011 23:14
  • Rui,

    Obrigado pela dica, pesquisei um pouco sobre esta ferramentas.

    É que já temos um solução de sincronização, mas estamos afim de desenvolver outra porque esta muito lento.

     

    O nosso maior problema é em comparar a massa de dados de um lado com o outro. A nossa solução atual executa diretamente no banco comparando campo a campo de cada registro ( não é feito um select da tabela inteira, aplicamos um regra geralmente com subtração de data para 30 dias retroativos ), dependendo da regra de quem manda em quem (sede ou filial) o registro é inserido, atualizado ou excluído.

     

    Alguém já implementou este tipo de solução utilizando um aplicativo cliente/server ?

     

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    quarta-feira, 9 de fevereiro de 2011 11:29
  • Então Leandro... normalmente replicação de dados eu faço usando dois SGBDs do mesmo tipo... seja SQL Server para SQL Server, Oracle para Oracle, Postgree para Postgree e etc...

    Basicamente usando Backup diferencial ou Log de transações...

    Entre servidores diferentes... justamente prefiro usar o Biztalk...

    Agora vejamos.. se vc tiver fazendo acesso aos dados via ODBC... eu diria que pode ser possivel usar o Trace do ODBC para fazer a sincronia... se tiver usando Entity Framework e ate mais facil... pq vc pode sobrescrever o metodo SaveChanges do seu data context...

    Pq o ideal é executa o processo de manipulação de dados (UPDATE/INSERT/DELETE) simultaneamente nas base de dados... (no caso de usar o Log pode ser feito posteriomente...)

    Ficar comparando bases de dados para ver a alteração do registro eh complicado...

    Mas enfim... imaginando o pior dos casos.. no qual vc não pode mexer em programas e tenha um acesso a dados muito especifico... o que vc pode fazer eh criar uma tabela na base Master e atrazer de Triggers ir gerando um log de atualização para poder executar no Servidor Replicado...

    Uma tabela mais ou menos assim:

    REPLICACAO (    
        INDICE INTEIRO AUTOINCREMENTAL,
        TABELA TEXTO,
        OPERACAO BYTE, -- 1 = INCLUSAO / 2 = ALTERACAO / 3 = EXCLUCAO
        REGISTRO XML,
        SINCRONIZADO BOOLEANO
    )

    Ai atrazes de trigers vc vai populando essa tabela... eu opetei por gravar um xml do registro pq acredito que fica mais facil para exportar os dados de um SGBD para outro dessa forma...

    ai vc poe agendar um servico que le todos os registros nao sicronizados... e com um cursor vc vai gravando na base replicada (lembrando de alterar o flar sincornizado).. no final do processo vc deleta tudo que for sincronizado = true...

     


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    quarta-feira, 9 de fevereiro de 2011 14:23
  • Rui, mais uma vez obrigado pelas informações.

    Achei interessante esta ideia do Entity Framework, mas no cenário atual a comunicação é complicada, as filiais geralmente tem links ruins, por este motivo a sincronização é feita uma vez por dia após o fechamento da produção. Em relação a utilizar triggers tem um pouco de receio de deixar a aplicação "um pouco mais lenta".

     

    Estava pensando em fazer um aplicativo que seria executado na sede e outro na filial.

    • A filial solicita a sede qual tabela precisa efetuar sincronização passando os parâmetros de filtragem (id da filial, período, etc ).  
    • A sede devolve uma lista contendo uma coluna com a chave primaria do registro e outra coluna com um CRC-32 de todos as colunas
    • Ao receber esta lista contendo o CRC-32 a filial que também gerou uma lista localmente efetua uma comparação.
    • Após comparar a filial envia para a sede somente os registro que realmente precisão ser alterados.
    • A sede recebe estes registros e atualiza o banco.

    Efetuei alguns teste e obtive um bom comportamento utilizando esta estrutura. O meu grande receio é desenvolver um serviço que fique disponível na sede e que converse assincronamente com varias filiais ao mesmo tempo.

     

    Gostaria de implementar esta estrutura de comparação utilizando o sync, sendo assim não preciso utilizar triggers e também não preciso desenvolver toda parte de troca de pacotes entre sede e filial.

    Mas todos os exemplos que encontrei na web utilizando o sync utiliza triggers. Fico no aguardo se tiver alguma dica de como facilitar esta operação com sync .


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    quarta-feira, 9 de fevereiro de 2011 16:43
  • Entao... Trigger assustam.. mas quando bem usadas não dao problemas...

    Estamos falando de um servidor SQL Server como master né ? a sua trigger teria um Insert e um Select indexado na PK... praticamente não pesa nada... e a performance q vc vai conseguir vai ser melhor do que ficar fazendo CRCs e filtrando todo dia em busca alterações..

    O uso de geração de Log com Trigger eh bastante usado para replicação de dados... ja vi sistemas em Postgree do jeito q vc esta falando que funcionavam assim...

    No caso do Entity Framework... se vc tiver usando ele... vc pode fazer a geração da tabela de replicação com ele ao inves de usar triggers tmb (se bem q triggers eh mais seguro)... eu uso isso para gerar um Log para auditoria do sistema... por exemplo:

    partial class DataEntities {
      public void Auditar(EntityObject entity) {
        var atividade = entity.EntityState.ToString();
        if (this.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave) == 0) return;
    
        var username = HttpContext.Current.User.Identity.Name;
        var trace = new StackTrace(1);
        var registro = new Auditoria() {
          Terminal = HttpContext.Current.Request.UserHostAddress,
          Login = String.IsNullOrWhiteSpace(username) ? null : username,
          Data = DateTime.Now,
          Metodo = trace.GetFrame(0).GetMethod().DeclaringType.Name + "." + trace.GetFrame(0).GetMethod().Name,
          Atividade = atividade,
          Entidade = DataEntities.Serialize(entity),
          Tipo = entity.EntityKey.EntitySetName
        };
    
        this.Auditorias.AddObject(registro);
        this.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
      }    
    
      private static string Serialize(EntityObject entity) {
        var formatter = new XmlSerializer(entity.GetType());
        using (var stream = new StringWriter()) {
          var writer = XmlWriter.Create(stream, new XmlWriterSettings() { OmitXmlDeclaration = true, Indent = false });
          formatter.Serialize(writer, entity);
          return stream.ToString();
        }
      }
    }
    

    isso me gera uma tabela com todas as informações de manipulações de dados... serve tanto para replicação, para auditoria de sistema como para gerar uma imagen do banco em uma determinada data ou dar um replay num determinado processo...

    CREATE TABLE [dbo].[Auditorias](
    	[Id] [bigint] IDENTITY(1,1) NOT NULL,
    	[Data] [datetime] NOT NULL,
    	[Login] [nvarchar](30) NULL,
    	[Atividade] [nvarchar](20) NOT NULL,
    	[Entidade] [xml] NOT NULL,
    	[Terminal] [nvarchar](15) NULL,
    	[Tipo] [nvarchar](max) NOT NULL,
    	[Metodo] [nvarchar](max) NOT NULL,
     CONSTRAINT [PK_Auditorias] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    )
    

    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    quarta-feira, 9 de fevereiro de 2011 17:40
  • Leandro,

    Estou neste ramo de integrar bases heterogeneas atraves de replicação desde 2002, já te adianto que a coisa é bem complexa, me chamou a atenção sua troca de mensagens nesta thread, evoluiram bastante a questao mas tem muita coisa ainda a tratar, como conflitos de updates, criptografia, compressão de dados, possibilidade de configuração de redundância de links, enfim tem uma infinidade aí de recursos que quando bem utilizados te permitem replicar com sucesso mesmo nesta infra instavel de internet que temos hoje disponivel no pais.

    Se sua empresa puder investir um pouco tente testar nossa solução, veja em http://www.object.com.br, nosso produto atende desde pequenas empresas replicando entre bancos iguais ou grandes corporações, como Marinha e Exercito Brasileiro, integrando bases oracle com postgresql, etc.

     

    quinta-feira, 10 de fevereiro de 2011 01:50
  • Rui, obrigado por explicar como fez para implementar esta rotina de auditoria do sistema.

     

     

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    sexta-feira, 11 de fevereiro de 2011 11:48
  • Wagner,

    Acessei o site  http://www.object.com.br e até aonde compreendi esta solução seria ideal para o que preciso, mas de momento como já citei anteriormente hoje já temos esta sincronização através de proc executada via banco a banco. Então a ideia é somente trazer isso para uma aplicação para que possamos ter mais performance no envio de dados entre a sede e a filial. E juntamente com isso iremos implementar uma interface simples para que o nosso suporte/implantação possa configurar as regras de sincronização de maneira fácil ao invés de alterar código sql. Fiz alguns teste comparando o tempo do que temos hoje com proc e utilizando a sincronização via aplicação e tivemos uma boa redução no tempo final. Mas o http://www.object.com.br já esta no meu favoritos.

     

     

     

    Vou passar todo o fluxo para o "papel" e efetuar a implementação, ocorrendo alguma duvida volto aqui para dividir com vocês e assim que tiver executando no cliente informo o percentual real de melhora.

    Obrigado a todos que colaboram com respostas, fico muito grato por compartilharem ideias e enviar sugestões. 

    Abraços, Leandro 

     


    Aprendendo Asp.Net, WinForms, C#, Linq to EF e Sql Server
    • Marcado como Resposta Leandro de Souza sexta-feira, 11 de fevereiro de 2011 12:07
    sexta-feira, 11 de fevereiro de 2011 12:02
  • Olá Leandro, vc ja criou seu aplicativo de replicação, estou passando pelo mesmo cenario, poderia dar dicas de como vc resolveu seu problema ?

    alessandre

    segunda-feira, 27 de maio de 2013 01:47
  • Alessandre,

    Já faz tempo, mas eu resolvi esta questão através de um serviço do windows executando na sede que fiz escutando uma porta.

    A filial conecta neste serviço utilizando ip/porta para trocar informações.

    Desenvolvemos dois arquivos xml.  Um para definir a regra de tabela, ou seja, qual comando sql executar para comparar os dados e quem tem prioridade sobre a tabela (sede ou filial). O outro arquivo chamado de perfil definimos a sequencia de execução das regras de tabela.

    Ao conectar na sede a filial passa o perfil e assim é executado o comando sql das regras de tabela tanto na sede quanto na filial, esta informações são levadas para a filial efetuar o comparativo e definir o que dever ser feito (Insert, Update ou Delete)

    Ficou um pouco complexo, demoramos uns 3 meses para implementar e alguns meses para homologar. Mas hoje já esta executando em todos os nossos clientes.


    Estudando Windows Phone, Windows 8 e LightSwitch, muito bom!!!

    quarta-feira, 29 de maio de 2013 02:43