Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Configuração de replicação transacional do SQL Server


A Replicação Transacional no SQL Server é uma das técnicas de Replicação mais usadas para copiar ou distribuir dados em vários destinos. Nos artigos anteriores, discutimos a Replicação do SQL Server e como a Replicação funciona internamente. Agora nosso objetivo é ver como configurar a replicação transacional no SQL Server usando a abordagem de backup e como adicionar ou remover artigos para replicação corretamente. Sem as medidas adequadas, corremos o risco de invalidar o instantâneo e enfrentar a necessidade de reconfigurar a Replicação.

Administração de replicação transacional


Em meus artigos anteriores, passamos pelas instruções passo a passo sobre os itens abaixo:
  • Configurar distribuição
  • Configurar publicação com opção de instantâneo
  • Configurar assinatura com opção de instantâneo

Ao configurar a Replicação, primeiro configuramos o Distribuidor. Em seguida, procedemos à Criação de uma Publicação e Assinatura. Para descartar ou limpar a Replicação, precisamos fazer o processo inverso. Primeiro, precisaríamos excluir a Assinatura, depois a Publicação e, finalmente, descartar o Distribuidor ou o banco de dados de distribuição.

Neste artigo, tentamos descartar a Replicação Transacional no SQL Server que configuramos anteriormente. Usaremos a abordagem Backup e adicionaremos ou removeremos artigos da Replicação da seguinte maneira:
  • Cancelar assinatura
  • Soltar publicação
  • Distribuidor de Drops ou banco de dados de distribuição
  • Limpe completamente a replicação se alguma das etapas acima não funcionar corretamente
  • Configurar replicação com backup de banco de dados
  • Eliminar artigos da Replicação usando a abordagem Wizard e T-SQL
  • Adicione novos artigos à Replicação usando a abordagem Wizard e T-SQL
  • Adicione um artigo de procedimento armazenado e estude a diferença entre o artigo de tabela e o artigo de procedimento armazenado

Cancelar assinatura


Para descartar qualquer replicação configurada, precisamos descartar a assinatura primeiro.

No SSMS, conecte-se à instância do Publicador> Replicação > Publicações locais . Clique com o botão direito do mouse em Assinatura> Excluir ou Soltar Inscrição:

O SQL Server solicitará que você confirme sua ação:

Clique em Sim para retirar a Assinatura. Isso eliminará completamente a Assinatura.

Na minha configuração atual, tanto o Publicador quanto o Assinante estão na mesma instância. Portanto, nenhuma solicitação foi enviada para se conectar à instância do Assinante para validação. Caso tivéssemos em uma instância diferente do SQL Server, ele pediria para se conectar à instância do Assinante para validar antes de excluir o Assinante.

O descarte de publicação internamente usa o sp_droppublication procedimento e podemos usar este procedimento para descartar manualmente a abordagem Publicação via T-SQL

Remover publicação


Assim que a Assinatura for excluída, podemos prosseguir e descartar a Publicação . Clique com o botão direito do mouse em AdventureWorks_Pub e selecione Excluir do cardápio:

Você verá uma mensagem solicitando que você confirme essa ação. Observe que você excluirá a publicação. No entanto, todos os registros que foram replicados para o banco de dados do Assinante não serão excluídos. Precisaremos descartar o banco de dados manualmente para limpar esses registros replicados. Clique em Sim .

A eliminação de uma publicação internamente aplica a sp_droppublication procedimento.

Eliminar o Distribuidor ou o Banco de Dados de Distribuição


Anteriormente, mencionamos que o banco de dados de distribuição é um banco de dados do sistema. Portanto, não podemos descartá-lo clicando com o botão direito do mouse no banco de dados e selecionando a opção de exclusão, como nos bancos de dados do usuário. Se clicarmos com o botão direito do mouse no banco de dados de distribuição, obteremos apenas as opções abaixo:

Quando precisamos excluir o banco de dados de distribuição, primeiro devemos clicar com o botão direito do mouse no Replicação nó> Desativar Publicação e distribuição .

Ele irá abrir o Assistente.

Por padrão, a segunda opção (Não, continue usando este servidor como Editor ) é selecionado para evitar a queda acidental de todas as publicações no servidor.

No nosso caso, temos apenas uma publicação e gostaríamos de limpar. Portanto, selecionamos a primeira opção – Sim, desabilitar a publicação neste servidor . Ele irá remover todas as Publicações junto com as Assinaturas se já não forem removidas junto com a desativação do Distribuidor.

