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

Problemas de replicação transacional do SQL Server


Começamos a falar sobre problemas de replicação transacional do SQL Server anteriormente. Agora, continuaremos com mais algumas demonstrações práticas para entender os problemas de desempenho de replicação enfrentados com frequência e como solucioná-los corretamente.

Já discutimos problemas como problemas de configuração, problemas de permissão, problemas de conectividade e problemas de integridade de dados, além de solucionar e corrigi-los. Agora, vamos nos concentrar em vários problemas de desempenho e problemas de corrupção que afetam a replicação do SQL Server.

Como os problemas de corrupção são um tópico enorme, discutiremos seus impactos apenas neste artigo e não entraremos em detalhes. Eu escolhi vários cenários que podem se enquadrar em problemas de desempenho e corrupção com base na minha experiência:
  • Problemas de desempenho
    • Transações ativas de longa duração no banco de dados do Publisher
    • Operações INSERT/UPDATE/DELETE em massa em artigos
    • Grandes mudanças de dados em uma única transação
    • Bloqueios no banco de dados de distribuição
  • Questões relacionadas a corrupção
    • Corrupções no banco de dados do editor
    • Corrupções no banco de dados de distribuição
    • Corrupções do banco de dados do assinante
    • Corrupções do banco de dados MSDB

Problemas de desempenho


A Replicação Transacional do SQL Server é uma arquitetura complicada que envolve vários parâmetros, como o banco de dados do Publicador, o banco de dados do Distribuidor (distribuição), o banco de dados do Assinante e vários Replication Agents executados como trabalhos do SQL Server Agent.

Como discutimos todos esses itens em detalhes em nossos artigos anteriores, sabemos a importância de cada um para a funcionalidade de Replicação. Qualquer coisa que afete esses componentes pode afetar o desempenho da Replicação do SQL Server.

Por exemplo, a instância do banco de dados do Publisher está mantendo um banco de dados crítico com muitas transações por segundo. No entanto, os recursos do servidor têm um gargalo como o uso consistente da CPU acima de 90% ou o uso de memória acima de 90%. Isso definitivamente terá um impacto no desempenho do trabalho do Log Reader Agent, que lê os dados alterados dos logs transacionais do banco de dados do Publicador.

Da mesma forma, esses cenários nas instâncias de banco de dados do Distribuidor ou do Assinante podem afetar o Snapshot Agent ou Distribution Agent. Portanto, como um DBA, você precisa garantir que os recursos do servidor, como CPU, memória física e largura de banda de rede, sejam configurados com eficiência para as instâncias de banco de dados do Publicador, Distribuidor e Assinante.

Supondo que os servidores de banco de dados do Publicador, Assinante e Distribuidor estejam configurados corretamente, ainda podemos ter problemas de desempenho de replicação ao encontrar os cenários abaixo.

Transações ativas de longa duração no banco de dados do editor


Como o nome indica, as transações ativas de longa duração mostram que há uma chamada de aplicativo ou uma operação de usuário dentro do escopo da transação em execução por um longo tempo.

Encontrar uma transação ativa de longa duração significa que a transação ainda não foi confirmada e pode ser revertida ou confirmada pelo aplicativo. Isso impedirá que o log de transações seja truncado, resultando no aumento contínuo do tamanho do arquivo de log de transações.

O Log Reader Agent verifica todos os registros confirmados marcados para replicação de logs transacionais em uma ordem serializada com base no número de sequência de log (LSN), ignorando todas as outras alterações que ocorrem para artigos que não são replicados. Se os comandos de transação ativa de longa duração ainda não forem confirmados, a Replicação ignorará o envio desses comandos e enviará todas as outras transações confirmadas para o banco de dados de distribuição. Depois que a transação ativa de longa duração for confirmada, os registros serão enviados para o banco de dados de distribuição e, até esse momento, a parte inativa do arquivo de log de transações do banco de dados do editor não será limpa, fazendo com que o tamanho do arquivo de log de transações do banco de dados do editor aumente.

Podemos testar o cenário de transação ativa de longa duração executando as etapas abaixo:

Por padrão, o Distribution Agent limpa todas as alterações confirmadas no banco de dados do Assinante, mantendo o último registro para monitorar as novas alterações com base no Log Sequence Number (LSN).

Podemos executar as consultas abaixo para verificar o status dos registros disponíveis em MSRepl_Commands tabelas ou usando o sp_browsereplcmds procedimento no banco de dados de distribuição:
exec sp_browsereplcmds
GO
SELECT * FROM MSrepl_commands

Agora, abra uma nova janela de consulta e execute o script abaixo para criar uma transação ativa de longa duração no AdventureWorks base de dados. Observe que o script abaixo não inclui nenhum comando ROLLBACK ou COMMIT TRANSACTION. Portanto, recomendamos não executar esses tipos de comandos no banco de dados de produção.
BEGIN TRANSACTION 

SET IDENTITY_INSERT Person.ContactType ON;
insert into person.ContactType (ContactTypeId, Name, ModifiedDate) values ( 22, 'Test New Position', GETDATE());
SET IDENTITY_INSERT Person.ContactType OFF;

Podemos verificar se esse novo registro não foi replicado para o banco de dados do Assinante. Para isso, executaremos a instrução SELECT no Person.ContactType tabela no banco de dados do Assinante:

Vamos verificar se o comando INSERT acima foi lido pelo Log Reader Agent e escrito no banco de dados Distribution.

Execute os scripts da parte da Etapa 1 novamente. Os resultados ainda mostram o mesmo status antigo, confirmando que o registro não foi lido nos logs de transações do banco de dados do Publicador.

Agora abra uma Nova consulta e execute o script UPDATE abaixo para ver se o Log Reader Agent foi capaz de ignorar a transação ativa de longa duração e ler as alterações feitas por esta instrução UPDATE.
UPDATE AdventureWorks.dbo.AWBuildVersion
SET ModifiedDate  = GETDATE()

Verifique no banco de dados de distribuição se o Log Reader Agent pode capturar essa alteração. Execute o script como parte da Etapa 1:

Como a instrução UPDATE acima foi confirmada no banco de dados do Publicador, o Log Reader Agent pode verificar essa alteração e inseri-la no banco de dados de distribuição. Posteriormente, aplicou essa alteração ao banco de dados do Assinante conforme mostrado abaixo:

INSERIR em Person.ContactType será replicado para o banco de dados do Assinante somente depois que a transação INSERT for confirmada no banco de dados do Publicador. Antes de confirmar, podemos verificar rapidamente como identificar uma transação ativa de longa duração, entendê-la e tratá-la com eficiência.

Identifique uma transação ativa de longa duração


Para verificar transações ativas de longa duração em qualquer banco de dados, abra uma nova Janela de consulta e conecte-se ao respectivo banco de dados que precisamos verificar. Execute o DBCC OPENTRAN comando console – é um comando do console do banco de dados para visualizar as transações abertas no banco de dados no momento da execução.
USE AdventureWorks
GO
DBCC OPENTRAN

Agora sabemos que houve um SPID (ID do processo do servidor ) 69 funcionando por um longo tempo. Vamos verificar qual comando foi executado nessa transação usando o DBCC INPUTBUFFER comando console (um comando do console de banco de dados usado para identificar o comando ou operação que está acontecendo no ID do processo do servidor selecionado).

Para facilitar a leitura, estou copiando o EventInfo valor do campo e formatá-lo para mostrar o comando que executamos anteriormente.

Se não houver transações ativas de longa duração no banco de dados selecionado, receberemos a mensagem abaixo:

Semelhante ao DBCC OPENTRAN comando do console, podemos SELECT do DMV chamado sys.dm_tran_database_transactions para obter resultados mais detalhados (consulte o artigo do MSDN para obter mais dados).

Agora, sabemos como identificar a transação de longa duração. Podemos confirmar a transação e ver como a instrução INSERT é replicada.

Vá para a janela onde inserimos o registro no Person.ContactType tabela dentro do Escopo da Transação e execute COMMIT TRANSACTION conforme mostrado abaixo:

