サブスクリプション待機時間

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

このモニターは、サブスクライバーへの配信を待機しているディストリビューション データベース内のコマンドの待機時間を確認します。このモニターはマージ サブスクリプションでは無効にされることに注意してください。

Knowledge Base article:

概要

このモニターは、未配布のコマンド タブの保留中のコマンドを示すレプリケーション モニターと類似した情報を、それらのコマンドの推定配布時間と共に収集します。推定時間がしきい値の期間よりも長い場合、警告が発生し情報が表示されます。なお、このモニターはマージ サブスクリプションでは無効にされることに注意してください。

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

原因

ディストリビューション エージェントが停止した可能性があります。

パブリッシャー データベースに多数のコマンドがコミットされており、ディストリビューション データベースにレプリケートされている場合、保留中のトランザクションが多数ある場合があります。

ディストリビューション データベースからの読み取りまたはサブスクライバー データベースへの書き込みで、ディストリビューション エージェントにパフォーマンスの問題が発生している可能性があります。

解決方法

-MaxDeliveredTransactions と -Continuous の両方を指定した場合、ディストリビューション エージェントでは指定した数のトランザクションが配信され、(-Continuous を指定した場合も) 停止されます。ジョブの完了後は配布エージェントを再開する必要があります。

パブリッシャー データベースのトランザクション量が多いために警告が発生されている場合、推定配信時間を評価します。推定配信時間がスナップショットの作成および適用よりも長い場合は、サブスクリプションの再初期化をご検討ください。

ディストリビューション データベースの読み取りでディストリビューション エージェントにパフォーマンス上の問題が発生している場合、ディストリビューション テーブルに対して fullscan オプションで統計の更新を実行します。

サブスクライバーへの書き込みでディストリビューション エージェントにパフォーマンス上の問題が発生している場合、サブスクライバー データベースに対するブロックまたはリソース待機を確認し、それを解決します。

追加

ディストリビューション エージェントのパフォーマンスを改善するには、次のパラメーター値を変更してテストしてください。

CommitBatchSize

COMMIT ステートメントが発行される前に、サブスクライバーに発行されるトランザクション数。既定値は 100 です。

QueryTimeOut

クエリがタイムアウトするまでの秒数。既定値は 1800 秒です。

SubscriptionStreams

サブスクライバーに変更のバッチを並列実行で適用するために、ディストリビューション エージェントあたりに許可される接続数。SQL Server パブリッシャーの場合、1 から 64 の値の範囲がサポートされます。

外部

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

上書き可能なパラメーター

名前

説明

既定値

アラートの優先順位

アラートの優先度を定義します。

標準

アラートの重大度

アラートの重要度を定義します。

警告

有効

ワークフローを有効または無効にします。

はい

アラートを生成する

ワークフローがアラートを生成するかどうかを定義します。

はい

間隔 (秒)

ワークフローを実行する定期的な実行間隔 (秒)。

300

同期時刻

同期時刻

 

しきい値

しきい値

60

タイムアウト (秒)

ワークフローが終了して失敗とマークされるまでの、ワークフローの許容実行時間を指定します。

200

データベース接続のタイムアウト (秒)

指定された期間中にデータベースにアクセスできない場合、ワークフローは失敗し、イベントが登録されます。

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
MSSQL on Windows レプリケーション: サブスクリプションで、ディストリビューション データベース内のコマンドの待機時間が長いことが検出されました。
サブスクリプション '{0}' は適用を待機している保留コマンドの長い推定時間を検出しました。
推定時間: {1} 秒
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>
<NetbiosComputerName>$Target/Host/Host/Property[Type='SqlCoreLib!Microsoft.SQLServer.Core.DBEngine']/NetbiosComputerName$</NetbiosComputerName>
<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>