Sql-Server

在 AG 中記錄發送隊列大小和重做隊列大小

  • April 1, 2022

我試圖找出監控這兩個事件的方法

  1. 記錄發送隊列大小 - 我可以在 perfmon 中看到
  2. 重做隊列大小 - 我可以在 dmv 中看到,但在 perfmon 計數器中看不到

有什麼方法可以使用 perfmon 以便即使計數器在 perfmon 中不可用,我也可以計算重做隊列大小?

此外,當這些事件是數據庫鏡像的一部分時,我看到這些事件被記錄在 Windows 事件查看器中。但是現在使用 AG,如何在 Windows 事件查看器中記錄這兩個值超出一定範圍?

編輯

通過警報,我的意思是我們在 AG中有一些東西,如此處所示,作為從 db 鏡像中看到的消息?

日誌發送隊列和重做隊列都可以在sys.sys.dm_hadr_database_replica_states( docs ) 中找到,也可以使用SQLServer:Database ReplicaPerfmon 計數器 ( docs )。

性能監視器

使用 Perfmon 計數器,您需要在每個副本上單獨收集計數器。每個副本都知道影響該副本本身的發送/重做(恢復)隊列。

聽起來您已經找到了Log Send Queueperfmon 計數器,其定義為:

主數據庫的日誌文件中尚未發送到輔助副本的日誌記錄量(以千字節為單位)。此值從主副本發送到輔助副本。隊列大小不包括發送到輔助節點的 FILESTREAM 文件。

Redo Queue的perfmon計數器其實就是Recovery Queue計數器,定義為:

次要副本的日誌文件中尚未重做的日誌記錄數量。

您還可以通過查詢sys.dm_os_performance_countersDMV 使用 T-SQL 訪問 Perfmon 計數器。

SELECT *
FROM sys.dm_os_performance_counters
WHERE object_name = 'SQLServer:Database Replica'
AND counter_name IN ('Log Send Queue','Recovery Queue')
ORDER BY cntr_value DESC;

T-SQL / DMV

從 T-SQL,您可以查詢 DMV 以獲取此資訊。以下查詢來自我的標準工具箱,包括發送和重做隊列大小和速率(在前幾列中),以及有關副本狀態和發送/重做狀態的一些其他資訊。請注意,在主副本上執行它會報告所有副本的狀態資訊,在輔助副本上執行它只會報告該輔助副本的本地資訊。

通過 T-SQL 進行監控的優點是您可以擁有一個單一/中央收集點來一次檢查所有副本的狀態。

-- ▶ Run this on **PRIMARY**
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT 
   --AG info
   AGName                          = ag.name, 
   ReplicaServer                   = ar.replica_server_name, 
   DbName                          = adc.database_name, 
   -- Queue Size & rates
   SendQueueSize                   = drs.log_send_queue_size,
   RedoQueueSize                   = drs.redo_queue_size, 
   SendRateKb                      = drs.log_send_rate, 
   RedoRateKb                      = drs.redo_rate, 
   -- State Info
   IsLocal                         = drs.is_local, 
   IsPrimary                       = drs.is_primary_replica, 
   SynchronizationState            = drs.synchronization_state_desc, 
   SynchronizationHealthState      = drs.synchronization_health_desc, 
   -- Last ____ Time
   LastSentTime                    = drs.last_sent_time, 
   LastRedoTime                    = drs.last_redone_time, 
   LastReceivedTime                = drs.last_received_time, 
   LastHardenedTime                = drs.last_hardened_time, 
   LastCommitTime                  = drs.last_commit_time, 
   -- LSN info
   RecoveryLSN                     = drs.recovery_lsn, 
   TruncationLSN                   = drs.truncation_lsn, 
   LastSentLSN                     = drs.last_sent_lsn, 
   LastReceivedLSN                 = drs.last_received_lsn, 
   LastHardenedLSN                 = drs.last_hardened_lsn, 
   LastRedoneLSN                   = drs.last_redone_lsn, 
   EndOfLogLSN                     = drs.end_of_log_lsn, 
   LastCommitLSN                   = drs.last_commit_lsn,
   --Oh yeah, filestream, too
   FileStreamSendRate              = drs.filestream_send_rate
FROM sys.dm_hadr_database_replica_states AS drs
JOIN sys.availability_databases_cluster AS adc 
   ON drs.group_id = adc.group_id AND drs.group_database_id = adc.group_database_id
JOIN sys.availability_groups AS ag
   ON ag.group_id = drs.group_id
JOIN sys.availability_replicas AS ar 
   ON drs.group_id = ar.group_id AND drs.replica_id = ar.replica_id
ORDER BY 
   -- ag.name, ar.replica_server_name, adc.database_name;
   drs.log_send_queue_size + drs.redo_queue_size DESC;

警報

如果您沒有能夠直接觀察 Perfmon 計數器或 DMV 的監控產品,您可以使用 SQL Server 代理警報系統破解您的警報。

在對象資源管理器 –> SQL Server 代理 –> 警報中,選擇創建新警報 新警報菜單

在 New Alert 視窗的 General 選項卡上,選擇要監視的 Perfmon 計數器以及警報門檻值。 NewAlert-General

在響應選項卡上,您可以選擇發送電子郵件以通知 SQL 代理操作員或執行 SQL 代理作業。您可以讓 SQL 代理作業響應執行 T-SQL 或 PowerShell,它幾乎可以執行任何操作(例如記錄到 Windows 事件日誌)。 新警報響應

引用自:https://dba.stackexchange.com/questions/278324