A execução de COMMIT TRANSACTION confirmou o registro no banco de dados do Publicador. Portanto, ele deve estar visível no banco de dados de Distribuição e no banco de dados do Assinante:

Se você notou, os registros mais antigos do banco de dados de distribuição foram limpos pelo trabalho de limpeza do agente de distribuição. O novo registro para INSERT em Person.ContactType tabela estava visível no MSRepl_cmds tabela.

Com nossos testes, aprendemos as seguintes coisas:
  • O trabalho do Log Reader Agent da replicação transacional do SQL Server verificará os registros confirmados somente no banco de dados de logs transacionais do editor e INSERT no banco de dados do assinante.
  • A ordem dos dados alterados no banco de dados do Publicador enviados ao Assinante será baseada no status Comprometido e na hora no banco de dados do Publicador, mesmo que os dados replicados tenham o mesmo horário do banco de dados do Publicador.
  • Identificar transações ativas de longa duração pode ajudar a resolver o crescimento do arquivo de log transacional do editor, distribuidor ou assinante ou qualquer banco de dados.

Operações SQL INSERT/UPDATE/DELETE em massa em artigos


Com dados enormes residindo no banco de dados do Publisher, muitas vezes acabamos com requisitos para INSERT ou UPDATE ou DELETE grandes registros em tabelas replicadas.

Se as operações INSERT, UPDATE ou DELETE forem executadas em uma única Transação, ela definitivamente ficará na Replicação travada por muito tempo.

Digamos que precisamos INSERT 10 milhões de registros em uma tabela replicada. A inserção desses registros em uma única tomada causará problemas de desempenho.
INSERT INTO REplicated_table
SELECT * FROM Source_table

Em vez disso, podemos INSERT registros em lotes de 0,1 ou 0,5 milhão de registros em um WHILE loop ou loop CURSOR , e garantirá uma replicação mais rápida. Podemos não receber grandes problemas para instruções INSERT, a menos que a tabela envolvida tenha muitos índices. No entanto, isso terá um grande impacto no desempenho das instruções UPDATE ou DELETE.

Suponha que adicionamos uma nova coluna à tabela Replicada com cerca de 10 milhões de registros. Queremos atualizar esta nova coluna com um valor padrão.

Idealmente, o comando abaixo funcionará bem para ATUALIZAR todos os 10 milhões de registros com valor padrão como Abc :
-- UPDATE 10 Million records on Replicated Table with some DEFAULT values
UPDATE Replicated_table
SET new_column = 'Abc'

No entanto, para evitar impactos na replicação, devemos executar a operação UPDATE acima em lotes de 0,1 ou 0,5 milhão de registros para evitar problemas de desempenho.
-- UPDATE in batches to avoid performance impacts on Replication
WHILE 1 = 1
BEGIN
	UPDATE TOP(100000) Replicated_Table
	SET new_Column = 'Abc'
	WHERE new_column is NULL

	IF @@ROWCOUNT = 0
	BREAK
END

Da mesma forma, se precisarmos DELETAR cerca de 10 milhões de registros de uma tabela Replicada, podemos fazê-lo em lotes:
-- DELETE 10 Million records on Replicated Table with some DEFAULT values
DELETE FROM Replicated_table

-- UPDATE in batches to avoid performance impacts on Replication
WHILE 1 = 1
BEGIN
	DELETE TOP(100000) Replicated_Table

	IF @@ROWCOUNT = 0
	BREAK
END

O tratamento eficiente de BULK INSERT, UPDATE ou DELETE pode ajudar a resolver os problemas de replicação.

Dica profissional :Para INSERIR dados enormes em uma tabela replicada no banco de dados do Publisher, use o assistente IMPORT/EXPORT no SSMS, pois ele inserirá registros em lotes de 10.000 ou com base no tamanho do registro calculado mais rapidamente pelo SQL Server.

Grandes mudanças de dados em uma única transação


Para manter a integridade dos dados da perspectiva do aplicativo ou do desenvolvimento, muitos aplicativos têm transações explícitas definidas para operações críticas. No entanto, se muitas operações (INSERT, UPDATE ou DELETE) forem executadas em um único escopo de transação, o Log Reader Agent aguardará primeiro a conclusão da transação, como vimos anteriormente.

