web-dev-qa-db-fra.com

Groupe de disponibilité comment déterminer la dernière heure de basculement

Je voudrais juste savoir s'il existe un moyen d'interroger le basculement du groupe AG.

par exemple - c'est la réplique principale maintenant, mais je suis presque sûr que c'était la secondaire hier? Comment savoir quand le basculement a eu lieu

y a-t-il quelque chose de spécifique dans les journaux que je devrais rechercher, ou y a-t-il un script tsql à utiliser?

4
Trubs

Vous pouvez utiliser le script PowerShell suivant pour obtenir la dernière heure de basculement

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

Vous pouvez configurer un script de surveillance (ou une solution de surveillance SQL tierce) pour interroger les différentes colonnes de sys.dm_hadr_available_replica_states DMV sur une planification régulière (par exemple toutes les 30 secondes) et mettez un horodatage dessus lorsque vous avez collecté les valeurs.

Les colonnes d'intérêt particulières liées aux événements de basculement sont les suivantes:

  • last_connect_error_number
  • last_connect_error_description
  • last_connect_error_timestamp

Colonnes supplémentaires qui méritent d'être suivies:

  • rôle
  • état_opérationnel
  • connected_state

Description plus détaillée des colonnes ci-dessus:

sys.dm_hadr_availability_replica_states (Transact-SQL)

Un aperçu de tous les DMV pour les groupes de disponibilité AlwaysOn avec des liens vers plus de détails est disponible sur MSDN:

Surveiller les groupes de disponibilité (Transact-SQL)

4
Christoph Wegener

Bien qu'il soit difficile de savoir quand le dernier basculement s'est produit, vous pouvez recevoir une notification (alerte) lorsque le basculement se produit ... (vous pouvez alors rechercher votre courrier électronique?)

Vous pouvez créer une alerte pour vous informer (ou informer votre équipe) lorsqu'un basculement s'est produit à l'aide de l'erreur numéro 1480

1]

Remarque: Cela enverra un e-mail pour chaque base de données dans l'AG (sur chaque serveur), qui dans mon cas était de 12 bases de données sur 2 serveurs. Dans l'onglet Options, vous pouvez définir Delay between responses: à quelque chose comme 1 minute, de sorte qu'un seul e-mail par minute soit envoyé.

3
Trubs

La liste suivante répertorie l'heure et la direction de basculement pour chaque base de données pour tous les événements de basculement sur le serveur sur lequel cela est exécuté, en utilisant T-SQL comme demandé.

-- 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

Si le basculement réussit, les journaux des événements Windows auront une entrée

L'état de la réplique de disponibilité locale dans le groupe de disponibilité "" est passé de "RESOLVING_NORMAL" à "PRIMARY_PENDING"

L'état de la réplique de disponibilité locale dans le groupe de disponibilité "" est passé de "PRIMARY_PENDING" à "PRIMARY_NORMAL"

Cette article MS KB contient des détails sur le message d'erreur et vous pouvez utiliser script PowerShell pour vous envoyer des e-mails en fonction d'événements spécifiques.

Outre le journal des événements Windows, vous pouvez consulter Journal des événements étendus de diagnostic de cluster avec un format qui ressemble à - ServerName_InstanceName_SQLDIAG_*.xel

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
Santhosh Kanneganti