Quantcast
Channel: SQL Server High Availability and Disaster Recovery forum
Viewing all articles
Browse latest Browse all 4689

Availability Group latency query.

$
0
0

Greetings. I want to start tracking, and eventually alert on excessive AG latency. I've taken most of the query from this link and also modified it a bit to come up with the query below. However, it's not behaving quite as I'd expected. To test this I shut down the Secondary node in my AG. While the syncState and syncHealth values do change immediately when I rerun the query, no other values do. So my "seconds behind primary" values never gets above 0, and I also expected to see a discrepancy between the last_sent_time and last_recieved_time values, but they're always the same. My end goal is to be able to insert these values into a table and alert on the values, but I first need to make sure that my collection is correct. Should I simply rely on syncState and syncHealth for what I'm after, or is there better info to alert on?

Thanks!

SELECT AGS.NAME AS AGGroupName
    ,AR.replica_server_name AS InstanceName
    ,HARS.role_desc
    ,Db_name(DRS.database_id) AS DBName

    ,AR.availability_mode_desc AS SyncMode
    ,DRS.synchronization_state_desc AS SyncState
	,DRS.synchronization_health_desc as SyncHealth
    ,DRS.last_hardened_time
    ,DRS.last_redone_time
    ,DRS.log_send_queue_size
	,DRS.redo_rate
    ,DRS.redo_queue_size AS 'Redo_Queue_Size(KB)'
	,last_sent_time, last_received_time


      /*
    if the last_hardened_lsn from the primary server == last_hardened_lsn from secondary server
    then there is NO LATENCY
    */
    ,'seconds behind primary' = CASE
            WHEN EXISTS (
                    SELECT DRS.last_hardened_lsn
                    FROM (
                        (
                            sys.availability_groups AS AGS INNER JOIN sys.availability_replicas AS AR ON AGS.group_id = AR.group_id
                            ) INNER JOIN sys.dm_hadr_availability_replica_states AS HARS ON AR.replica_id = HARS.replica_id
                        )
                    INNER JOIN sys.dm_hadr_database_replica_states DRS ON AGS.group_id = DRS.group_id
                        AND DRS.replica_id = HARS.replica_id
                    WHERE HARS.role_desc = 'PRIMARY'
                        AND DRS.last_hardened_lsn = DRS.last_hardened_lsn
                    )
                THEN 0
            ELSE datediff(s, last_hardened_time, getdate())
            end
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)

Thanks in advance! ChrisRDBA




Viewing all articles
Browse latest Browse all 4689

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>