Depois que a transação é confirmada pelo aplicativo, o Log Reader Agent precisa verificar essas grandes alterações de dados realizadas nos logs de transações do banco de dados do Publisher. Durante essa verificação, podemos ver os avisos ou mensagens informativas no Log Reader Agent, como

O Log Reader Agent está verificando o log de transações em busca de comandos a serem replicados. Aproximadamente xxxxxx registros de log foram verificados na passagem # xxxx dos quais foram marcados para replicação, tempo decorrido xxxxxxxxx (ms)

Antes de identificar a solução para este cenário, precisamos entender como o Log Reader Agent verifica os registros dos logs transacionais e insere os registros no banco de dados de distribuição MSrepl_transactions e MSrepl_cmds mesas.

O SQL Server tem internamente um Log Sequence Number (LSN) dentro dos logs transacionais. O Log Reader Agent usa os valores LSN para verificar as alterações marcadas para a Replicação do SQL Server em ordem.

O Log Reader Agent executa o sp_replcmds procedimento armazenado estendido para buscar os comandos marcados para replicação do banco de dados de logs transacionais do editor.

Sp_replcmds aceita um parâmetro de entrada chamado @maxtrans para buscar o número máximo de transações. O valor padrão seria 1, o que significa que ele verificará qualquer número de transações disponíveis dos logs a serem enviados ao banco de dados de distribuição. Se houver 10 operações INSERT executadas por meio de uma única transação e confirmadas no banco de dados do Publicador, um único lote poderá conter 1 transação com 10 comandos.

Se forem identificadas muitas transações com comandos menores, o Log Reader Agent combinará várias transações ou o XACT número de sequência para um único Lote de Replicação. Mas ele é armazenado como um XACT diferente Sequência número nas MSRepl_transactions tabela. Comandos individuais pertencentes a essa transação serão capturados nos MSRepl_commands tabela.

Para verificar o que discutimos acima, estou atualizando a ModifiedDate coluna da dbo.AWBuildVersion tabela para a data de hoje e veja o que acontece:
UPDATE AdventureWorks.dbo.AWBuildVersion
SET ModifiedDate  = GETDATE()

Antes de executar o UPDATE, verificamos os registros presentes nos MSrepl_commands e MSrepl_transactions tabelas:

Agora, execute o script UPDATE acima e verifique os registros presentes nessas 2 tabelas:

Um novo registro com o horário UPDATE foi inserido no MSrepl_transactions tabela com o entry_time próximo . Verificando o comando neste xact_seqno mostrará a lista de comandos agrupados logicamente usando o sp_browsereplcmds procedimento.

No Replication Monitor, podemos ver uma única instrução UPDATE capturada em 1 transação(ões) com 1 comando(s) do Publicador para o Distribuidor.

E podemos ver o mesmo comando sendo entregue do Distribuidor para o Assinante em uma fração de segundo de diferença. Indica que a Replicação está ocorrendo corretamente.

Agora, se houver um grande número de transações combinadas em um único xact_seqno , podemos ver mensagens como 10 transações com 5.000 comandos entregues .

Vamos verificar isso executando UPDATE em 2 tabelas diferentes ao mesmo tempo:

Podemos ver dois registros de transação em MSrepl_transactions tabela combinando as duas operações UPDATE e, em seguida, o no. de registros nessa tabela que correspondem ao nº. de registros atualizados.

O resultado das MSrepl_transactions tabela:

O resultado dos MSrepl_commands tabela:

No entanto, notamos que essas 2 transações são agrupadas logicamente pelo Log Reader Agent e combinadas em um único lote como 2 transações com 109225 comandos.

Mas antes disso, podemos ver mensagens como Delivering Replicated transaction, xact count:1, command count 46601 .

Isso acontecerá até que o Log Reader Agent verifique o conjunto completo de alterações e identifique que 2 transações UPDATE foram totalmente lidas nos logs transacionais.

Uma vez que os comandos são totalmente lidos dos logs transacionais, vemos que 2 transações com 109225 comandos foram entregues pelo agente Log Reader:

Como o agente de distribuição está aguardando a replicação de uma transação enorme, podemos ver uma mensagem como Entregando transações replicadas indicando que houve uma grande transação sendo replicada e precisamos esperar que ela seja replicada completamente.

Uma vez replicado, podemos ver a mensagem abaixo também no Distribution Agent:

Várias maneiras são úteis para resolver esses problemas.

Maneira 1:CRIAR novo procedimento armazenado SQL


Você precisa criar um novo procedimento armazenado e encapsular a lógica do aplicativo nele no escopo da Transação.

Depois de criado, adicione esse artigo do procedimento armazenado à Replicação e altere a propriedade do artigo Replicar para Execução do procedimento armazenado opção.

Isso ajudará a executar o artigo do Procedimento Armazenado no Assinante em vez de replicar todas as alterações de dados individuais que estavam acontecendo.

Vamos analisar como a Execução do procedimento armazenado opção para Replicar reduz a carga na Replicação. Para fazer isso, podemos criar um procedimento armazenado de teste conforme mostrado abaixo:
CREATE procedure test_proc
AS
BEGIN
UPDATE AdventureWorks.dbo.AWBuildVersion
SET ModifiedDate  = GETDATE()

UPDATE TOP(10) Production.TransactionHistoryArchive
SET ModifiedDate  = GETDATE()

UPDATE TOP(10) Person.Person
SET ModifiedDate  = GETDATE()
END

O procedimento acima ATUALIZA um único registro na AWBuildVersion tabela e 10 registros cada no Production.TransactionHistoryArchive e Pessoa.Pessoa tabelas totalizando até 21 alterações de registros.

Depois de criar esse novo procedimento no Publicador e no Assinante, adicione-o à Replicação. Para isso, clique com o botão direito do mouse em Publicação e escolha o artigo de procedimento para Replicação com o padrão Apenas definição de procedimento armazenado opção.

Uma vez feito, podemos verificar os registros disponíveis em MSrepl_transactions e MSrepl_commands mesas.

Agora, vamos executar o procedimento no banco de dados do Publisher para ver quantos registros são rastreados.

Podemos ver o seguinte nas tabelas de distribuição MSrepl_transactions e MSrepl_commands :

Três xact_seqno foram criados para três operações UPDATE no MSrepl_transactions table, e 21 comandos foram inseridos no MSrepl_commands tabela.

Abra o Replication Monitor e veja se eles são enviados como 3 lotes de replicação diferentes ou um único lote com 3 transações juntas.

Podemos ver que três xact_seqno foi consolidado como um único lote de replicação. Assim, podemos ver que 3 transações com 21 comandos foram entregues com sucesso.

Vamos remover o procedimento da Replicação e adicioná-lo novamente com a segunda Execução do procedimento armazenado opção. Agora, execute o procedimento e veja como os registros estão sendo replicados.

A verificação de registros das tabelas de distribuição mostra os detalhes abaixo:

Agora, execute o procedimento no banco de dados do Publicador e veja quantos registros estão sendo registrados nas tabelas de distribuição. A execução de um procedimento atualizou 21 registros (1 registro, 10 registros e 10 registros) como anteriormente.

A verificação das tabelas de distribuição mostra os dados abaixo:

Vamos dar uma olhada rápida em sp_browsereplcmds para ver o comando real recebido:

O comando é “{call “dbo”..”test_proc” }” que será executado no banco de dados do Assinante.

No Replication Monitor, podemos ver que apenas 1 transação(ões) com 1 comando(s) foi entregue via Replicação:

Em nosso caso de teste, usamos um procedimento com apenas 21 alterações de dados. No entanto, se fizermos isso para um procedimento complicado envolvendo milhões de alterações, a abordagem do procedimento armazenado com a Execução do procedimento armazenado opção será eficiente na redução da carga de replicação.

Precisamos validar essa abordagem verificando se o procedimento tem lógica para atualizar apenas o mesmo conjunto de registros nos bancos de dados do Publicador e do Assinante. Caso contrário, isso criará problemas de inconsistência de dados no Publicador e no Assinante.