Podemos usar este próprio assistente para limpar tudo se nosso Servidor tiver apenas uma Replicação configurada. No entanto, se houver várias replicações configuradas, descartamos a replicação transacional no SQL Server seguindo as etapas padrão compartilhadas acima.

Agora, precisamos selecionar a primeira opção Sim, desabilitar a publicação neste servidor e clique em Avançar .

Na nova janela, marque as duas opções:Desativar publicação e distribuição e Gere um arquivo de script com etapas…

Para gerar o arquivo de script, você precisará fornecer o caminho onde armazená-lo.

Clique em Avançar e veja as opções selecionadas no assistente. Verifique e certifique-se de que selecionou tudo corretamente.

Clique em Concluir .

A eliminação do banco de dados de distribuição internamente usa o sp_dropdistributor procedimento.

Uma vez que o Distribuidor está desabilitado, podemos ver que o banco de dados de distribuição foi removido dos bancos de dados do sistema.

Limpe a replicação completamente se alguma das etapas acima não estiver funcionando corretamente


Se a Assinatura ou Publicação for descartada por meio de qualquer outra abordagem, acabamos na remoção inconsistente da Replicação Transacional no SQL Server e obtemos muitos erros. Para limpar todos os resíduos de Assinatura ou Publicação, podemos usar o procedimento do sistema sp_removedbreplication .
exec_spremovedbreplication

Execute este procedimento somente se ainda houver problemas de replicação após experimentar todas as outras abordagens mencionadas. Procedimento armazenado sp_removedbreplication deve ser executado no banco de dados do Publisher ou do banco de dados mestre e usando o comando abaixo após substituir o @dbname pelo nome do banco de dados do Publisher.

exec_spremovedbreplication @dbname

Configurar a replicação usando a abordagem de backup


Após remover completamente a Replicação, vamos reconfigurar a Replicação Transacional no SQL Server usando a Abordagem de Backup. Envolve as etapas abaixo:
  • Configurar o Distribuidor
  • Criar a publicação
  • Modifique as propriedades da publicação para permitir a criação de assinatura a partir do backup completo ou diferencial.
  • Faça um backup completo do editor e restaure-o como assinante.
  • Configure a assinatura e comece a inicializar a partir do Backup.

Já executamos a maioria das etapas anteriores ao configurar a Replicação. Portanto, não entraremos em detalhes sobre essas etapas aqui.

Configurar distribuidor e publicação


Consulte as instruções passo a passo do artigo anterior sobre como configurar a distribuição e a publicação usando o assistente Criar publicação. Para aprender os scripts T-SQL usados ​​pelo assistente para criar Distribuição e Publicação, basta gerar os scripts para um arquivo durante a última etapa do assistente e não executar os scripts desmarcando a opção “Criar a Publicação” conforme mostrado abaixo .

Agora abra o arquivo de script salvo em uma nova Janela de Consulta para criar o Distribuidor e a Publicação usando esses Scripts:

Observe a segunda linha comentada - ela afirma que todos os valores de senha que inserimos no assistente foram convertidos em NULL ou string vazia por motivos de segurança. Dê uma olhada na linha destacada com @password =valores em branco. Substitua isso pelos valores de senha corretos, faça o mesmo para outras seções com senhas e execute o script.

O script foi executado com sucesso. Podemos ver que a execução dos scripts criou o banco de dados de distribuição e todas as tabelas do sistema dentro dele. No final da mensagem, podemos ver que o trabalho do Log Reader Agent também foi criado e iniciado.

Se necessário, você pode armazenar os resultados para conhecer todas as tabelas, exibições e procedimentos críticos no banco de dados de distribuição. Essas informações serão úteis para a solução de problemas adicionais.

Após a execução bem-sucedida dos scripts, podemos ver o banco de dados de distribuição e a publicação criada com sucesso.

Modificar as propriedades da publicação para habilitar a criação de assinatura de backup completo ou diferencial


Se o tamanho do banco de dados for muito pequeno, o tempo necessário para enviar o Instantâneo Inicial será mais rápido.

Por outro lado, criar Replicação Transacional no SQL Server usando Snapshot não é eficiente nos seguintes casos:
  1. Se o banco de dados for enorme (300 GB ou mais). O tempo necessário para enviar o instantâneo inicial será muito longo.
  2. Se o Assinante estiver localizado em locais diferentes com baixa largura de banda de rede. Em seguida, o processo de instantâneo inicial acontecerá por vários dias.

Assim, fazer um Backup Completo, transferi-lo via FTP ou fisicamente para outro local, restaurar esse backup e inicializar o Assinante será significativamente mais rápido em comparação com a abordagem Snapshot.

