A empresa para a qual trabalho possui um conjunto de bancos de dados (o maior logo abaixo de 1 TB) em diferentes servidores - 2 nos EUA, 2 na Europa.
Executamos replicação ponto a ponto completa por banco de dados entre os 4 nós - para que todos possam receber transações (Inserir/Atualizar/Excluir) e todos tenham os dados que os outros nós coletaram (dentro de uma latência variável - a pior conexão está ligada média de cerca de 30-40 segundos).
O maior banco de dados carrega dados desde o início de 2008 até hoje. Todos esses dados são replicados posteriormente para os nós de relatórios que contêm TODOS os dados.
Preciso remover dados nos nós Transacionais, até 2013, para remover o déficit de espaço no Drive nos nós Transacionais e, portanto, os dados históricos estarão disponíveis apenas nos nós Reporting.
Qual é a melhor maneira de fazer isso? Os dados são relativamente gerenciáveis, pois são bem particionados (mensalmente - por partição e, em seguida, anualmente em arquivos/grupos de arquivos separados). No entanto, há o problema de não ser capaz de descartar as partições enquanto elas estão envolvidas na replicação e na leitura da troca de partições - isso também não é permitido. ( Pré-requisitos de troca de partições - Ponto 18)
Como um ambiente de produção completo, estou tentando evitar qualquer coisa que afete a replicação - incluindo a ressincronização (muitos dados para ressincronizar, em grandes distâncias).
Alguém tem alguma boa sugestão de como executar esta tarefa?
Portanto, não há respostas daqui, mas depois de uma certa discussão e reflexão, elaborei um plano alguns meses atrás.
Vou tornar esta resposta concisa para este fórum (você pode não concordar que eu tenha!), Para tentar ajudar alguém que precise realizar uma tarefa semelhante no futuro, sinta-se à vontade para fazer perguntas se eu perder alguma coisa - embora o método é direto.
Portanto, a principal preocupação é remover os dados sem impacto significativo no tráfego de produção nos nós de/para os quais estamos replicando. A maneira mais fácil de fazer isso é segregar um nó no qual você deseja trabalhar, removendo os dados desse nó e deixando todos os outros inalterados (incluindo os nós de relatórios).
A melhor maneira de fazer isso (lembre-se de que você não pode descartar partições e qualquer/a maioria das operações é replicada e, portanto, cria uma grande quantidade de tráfego e uma grande quantidade de alterações de linha), é criar um novo SP e configurar uma publicação em torno deste SP. Deve, portanto, estar disponível em todos os nós. O bit importante é definir a replicação para replicar a execução do SP - NÃO o resultado (ou seja, replicar a chamada EXEC Sp_delete NÃO excluir WHERE ID = 1, excluir WHERE ID = 2 - alterações no nível da linha). Isso é definido em Clique com o botão direito em sua nova publicação (antes de configurar os outros nós na topologia) > Propriedades > Artigos > Clique no SP_Delete que você configurou > botão Propriedades do artigo > Definir propriedades do artigo de procedimento armazenado destacado > Replicar linha = EXECUÇÃO do procedimento armazenado. Complete sua topologia P2P.
MAS MHSQLDBA, você pode estar dizendo, isso apenas excluirá separadamente as linhas em cada nó por meio do SP. - É por isso que você configura o SP para fazer apenas as exclusões:
IF @@SERVERNAME='O servidor atual que você deseja afetar'
Siga-o com o procedimento de exclusão.
Assim, quando esta chamada EXEC for captada no(s) servidor(es) que você não deseja realizar os Deletes, ela será ignorada pois @@Servername não será igual ao Servidor que você selecionou.
Você pode pensar - por que não criar um SP apenas no servidor em que está interessado e executá-lo? - isso ocorre porque, se você fizer isso, a replicação dividirá as alterações em como elas afetam as linhas do artigo (tabela) e replicarão as alterações reais - você deve replicar o SP para poder especificar que o EXEC do SP seja replicado ao invés das mudanças resultantes.
Esta é a ordem de eventos sugerida em minha opinião/experiência:
Pontos de Observação:
Provavelmente existe uma maneira melhor de mover os dados no SP do que usar delete - talvez movê-los para outra tabela que não esteja envolvida na replicação e, em seguida, descartar a 'nova' tabela - ou o inverso, se os dados que você deseja manter é menor que o valor a ser excluído, mova os dados que deseja manter para uma nova tabela, descarte o antigo e renomeie sua nova tabela - há muitos conselhos por aí a partir dessas perspectivas - eu trabalho em um ambiente onde era mais fácil lutar pela exclusão do que promover um conceito que algumas pessoas não entenderão, então estou descrevendo a maneira dolorosa, mas básica.
ISENÇÃO DE RESPONSABILIDADE: Todos os itens acima são perigosos. Se feito às pressas sem premeditação apropriada, você pode atrapalhar seriamente uma topologia de replicação, os dados de sua empresa e provavelmente seu emprego. Por favor, use o método acima e desenvolva seu próprio plano de batalha - crie um ambiente de teste para provar o conceito, teste, teste e teste novamente, não leve esta tarefa levianamente. Com consideração suficiente, você cumprirá sua tarefa - mas não vale a pena fazê-lo na sexta-feira à tarde, depois de algumas cervejas na hora do almoço. Faça certo, faça uma vez (para testar o máximo que puder), faça corretamente.
Espero que isto ajude alguém. - Estou adicionando este trecho, pois é o que eu teria procurado se quisesse esta resposta:
Excluir grande quantidade de dados de uma topologia de replicação ponto a ponto