Maneira 2:configurando os parâmetros do agente do leitor de log MaxCmdsInTran, ReadBatchSize e ReadBatchThreshold


MaxCmdsInTran – indica o número máximo de Comandos que podem ser agrupados logicamente em uma Transação durante a leitura de dados do banco de dados de Logs Transacionais do Publicador e gravados no banco de dados de Distribuição.

Em nossos testes anteriores, notamos que cerca de 109.225 comandos foram acumulados em uma única sequência exata de replicação, resultando em leve lentidão ou latência. Se definirmos o MaxCmdsInTran parâmetro para 10000, a única sequência exata número será dividido em 11 sequências xact resultando em entrega mais rápida de comandos do Publicador para o Distribuidor . Embora essa opção ajude a reduzir a contenção do banco de dados de Distribuição e a replicar os dados mais rapidamente do Publicador para o banco de dados do Assinante, tenha cuidado ao usar essa opção. Ele pode acabar entregando os dados ao banco de dados do Assinante e acessando-os das tabelas do banco de dados do Assinante antes do final do escopo da transação original.

ReadBatchSize – Esse parâmetro pode não ser útil para um único cenário de transação enorme. No entanto, ajuda quando há muitas e muitas transações menores acontecendo no banco de dados do Publicador.

Se o número de comandos por transação for menor, o Log Reader Agent combinará várias alterações em um único escopo de transação de comando de replicação. O tamanho do Lote de Leitura indica quantas transações podem ser lidas no log de transações antes de enviar as alterações para o banco de dados de distribuição. Os valores podem estar entre 500 e 10000.

ReadBatchThreshold – indica o número de comandos a serem lidos do log transacional do banco de dados do Publicador antes de serem enviados ao Assinante com um valor padrão de 0 para verificar o arquivo de log completo. No entanto, podemos reduzir esse valor para enviar dados mais rapidamente, limitando-o a 10.000 ou 100.000 comandos assim.

Maneira 3:configurando os melhores valores para o parâmetro SubscriptionStreams


Streams de assinatura – indica o número de conexões que um agente de Distribuição pode executar em paralelo para buscar dados do banco de dados de Distribuição e propagá-los para o banco de dados de Assinante. O valor padrão é 1, sugerindo apenas um fluxo ou conexão da distribuição para o banco de dados do assinante. Os valores podem ser de 1 a 64. Se mais fluxos de assinatura forem adicionados, isso poderá resultar em congestionamento de CXPACKET (em outras palavras, paralelismo). Portanto, você deve ter cuidado ao configurar esta opção em Produção.

Para resumir, tente evitar grandes INSERT, UPDATE ou DELETE em uma única transação. Se for impossível eliminar essas operações, a melhor opção seria testar as formas acima e escolher aquela que melhor se adapte às suas condições específicas.

Bloqueios no banco de dados de distribuição


O banco de dados de distribuição é o coração da replicação transacional do SQL Server e, se não for mantido adequadamente, haverá muitos problemas de desempenho.

Para resumir todas as práticas recomendadas para a configuração do banco de dados de distribuição, precisamos garantir que as configurações abaixo sejam feitas corretamente:
  1. Os arquivos de dados dos bancos de dados de distribuição devem ser colocados em unidades de alto IOPS. Se o banco de dados do Publicador tiver muitas alterações de dados, precisamos garantir que o banco de dados de distribuição seja colocado em uma unidade com alto IOPS. Ele estará continuamente recebendo dados do agente Log Reader, enviando dados para o banco de dados do Assinante através do agente de Distribuição. Todos os dados replicados serão removidos do banco de dados de distribuição a cada 10 minutos por meio do trabalho de limpeza de distribuição.
  2. Configure as propriedades Tamanho do arquivo inicial e Crescimento automático do banco de dados Distribuição com os valores recomendados com base nos níveis de atividade do banco de dados Publicador. Caso contrário, isso levará à fragmentação de dados e arquivos de log, causando problemas de desempenho.
  3. Inclua bancos de dados de distribuição nos trabalhos regulares de manutenção de índice configurados nos servidores onde o banco de dados de distribuição está localizado.
  4. Inclua bancos de dados de distribuição na programação de tarefas de backup completo para solucionar problemas específicos.
  5. Certifique-se de que a Limpeza da distribuição:distribuição o trabalho está sendo executado a cada 10 minutos de acordo com o agendamento padrão. Caso contrário, o tamanho do banco de dados de distribuição continua aumentando e leva a problemas de desempenho.

