it-swarm.com.de

Verfügbarkeitsgruppe zum Ermitteln der letzten Failover-Zeit

Ich möchte nur wissen, ob es eine Möglichkeit gibt, bei einem Failover der AG-Gruppe eine Abfrage durchzuführen.

zB - das ist jetzt das primäre Replikat, aber ich bin mir ziemlich sicher, dass es gestern das sekundäre war? Wie kann ich feststellen, wann das Failover stattgefunden hat?

gibt es etwas Spezielles in den Protokollen, nach denen ich suchen sollte, oder gibt es ein TsQL-Skript, das verwendet werden kann?

4
Trubs

Sie können das folgende PowerShell-Skript verwenden, um die letzte Failover-Zeit abzurufen

    Get-winEvent -ComputerName ListnerName -filterHashTable @{logname ='Microsoft-Windows-FailoverClustering/Operational'; id=1641}| ft -AutoSize -Wrap 
8
mashrur

Sie können ein Überwachungsskript (oder eine SQL-Überwachungslösung eines Drittanbieters) einrichten, um die verschiedenen Spalten der DMV sys.dm_hadr_availability_replica_states regelmäßig abzufragen (z. B. alle 30 Sekunden) und setzen Sie einen Zeitstempel darauf, wann Sie die Werte gesammelt haben.

Die speziellen Spalten von Interesse, die sich auf Failover-Ereignisse beziehen, sind:

  • last_connect_error_number
  • last_connect_error_description
  • last_connect_error_timestamp

Zusätzliche Spalten, die es wert sind, verfolgt zu werden:

  • rolle
  • operation_state
  • verbundener_Zustand

Detailliertere Beschreibung der obigen Spalten:

sys.dm_hadr_availability_replica_states (Transact-SQL)

Eine Übersicht aller DMVs für AlwaysOn-Verfügbarkeitsgruppen mit Links zu weiteren Details finden Sie auf MSDN:

Monitor Availability Groups (Transact-SQL)

4

Obwohl es schwierig ist herauszufinden, wann das letzte Failover aufgetreten ist, können Sie eine Benachrichtigung (Warnung) erhalten, wenn das Failover auftritt ... (Sie können dann Ihre E-Mail durchsuchen?)

Sie können eine Warnung erstellen, um Sie (oder Ihr Team) über die Fehlernummer 1480 zu informieren, wenn ein Failover aufgetreten ist

1]

Hinweis: Dadurch wird eine E-Mail für jede Datenbank in der AG (auf jedem Server) gesendet, in meinem Fall 12 Datenbanken auf 2 Servern. Auf der Registerkarte Optionen können Sie Delay between responses: auf ungefähr 1 Minute, so dass nur eine E-Mail pro Minute gesendet wird.

3
Trubs

Im Folgenden werden die Failover-Zeit und -Richtung für jede Datenbank für alle Failover-Ereignisse auf dem Server aufgeführt, auf dem dies ausgeführt wird, wobei T-SQL wie angefordert verwendet wird.

-- Script to determine failover times in Availability Group 

;WITH cte_HADR AS (SELECT object_name, CONVERT(XML, event_data) AS data
FROM sys.fn_xe_file_target_read_file('AlwaysOn*.xel', null, null, null)
WHERE object_name = 'error_reported'
)

SELECT data.value('(/event/@timestamp)[1]','datetime') AS [timestamp],
       data.value('(/event/data[@name=''error_number''])[1]','int') AS [error_number],
       data.value('(/event/data[@name=''message''])[1]','varchar(max)') AS [message]
FROM cte_HADR
WHERE data.value('(/event/data[@name=''error_number''])[1]','int') = 1480
3
DonB

Wenn das Failover erfolgreich ist, haben Windows-Ereignisprotokolle einen Eintrag

Der Status des lokalen Verfügbarkeitsreplikats in der Verfügbarkeitsgruppe '' wurde von 'RESOLVING_NORMAL' in 'PRIMARY_PENDING' geändert.

Der Status des lokalen Verfügbarkeitsreplikats in der Verfügbarkeitsgruppe '' wurde von 'PRIMARY_PENDING' in 'PRIMARY_NORMAL' geändert.

Dieser MS KB-Artikel enthält Details zur Fehlermeldung und Sie können PowerShell-Skript verwenden, um Ihnen E-Mails basierend auf bestimmten Ereignissen zu senden.

Abgesehen vom Windows-Ereignisprotokoll können Sie Cluster Diagnostic Extended Event Log mit einem Format anzeigen, das - ServerName_InstanceName_SQLDIAG_*.xel Ähnelt.

2
Kin Shah
SELECT @FileName = target_data.value('(EventFileTarget/File/@name)[1]','nvarchar(4000)')
FROM (
SELECT
CAST(target_data AS XML) target_data
FROM sys.dm_xe_sessions s
JOIN sys.dm_xe_session_targets t
ON s.address = t.event_session_address
WHERE s.name = N'AlwaysOn_health'
) ft

SELECT 
XEData.value('(event/@timestamp)[1]','datetime2(3)') AS event_timestamp,
XEData.value('(event/data[@name="previous_state"]/text)[1]', 'varchar(255)') AS previous_state,
XEData.value('(event/data[@name="current_state"]/text)[1]', 'varchar(255)') AS current_state,
XEData.value('(event/data[@name="availability_replica_name"]/value)[1]', 'varchar(255)') AS availability_replica_name,
XEData.value('(event/data[@name="availability_group_name"]/value)[1]', 'varchar(255)') AS availability_group_name
INTO #Temp FROM (
SELECT CAST(event_data AS XML) XEData, *
FROM sys.fn_xe_file_target_read_file(@FileName, NULL, NULL, NULL)
WHERE object_name = 'availability_replica_state_change'
) event_data
WHERE XEData.value('(event/data[@name="current_state"]/text)[1]', 'varchar(255)') = 'PRIMARY_NORMAL'
ORDER BY event_timestamp DESC;
0