AG 中记录发送队列大小和重做队列大小

Beg*_*DBA 5 performance sql-server availability-groups sql-server-2017

我正在尝试找出监控这两个事件的方法

  1. 记录发送队列大小 - 我可以在 perfmon 中看到这一点

  2. 重做队列大小 - 我可以在 dmv 中看到,但在 perfmon 计数器中看不到

有没有什么方法可以使用 perfmon,以便我可以计算重做队列大小,即使计数器在 perfmon 中不可用?

另外,我发现这些事件在属于数据库镜像的一部分时会记录在 Windows 事件查看器中。但现在使用 AG,如何在 Windows 事件查看器中记录这 2 个超出特定范围的值?

编辑

我所说的警报是指我们在 AG 中是否有一些内容,如此处所示,作为从数据库镜像看到的消息?

AMt*_*two 5

日志发送队列和重做队列都可以在sys.sys.dm_hadr_database_replica_states(文档) 中找到,也可以使用SQLServer:Database ReplicaPerfmon 计数器 (文档) 来使用。

\n

性能蒙

\n

使用 Perfmon 计数器,您需要在每个副本上单独收集计数器。每个副本都知道影响该副本本身的发送/重做(恢复)队列。

\n

听起来您已经找到了Log Send Queueperfmon 计数器,其定义为:

\n
\n

主数据库日志文件中尚未发送到辅助副本的日志记录数量(以千字节为单位)。该值从主副本发送到辅助副本。队列大小不包括发送到辅助设备的 FILESTREAM 文件。

\n
\n

Redo Queue 的 perfmon 计数器实际上就是计数器Recovery Queue,其定义为:

\n
\n

辅助副本的日志文件中尚未重做的日志记录数量。

\n
\n

您还可以通过查询 DMV 使用 T-SQL 访问 Perfmon 计数器sys.dm_os_performance_counters

\n
SELECT *\nFROM sys.dm_os_performance_counters\nWHERE object_name = \'SQLServer:Database Replica\'\nAND counter_name IN (\'Log Send Queue\',\'Recovery Queue\')\nORDER BY cntr_value DESC;\n
Run Code Online (Sandbox Code Playgroud)\n

T-SQL / DMV

\n

从 T-SQL 中,您可以查询 DMV 以获取此信息。下面的查询来自我的标准工具箱,包括发送和重做队列大小和速率(在前几列中),以及有关副本状态和发送/重做状态的一些其他信息。请注意,在主副本上运行此命令将报告所有副本的状态信息,在辅助副本上运行此命令将仅报告该辅助副本的本地信息。

\n

通过 T-SQL 进行监控的优点是,您可以拥有单个/中央收集点来立即检查所有副本的状态。

\n
-- \xe2\x96\xb6 Run this on **PRIMARY**\nSET NOCOUNT ON;\nSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;\n\nSELECT \n    --AG info\n    AGName                          = ag.name, \n    ReplicaServer                   = ar.replica_server_name, \n    DbName                          = adc.database_name, \n    -- Queue Size & rates\n    SendQueueSize                   = drs.log_send_queue_size,\n    RedoQueueSize                   = drs.redo_queue_size, \n    SendRateKb                      = drs.log_send_rate, \n    RedoRateKb                      = drs.redo_rate, \n    -- State Info\n    IsLocal                         = drs.is_local, \n    IsPrimary                       = drs.is_primary_replica, \n    SynchronizationState            = drs.synchronization_state_desc, \n    SynchronizationHealthState      = drs.synchronization_health_desc, \n    -- Last ____ Time\n    LastSentTime                    = drs.last_sent_time, \n    LastRedoTime                    = drs.last_redone_time, \n    LastReceivedTime                = drs.last_received_time, \n    LastHardenedTime                = drs.last_hardened_time, \n    LastCommitTime                  = drs.last_commit_time, \n    -- LSN info\n    RecoveryLSN                     = drs.recovery_lsn, \n    TruncationLSN                   = drs.truncation_lsn, \n    LastSentLSN                     = drs.last_sent_lsn, \n    LastReceivedLSN                 = drs.last_received_lsn, \n    LastHardenedLSN                 = drs.last_hardened_lsn, \n    LastRedoneLSN                   = drs.last_redone_lsn, \n    EndOfLogLSN                     = drs.end_of_log_lsn, \n    LastCommitLSN                   = drs.last_commit_lsn,\n    --Oh yeah, filestream, too\n    FileStreamSendRate              = drs.filestream_send_rate\nFROM sys.dm_hadr_database_replica_states AS drs\nJOIN sys.availability_databases_cluster AS adc \n    ON drs.group_id = adc.group_id AND drs.group_database_id = adc.group_database_id\nJOIN sys.availability_groups AS ag\n    ON ag.group_id = drs.group_id\nJOIN sys.availability_replicas AS ar \n    ON drs.group_id = ar.group_id AND drs.replica_id = ar.replica_id\nORDER BY \n    -- ag.name, ar.replica_server_name, adc.database_name;\n    drs.log_send_queue_size + drs.redo_queue_size DESC;\n
Run Code Online (Sandbox Code Playgroud)\n

警报

\n

如果您没有能够直接监视 Perfmon 计数器或 DMV 的监控产品,您可以使用 SQL Server 代理警报系统侵入警报。

\n

在对象资源管理器 --> SQL Server 代理 --> 警报中,选择创建新警报\n新警报菜单

\n

在“新警报”窗口的“常规”选项卡上,选择要监视的 Perfmon 计数器以及警报阈值。\n新警报-一般

\n

在“响应”选项卡上,您可以选择发送电子邮件以通知 SQL 代理操作员或执行 SQL 代理作业。您可以让 SQL 代理作业响应运行 T-SQL 或 PowerShell,从而执行几乎任何操作(例如记录到 Windows 事件日志)。\n新警报响应

\n