Sql-Server-2012

可用性組的最早未發送事務警報

  • May 24, 2021

在 SQL Server 2008 中,當使用數據庫鏡像時,可以在最舊的未發送事務超過某個門檻值時設置警報。我們可以使用 Launch Database Mirroring Monitor 菜單命令檢查任何數據庫鏡像的狀態。

在 SQL Server 2012 中,我們現在有可用性組。在我看來,存在同樣的潛在問題,如果事務無法發送到輔助伺服器,那麼鏡像將被暫停,並且事務日誌可能會填滿我們所有的磁碟空間。但是,Database Mirroring Monitor 工具似乎無法將可用性組中的數據庫辨識為已鏡像。

如果最舊的未發送交易超過某個值,有沒有辦法設置警報?有沒有辦法設置那個特定的值?

非常有趣的問題..

根據我的理解,我將嘗試回答這個問題。

其他專家可以糾正我的錯誤。


AlwaysON 與數據庫鏡像不同,尤其是在將日誌發送到輔助副本時。

不同之處在於日誌塊如何發送到鏡像實例(用於鏡像)或副本(用於 AlwaysON)。

對於數據庫鏡像

  • 它將日誌塊刷新到磁碟,並在本地完成後,將日誌塊發送到輔助伺服器。

對於始終開啟

  • 它使用主節點上的輔助日誌掃描器將日誌塊並行刷新到輔助節點。
  • 美妙之處在於,即使在主 I/O 完成之前,輔助節點可能已經硬化了日誌塊,這提高了性能並縮小了NOT IN SYNC視窗。
  • 現在有趣的部分是監控上述場景,有進度消息。輔助節點向主節點發送消息,指示強化的 LSN 級別。主要使用該資訊來幫助確定同步狀態。

因此,沒有像鏡像這樣的警報機制實際上能夠知道最舊的未發送交易。**唯一知道的方法是使用 DMV。**以及可能的擴展事件。

作為旁注,您可以使用基於策略的管理來監控您的 AlwaysON 執行狀況

下面是我用來監控我的 AlwaysON 環境的查詢:

/************************************************************************************************
Author      :   Kin Shah
Purpose     :   Find "How far is secondary behind primary"

               Written for DBA.STACKEXCHANGE.COM
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Disclaimer  :   Any scripts found on internet you must irst
                   - understand what it is doing
                   - then test it if it suits your requirements
               I am not responsible for any data loss or any blue screen that you might get.
                    ^^^
               *** USE THIS AS PER YOUR OWN RISK ****
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
*************************************************************************************************/

SELECT AGS.NAME AS AGGroupName
   ,AR.replica_server_name AS InstanceName
   ,HARS.role_desc
   ,Db_name(DRS.database_id) AS DBName
   ,DRS.database_id
   ,is_ag_replica_local = CASE 
       WHEN DRS.is_local = 1
           THEN N'LOCAL'
       ELSE 'REMOTE'
       END
   ,AR.availability_mode_desc AS SyncMode
   ,DRS.synchronization_state_desc AS SyncState
   ,DRS.last_hardened_lsn
   ,DRS.end_of_log_lsn
   ,DRS.last_redone_lsn
   ,DRS.last_hardened_time
   ,DRS.last_redone_time
   ,DRS.log_send_queue_size
   ,DRS.redo_queue_size AS 'Redo_Queue_Size(KB)'
   /*
   if the last_hardened_lsn from the primary server == last_hardened_lsn from secondary server
   then there is NO LATENCY
   */
   ,DATEDIFF(SECOND, DRS.last_redone_time, DRS.last_hardened_time)
FROM sys.dm_hadr_database_replica_states DRS
LEFT JOIN sys.availability_replicas AR ON DRS.replica_id = AR.replica_id
LEFT JOIN sys.availability_groups AGS ON AR.group_id = AGS.group_id
LEFT JOIN sys.dm_hadr_availability_replica_states HARS ON AR.group_id = HARS.group_id
   AND AR.replica_id = HARS.replica_id
ORDER BY Db_name(DRS.database_id)
   ,is_ag_replica_local

參考 :

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