Para habilitar a publicação para dar suporte à inicialização de backups, temos que modificar uma das propriedades da publicação. Isso pode ser feito via SSMS ou T-SQL.

Abordagem SSMS


Clique com o botão direito do mouse em AdventureWorks_pub publicação e escolha Propriedades :

Clique em Opções de assinatura :

Defina Verdadeiro para Permitir inicialização de arquivos de backup e clique em OK . Isso nos permitirá inicializar a partir do Backup Completo e Diferencial.

Abordagem T-SQL


Em T-SQL, podemos chamar o procedimento sp_changepublication para modificar esta propriedade.

O script para alterar esta propriedade está abaixo:
USE AdventureWorks
GO
exec sp_changepublication @publication = 'AdventureWorks_pub', @property = 'allow_initialize_from_backup', @value = 'true'

Faça um backup completo do editor e restaure-o como assinante


Um fator chave para notar que devemos fazer um Backup Completo após implementar a propriedade Publication acima. Se o tamanho do banco de dados for grande, podemos fazer um Backup Completo e restaurá-lo no modo RECOVERY na instância do Assinante e fazer um backup Diferencial após fazer a alteração de configuração acima e restaurá-lo no banco de dados do Assinante com o modo NORECOVERY.

Configure a assinatura e inicie a inicialização do backup


Novamente, consulte as instruções passo a passo. Precisamos gerar os scripts necessários, mas não os executamos. O problema é que inicializaremos a assinatura do backup completo ou diferencial usando apenas scripts T-SQL. Eu criei esses scripts durante a criação da assinatura da última vez. Veja o arquivo aberto abaixo.

Observação :Os scripts para a criação da Assinatura devem ser executados a partir do banco de dados do Publicador. Portanto, abra a janela Consulta conectando-se à instância do Publicador.

Precisamos fazer algumas alterações para a assinatura inicializar a partir do backup:
  • Alterar o @sync_type valor de automático para iniciar com backup
  • Forneça as senhas corretas para aquelas substituídas por NULL ou strings vazias. Como usei a conta do Agent Service no servidor, não preciso alterar as senhas.
  • Adicione os parâmetros @backupdevicetype e @backupdevicename e forneça o caminho para o backup completo ou diferencial no servidor do editor (o script será executado nele).

Quando terminar, nosso script ficará assim:

Execute o script para concluir a configuração da Assinatura e receberemos a conclusão bem-sucedida do script conforme mostrado abaixo.

Como o status indica, o trabalho do Agente de Distribuição SQL Server Agent foi criado e iniciado durante a criação da Assinatura.

Assim, criamos nossa Replicação com sucesso usando a abordagem de Backup. Agora podemos verificar a assinatura disponível.

Inicie o Replication Monitor e clique com o botão direito do mouse no Assinante. Ele mostrará o status da replicação:

Como podemos ver, todos os dados foram inicializados com sucesso a partir do Backup sem a necessidade de executar o trabalho do Snapshot Agent. Como não há transações ativas acontecendo no banco de dados, recebemos a mensagem “Nenhuma transação replicada está disponível” no Replication Monitor neste momento.

Retirar artigos da replicação


Tendo aprendido como configurar a replicação transacional no SQL Server por meio do assistente de replicação ou scripts T-SQL, agora podemos verificar como descartar um artigo da replicação por meio desses dois métodos.

Usando o assistente


Clique com o botão direito do mouse em AdventureWorks_pub Publicação> Propriedades . Clique em Artigo para visualizar a lista de artigos incluídos na Replicação.

Por padrão, ele listará os objetos do banco de dados no formato OBJECT_NAME (SCHEMA_NAME). Para fins de teste, vamos eliminar a tabela Person.ContactType da Replicação.

Para isso, basta desmarcar a caixa antes de ContactType (Pessoa). O SQL Server mostrará a mensagem de aviso ou confirmação:

Como explica, se houver algum instantâneo disponível no momento, ele invalidará esses instantâneos devido às alterações nos artigos.

Como inicializamos usando a abordagem de backup e não usamos instantâneos, podemos ignorar esta mensagem com segurança e clicar em Sim para remover este Artigo de tabela da Replicação. Clique em OK para concluir a remoção do artigo da Replicação.

Agora o Person.ContactType A tabela é removida da Replicação. Quaisquer alterações que ocorram no Publicador não serão enviadas para o banco de dados do Assinante. Podemos testar isso por registros INSERT/UPDATE/DELETE no Person.ContactType tabela.

Usando T-SQL