Como notamos até agora, no banco de dados de distribuição, as principais tabelas envolvidas são MSrepl_transactions e MSrepl_commands . Os registros são inseridos lá pelo trabalho do Log Reader Agent, selecionados pelo trabalho do agente de distribuição, aplicados no banco de dados do Assinante e, em seguida, excluídos ou limpos pelo trabalho do agente de limpeza de distribuição.

Se o banco de dados de distribuição não estiver configurado corretamente, podemos encontrar bloqueios de sessão nessas duas tabelas, o que resultará em problemas de desempenho de replicação do SQL Server.

Podemos executar a consulta abaixo em qualquer banco de dados para visualizar as sessões de bloqueio disponíveis na instância atual do SQL Server:
SELECT * 
FROM sys.sysprocesses
where blocked > 0
order by waittime desc

Se a consulta acima retornar algum resultado, podemos identificar comandos nessas sessões bloqueadas executando o DBCC INPUTBUFFER(spid) comando do console e execute as ações de acordo.

Questões relacionadas à corrupção


Um banco de dados SQL Server usa seu algoritmo ou lógica para armazenar dados em tabelas e mantê-los em extensões ou páginas. A corrupção de banco de dados é um processo pelo qual o estado físico dos arquivos/extensões/páginas relacionados ao banco de dados muda de normal para estado instável ou sem recuperação, tornando a recuperação de dados mais difícil ou impossível.

Todos os bancos de dados do SQL Server são propensos a corrupções de banco de dados. As causas podem ser:
  • Falhas de hardware, como problemas de disco, armazenamento ou controlador;
  • Falhas do sistema operacional do servidor, como problemas de correção;
  • Falhas de energia resultando em desligamento abrupto dos servidores ou desligamento inadequado do banco de dados.

Se pudermos recuperar ou reparar bancos de dados sem perda de dados, a replicação do SQL Server não será afetada. No entanto, se houver alguma perda de dados ao recuperar ou reparar bancos de dados corrompidos, começaremos a receber muitos problemas de integridade de dados que discutimos em nosso artigo anterior.

Corrupções podem acontecer em vários componentes, como:
  • Dados do editor/corrupções no arquivo de log
  • Corrupções nos dados do assinante/arquivo de log
  • Corrupções nos dados do banco de dados de distribuição/arquivo de log
  • Corrupções nos dados do banco de dados Msdb/arquivo de log

Se recebermos muitos problemas de integridade de dados após corrigir problemas de corrupção, é recomendável remover completamente a replicação, corrigir todos os problemas de corrupção no banco de dados do editor, assinante ou distribuidor e reconfigurar a replicação para corrigi-la. Caso contrário, os problemas de integridade de dados persistirão e levarão à inconsistência de dados entre o Publicador e o Assinante. O tempo necessário para corrigir os problemas de integridade de dados no caso de bancos de dados corrompidos será muito maior em comparação com a configuração da Replicação do zero. Hence identify the level of Corruption encountered and take optimal decisions to resolve the Replication issues faster.

Wondering why msdb database corruption can harm Replication? Since msdb database hold all details related to SQL Server Agent Jobs including Replication Agent jobs, any corruption on msdb database will harm Replication. To recover quickly from msdb database corruptions, it is recommended to restore msdb database from the last Full Backup of msdb database. This also signifies the importance of taking Full Backups of all system databases including msdb database.

Conclusão


Thanks for successfully going through the final power-packed article about the Performance issues in the SQL Server Transactional Replication. If you have gone through all articles carefully, you should be able to troubleshoot almost any Transactional Replication-based issues and fix them out efficiently.

If you need any further guidance or have any Transactional Replication-related issues in your environment, you can reach out to me for consultation. And if I missed anything essential in this article, you are welcome to point to that in the Comments section.