Replicando / sincronizando várias tabelas em diferentes bancos de dados na mesma instância

2

Eu tenho poucas tabelas que precisaram ser replicadas / sincronizadas em vários bancos de dados em nosso cluster do SQL Server 2008.

Eu sei que é possível replicar entre várias instâncias, mas estou procurando replicação ou sincronização na mesma instância entre tabelas específicas de bancos de dados.

A replicação / sincronização deve acontecer a cada meia hora ou mais, mas não me importo que isso aconteça constantemente.

Não posso usar DROP na tabela de destino e INSERT (copiar) a tabela de origem, pois há muitas restrições.

O motivo para isso é não gerenciar na camada de aplicativo e gravar em dois bancos de dados diferentes ao mesmo tempo.

Exemplo:

DB1 tem T1, T2 e T3 - eles estão sendo atualizados constantemente pelo aplicativo, o APP1 sendo executado no DB1.

O DB2 precisa ter uma cópia atualizada do T1 em todos os momentos; além disso, existe um aplicativo diferente, o APP2 é executado apenas no DB2.

O DB1 e o DB2 estão localizados na mesma instância, INST1.

Seria possível replicar T1, T2 e T3 do DB1 para o DB2?

    
por Idan 01.12.2010 / 12:18

4 respostas

2

Primeiramente, os recursos de replicação do SQL Server podem ser configurados entre diferentes bancos de dados na mesma instância.

Configurar e administrar a replicação do SQL Server pode ser mais um esforço do que você deseja assumir. Existem muitas decisões a serem tomadas (o que tipo de replicação? Todas as colunas ou apenas algumas delas? Todas as linhas ou apenas algumas delas? Eu quero indexar as tabelas de destino? Alguns tipos de replicação requerem alterações no modelo de dados subjacente.Se você não controla o código-fonte dos aplicativos, está alterando o modelo de dados, mesmo possível? Etc, etc.), a replicação pode quebrar e pode não ser notada por um enquanto, arquivos de log podem crescer inesperadamente.

Com os gatilhos, você precisa manter o código do gatilho no caso de as tabelas subjacentes serem alteradas. O que acontece se o gatilho parar de funcionar? Como você sincroniza novamente as tabelas? Quanto tempo isso leva? Etc, etc.

Como mencionado nos comentários, uma alternativa à replicação é o uso de visualizações. Potencialmente, isso significa manter o código no caso de as tabelas base (T1, T2, T3) mudarem por qualquer motivo. Por causa disso, as views seriam minha segunda sugestão.

Minha primeira sugestão seria usar o recurso "sinônimos" para simplesmente se referir às tabelas originais. Se você usar visões ou sinônimos, os dados serão armazenados somente em um local (DB1), portanto, não há preocupação em sincronizar as alterações entre as cópias dos dados.

O possível negativo aqui (para visões ou sinônimos) é que o DB2 não conterá os dados T1, portanto, um backup e restauração do DB2 (para um servidor test ou dev) também precisariam de um backup e restauração do DB1. / p>     

por 01.12.2010 / 15:36
1

Eu tenho um problema semelhante e um desafio específico em relação ao uso de sinônimos. Eu tenho dois bancos de dados no mesmo servidor que servem dois aplicativos separados. O DB1 inclui informações relacionadas às informações do agente de seguros. O DB2 inclui informações relacionadas a mala direta e outros programas de marketing.

As informações do Agente na tabela AGENT no DB1 são necessárias no DB2 para que eu possa associar o Agente à nossa mala direta e outros programas de marketing. Essa associação precisa ser definida usando relacionamentos PK / FK. Problema nº 1: O uso de uma função com valor de visualização ou de tabela no DB2 que faz referência à tabela AGENT no DB1 não permite que eu faça referência ao PK na view / function como um FK nas tabelas associadas no DB2. Problema nº 2: Se você definir um sinônimo no DB2 fora da tabela do Agente no DB1, não será possível definir um FK nas outras tabelas no DB2 que faz referência ao sinônimo.

Se a tabela do Agente no DB1 for o principal e o DB2 tiver uma tabela do Agente que seja assinante do DB1, não será possível definir relações adicionais, adicionar um índice exclusivo, etc. à tabela do Agente no DB2 para o aplicativo que está fornecendo dados para.

Como exemplo, o aplicativo que está sendo executado no DB1 não precisa ter o condado do agente indexado. O aplicativo que está sendo executado fora do DB2 precisa ter o condado do agente indexado. Como posso usar a replicação e permitir que o assinante tenha relacionamentos e índices exclusivos no DB2?

    
por 01.02.2012 / 15:44
0

é apenas do DB1- > DB2? ou você deseja alterações que ocorrem no DB2- > DB1?
Você já pensou em uma solução que usa gatilhos?

Além disso, não há nada de errado em usar a replicação do sql server entre a mesma instância de um banco de dados para outro.

    
por 01.12.2010 / 13:04
0

Se estiver na mesma instância, uma solução rápida seria criar um sinônimo em cada banco de dados para as tabelas de dados usando o nome de três partes (exibição database.schema.table). Então você se refere à tabela / sinônimo em cada banco de dados como um recurso local e você tem a opção de mudar para a replicação mais tarde apenas mantendo o mesmo nome da tabela.

    
por 11.11.2011 / 06:01