Outra maneira é descartar um artigo da Replicação com a ajuda do sp_droparticle procedimento.
USE [AdventureWorks]
GO
EXEC sp_droparticle 
  @publication = N'AdventureWorks_pub', 
  @article = N'ContactType',
  @force_invalidate_snapshot = 1;
GO

Adicione novos artigos à replicação por meio de assistente ou abordagem TSQL


Em alguns casos (como manutenção de tabela), talvez seja necessário remover alguns artigos e adicioná-los novamente à Replicação após a conclusão da manutenção.

Aprendemos com sucesso como remover artigos da Replicação. Vamos considerar como adicionar novos artigos à Replicação. Adicionaremos o Person.ContactType tabela que removemos anteriormente de volta à Replicação.

Usando o assistente


Para adicionar um artigo de tabela de volta à Replicação, clique com o botão direito do mouse em Publicação > Propriedades > Artigos . Ele exibirá a lista de artigos disponíveis na publicação.

Não foi possível encontrar o Person.ContactType table – a tela exibe apenas as tabelas que faziam parte da Replicação. Para ver todas as tabelas disponíveis no banco de dados do Publisher, desmarque Mostrar apenas artigos selecionados na lista para visualizar todas as tabelas.

Agora, podemos ver o Person.ContactType tabela listada.

Como discutimos anteriormente, todas as tabelas sem Chaves Primárias terão um Círculo Vermelho ícone que indica que essas tabelas não podem ser incluídas na Replicação por meio do Assistente ou da abordagem T-SQL.

Verifique o ContactType (Pessoa) tabela para adicioná-la de volta à Replicação e clique em OK .

A tabela é adicionada novamente à Replicação. No entanto, precisamos elaborar um método para enviar o instantâneo inicial para este artigo de tabela recém-adicionado.

Se você leu o artigo até agora, deve ter acertado – basta executar o Snapshot Agent Job para enviar o snapshot inicial para esta tabela.

Vamos fazer isso agora – clique com o botão direito do mouse em Publicação > veja o Agente de instantâneo status.

Clique em Iniciar para enviar o instantâneo para artigos qualificados. Envie esses dados para o banco de dados de Distribuição e, finalmente, para o banco de dados do Assinante.

Abordagem T-SQL


Podemos realizar ações semelhantes usando o sp_addarticle procedimento.

O script abaixo adicionará artigos à replicação.
use [AdventureWorks]
GO
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ContactType', @source_owner = N'Person', @source_object = N'ContactType'
, @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F
, @identityrangemanagementoption = N'manual', @destination_table = N'ContactType', @destination_owner = N'Person', @vertical_partition = N'false'
, @ins_cmd = N'CALL sp_MSins_PersonContactType'
, @del_cmd = N'CALL sp_MSdel_PersonContactType'
, @upd_cmd = N'SCALL sp_MSupd_PersonContactType'
GO

Observamos anteriormente como a Replicação funciona para um artigo de tabela aplicando 3 procedimentos criados no banco de dados do Assinante para manipular as operações INSERT/UPDATE e DELETE.

Usando a abordagem T-SQL, sabemos como esses procedimentos são referenciados. Se necessário, podemos renomear objetos, nomes de tabelas de destino ou procedimentos padrão. Para isso, faremos alterações no sp_addarticle procedimento.

OBSERVAÇÃO :Se fizermos alguma modificação na Replicação, devemos documentá-la adequadamente. Caso contrário, pode levar a um desastre mais tarde.

Adicione um artigo de procedimento armazenado e estude a diferença entre um artigo de tabela e um artigo de procedimento armazenado


Para adicionar um procedimento armazenado à replicação, precisamos acessar os Artigos página e verifique o procedimento armazenado necessário para obtê-lo replicado. Podemos fazer o mesmo para Visualizações , Visualizações Indexadas , ou Funções definidas pelo usuário também.

Para saber mais sobre a diferença entre Artigos de Tabela vs Visualizações/ Procedimento Armazenado/ Visualizações Indexadas/Funções Definidas pelo Usuário, podemos adicionar um de cada artigo para cada categoria usando T-SQL:

Adicionar um novo artigo de procedimento armazenado à replicação
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'uspGetBillOfMaterials', @source_owner = N'dbo'
, @source_object = N'uspGetBillOfMaterials', @type = N'proc schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'uspGetBillOfMaterials', @destination_owner = N'dbo'

Adicionar um novo artigo de visualização à replicação
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vVendorWithContacts', @source_owner = N'Purchasing'
, @source_object = N'vVendorWithContacts', @type = N'view schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop'
, @schema_option = 0x0000000008000001, @destination_table = N'vVendorWithContacts', @destination_owner = N'Purchasing'
GO

