SQL Server Availability Groups (AG) provide high
availability and disaster recovery solutions for critical databases.
Understanding the history of failovers in an AG is crucial for tracking changes
in primary and secondary nodes, ensuring system stability, and diagnosing
potential issues. In this blog post, we'll share a handy script that allows
you to access and analyze the failover history of the primary node within a SQL
Server cluster.
Please find the gitHub Link for the same.
/* Script origin :https://dba.stackexchange.com/questions/76016/how-to-check-history-of-primary-node-in-an-availability-group Reshared @ : https://dbascrolls.com Full Credit to auther. */ declare @xel_path varchar(1024); declare @utc_adjustment int = datediff(hour, getutcdate(), getdate()); ------------------------------------------------------------------------------- ------------------- target event_file path retrieval -------------------------- ------------------------------------------------------------------------------- ;with target_data_cte as ( select target_data = convert(xml, target_data) from sys.dm_xe_sessions s inner join sys.dm_xe_session_targets st on s.address = st.event_session_address where s.name = 'alwayson_health' and st.target_name = 'event_file' ), full_path_cte as ( select full_path = target_data.value('(EventFileTarget/File/@name)[1]', 'varchar(1024)') from target_data_cte ) select @xel_path = left(full_path, len(full_path) - charindex('\', reverse(full_path))) + '\AlwaysOn_health*.xel' from full_path_cte; ------------------------------------------------------------------------------- ------------------- replica state change events ------------------------------- ------------------------------------------------------------------------------- ;with state_change_data as ( select object_name, event_data = convert(xml, event_data) from sys.fn_xe_file_target_read_file(@xel_path, null, null, null) ) select object_name, event_timestamp = dateadd(hour, @utc_adjustment, event_data.value('(event/@timestamp)[1]', 'datetime')), ag_name = event_data.value('(event/data[@name = "availability_group_name"]/value)[1]', 'varchar(64)'), previous_state = event_data.value('(event/data[@name = "previous_state"]/text)[1]', 'varchar(64)'), current_state = event_data.value('(event/data[@name = "current_state"]/text)[1]', 'varchar(64)') from state_change_data where object_name = 'availability_replica_state_change' order by event_timestamp desc;
Monitoring the history of failovers in a SQL Server Availability Group is an essential task for database administrators. The script shared in this blog post provides a convenient method to access and analyze replica state change events, helping you pinpoint the exact moment a secondary node assumed the role of the primary node.