Latência de assinatura

Microsoft.SQLServer.Replication.Windows.Monitor.SubscriptionLongEstimatedTimeMonitor (UnitMonitor)

Esse monitor verifica a latência dos comandos no banco de dados de Distribuição aguardando a entrega para os Assinantes. Observe que esse monitor está desabilitado para Assinaturas de Mesclagem.

Knowledge Base article:

Resumo

Esse monitor coleta informações similares ao monitor de replicação que exibe os comandos pendentes na guia Comandos Não Distribuídos, juntamente com o tempo previsto para a entrega dos comandos. Se o tempo previsto for maior do que o tempo de limite, um alerta será acionado para exibir a informações. Observe que o monitor está desabilitado para Assinaturas de Mesclagem.

http://msdn.microsoft.com/library/ms183374.aspx

Causas

O agente de Distribuição pode ter parado.

Pode haver grandes quantidades de transações pendentes, com muitos comandos confirmados no banco de dados do Publicador e replicados no banco de dados de distribuição;

Problemas de desempenho podem ter ocorrido no agente de Distribuição ao ler do banco de dados de distribuição ou ao gravar no banco de dados do Assinante.

Resoluções

Se -MaxDeliveredTransactions e -Continuous forem ambos especificados, O Agente de Distribuição entrega o número determinado de transações e depois é interrompido (mesmo se -Continuous for especificado). Você deve reiniciar o Agente de Distribuição após o trabalho ser completado.

Se o alerta ocorrer devido a um grande volume de transações no banco de dados do Publicador, avalie a hora prevista de entrega. Considere reinicializar a assinatura se o tempo previsto de entrega for maior que criar e aplicar um instantâneo.

Se houver problemas de desempenho no agente de distribuição ao ler do banco de dados de distribuição, execute atualização de estatísticas com fullscan nas tabelas de distribuição.

Se o agente de distribuição estiver com problemas de desempenho ao gravar no Assinante, verifique e resolva todos os bloqueios ou esperas por recursos no banco de dados do Assinante.

Adicional

Teste se a alteração dos valores de parâmetros abaixo pode ajudar no desempenho do agente de distribuição:

CommitBatchSize

O número de transações a serem emitidas ao Assinante antes da emissão de uma instrução COMMIT. O padrão é 100.

QueryTimeOut

O número de segundos antes do tempo limite da consulta. O padrão é 1.800 segundos.

SubscriptionStreams

O número de conexões permitidas por Agente de Distribuição para a aplicação de lotes de alterações em paralelo a um Assinante. Para um Publicador do SQL Server, há suporte a um intervalo de valores de 1 a 64

Externo

https://msdn.microsoft.com/library/ms173804.aspx)

Parâmetros Substituíveis

Nome

Descrição

Valor Padrão

Prioridade do Alerta

Define a Prioridade do Alerta.

Normal

Severidade do Alerta

Define a Severidade do Alerta.

Aviso

Habilitado

Habilita ou desabilita o fluxo de trabalho.

Sim

Gera Alertas

Define se o fluxo de trabalho gera ou não um Alerta.

Sim

Intervalo (segundos)

O intervalo de tempo recorrente em segundos no qual executar o fluxo de trabalho.

300

Tempo de Sincronização

Tempo de Sincronização

 

Limite

Limite

60

Tempo limite (segundos)

Especifica a quantidade de tempo que o fluxo de trabalho tem permissão para executar antes de ser fechado e marcado como com falha.

200

Tempo limite da conexão de banco de dados (segundos)

O fluxo de trabalho falhará e registrará um evento, se ele não conseguir acessar o banco de dados durante o período especificado.

15

Element properties:

TargetMicrosoft.SQLServer.Replication.Windows.Subscription
Parent MonitorSystem.Health.PerformanceState
CategoryPerformanceHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.Replication.Windows.MonitorType.SubscriptionLongEstimatedTime
RemotableTrue
AccessibilityPublic
Alert Message
Replicação do MSSQL no Windows: Alta Latência Detectada para Comandos no Banco de Dados de Distribuição da Assinatura.
A Assinatura '{0}' detectou um longo tempo previsto para comandos pendentes aguardando aplicação.
Tempo previsto: {1}s
RunAsMicrosoft.SQLServer.Core.RunAs.Monitoring

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.Replication.Windows.Monitor.SubscriptionLongEstimatedTimeMonitor" Accessibility="Public" Enabled="true" Target="SQLReplWD!Microsoft.SQLServer.Replication.Windows.Subscription" ParentMonitorID="Health!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.Replication.Windows.MonitorType.SubscriptionLongEstimatedTime" ConfirmDelivery="false" RunAs="SqlCoreLib!Microsoft.SQLServer.Core.RunAs.Monitoring">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.Replication.Windows.Monitor.SubscriptionLongEstimatedTime.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Warning</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type='MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription']/SubscriptionName$</AlertParameter1>
<AlertParameter2>$Data/Context/Property[@Name='EstimatedTime']$</AlertParameter2>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Health" MonitorTypeStateID="Health" HealthState="Success"/>
<OperationalState ID="Warning" MonitorTypeStateID="Warning" HealthState="Warning"/>
</OperationalStates>
<Configuration>
<MachineName>$Target/Host/Host/Property[Type='SqlCoreLib!Microsoft.SQLServer.Core.DBEngine']/MachineName$</MachineName>
<InstanceName>$Target/Host/Host/Property[Type='SqlCoreLib!Microsoft.SQLServer.Core.DBEngine']/InstanceName$</InstanceName>
<SqlTimeoutSeconds>15</SqlTimeoutSeconds>
<ConnectionString>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/Distributor$</ConnectionString>
<MonitoringType>$Target/Host/Host/Property[Type="SqlDiscW!Microsoft.SQLServer.Windows.DBEngine"]/MonitoringType$</MonitoringType>
<SubscriptionType>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/Type$</SubscriptionType>
<PublisherName>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/Publisher$</PublisherName>
<Subscriber>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/Subscriber$</Subscriber>
<PublisherDb>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/PublicationDatabase$</PublisherDb>
<SubscriberDb>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/SubscriptionDatabase$</SubscriberDb>
<Publication>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/PublicationName$</Publication>
<ReplicationType>$Target/Property[Type="MSRL!Microsoft.SQLServer.Replication.Core.GenericSubscription"]/ReplicationType$</ReplicationType>
<EstimatedTimeSecondsThreshold>60</EstimatedTimeSecondsThreshold>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<TimeoutSeconds>200</TimeoutSeconds>
<CheckMachineAndInstanceName>false</CheckMachineAndInstanceName>
</Configuration>
</UnitMonitor>