Adicionar um novo artigo de visualização indexada à replicação
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vStateProvinceCountryRegion', @source_owner = N'Person'
, @source_object = N'vStateProvinceCountryRegion', @type = N'indexed view schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'vStateProvinceCountryRegion', @destination_owner = N'Person'

Adicionar um novo artigo de função definida pelo usuário à replicação
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ufnGetStock', @source_owner = N'dbo', @source_object = N'ufnGetStock'
, @type = N'func schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001
, @force_invalidate_snapshot = 1, @destination_table = N'ufnGetStock', @destination_owner = N'dbo'

Usamos o sp_addarticle procedimento para adicionar qualquer tipo de artigo à Replicação com os parâmetros de entrada e opções necessários alterando o @type incluído parâmetro.

Também podemos adicionar esses artigos à publicação clicando com o botão direito do mouse em Publicação > Propriedades > Artigos e adicioná-los à publicação.

Propriedades do artigo de tabela


Agora, vamos alterar as propriedades do artigo por meio de Artigos menu na Publicação propriedades:

Clique em nosso Person.ContactType favorito tabela> Propriedades do artigo . Haverá uma opção para alterar as Propriedades do artigo somente para esta Tabela ou para todas as Tabelas incluídas na Replicação. Para um teste, selecionamos Definir propriedades do artigo de tabela destacado para visualizar as propriedades do Person.ContactType tabela.

Veja todas as opções disponíveis para esta tabela Artigo:

Copiar objetos e configurações para o assinante e Entrega de extrato são as configurações mais importantes para a Replicação. Precisamos ter muito cuidado para alterar qualquer um desses parâmetros.

Clique no formato de entrega INSERT\UPDATE\DELETE para obter as opções abaixo.
  • Não replicar instruções INSERT\UPDATE\DELETE – para personalizar a Replicação para não enviar comandos específicos ao banco de dados do Assinante
  • Instrução INSERT\UPDATE\DELETE – para enviar a instrução INSERT\UPDATE\DELETE diretamente ao Assinante em vez de reconstruir os dados dos logs transacionais
  • CALL – Execute o procedimento armazenado interno mostrado acima em sp_addarticle para replicar dados.
  • XCALL – Execute o procedimento armazenado estendido para replicar as alterações.

Propriedades do artigo de procedimento armazenado


Clique em Propriedades do artigo em qualquer um dos procedimentos armazenados para visualizar as Propriedades

Uma das principais propriedades do procedimento armazenado é a opção Replicar – veja as opções disponíveis abaixo:
  • Somente definição de procedimento armazenado – replica apenas as alterações da estrutura DDL do procedimento armazenado. Esta é a opção padrão para qualquer procedimento armazenado.
  • Execução do procedimento armazenado – use esta opção para reduzir a carga de replicação. Ele realiza todas as alterações via Execução de Stored Procedure no Assinante sem enviar comandos individuais. Podemos ver sobre esse recurso para resolver problemas de desempenho ao replicar grandes alterações de dados no meu próximo artigo.
  • Execução em transação serializada do SP – uma opção híbrida para escolher Execução de procedimento armazenado somente se o procedimento for executado dentro de uma transação serializada. Caso contrário, ele seria replicado como comandos DML individuais.

Visualizar propriedades do artigo


Clique em Propriedades do artigo para qualquer Vista para obter as Propriedades :

Propriedades do artigo de visualização indexada


Clique em Propriedades do artigo para qualquer uma das Visualizações Indexadas das Propriedades :

Propriedades do artigo de função definida pelo usuário


Clique em Propriedades do artigo em qualquer Função Definida pelo Usuário para suas Propriedades

As propriedades de exibições, exibições indexadas e funções definidas pelo usuário são praticamente as mesmas. Portanto, não podemos personalizá-los muito.

Conclusão


Obrigado por ler outro artigo cheio de energia relacionado à Replicação. Hoje, esclarecemos os detalhes sobre como descartar assinatura, publicação, banco de dados de distribuição e limpar completamente a replicação, mesmo se encontrarmos algum problema.

Configuramos uma Replicação recém-inicializada a partir do backup e testamos como adicionar novos artigos à Replicação ou removê-los dela. Em trabalhos posteriores com bancos de dados e, em particular, encontrando as discrepâncias entre eles, você se beneficiará muito das ferramentas profissionais. O dbForge Compare Bundle for SQL Server identifica e analisa todas essas diferenças e as relata.

Em nosso próximo artigo, examinaremos os problemas de replicação enfrentados com frequência e como resolvê-los profissionalmente.