Utiliser des tampons circulaires pour obtenir des informations d’état sur les groupes de disponibilité Always On

S'applique à :SQL Server

Certaines informations de diagnostic relatives aux groupes de disponibilité Always On (AG) peuvent être obtenues à partir des tampons circulaires de SQL Server, ou de la vue de gestion dynamique (DMV) sys.dm_os_ring_buffers. Les mémoires tampons en anneau sont créées durant le démarrage de SQL Server et enregistrent les alertes générées au sein du système SQL Server à des fins de diagnostic interne. Même si elles ne sont pas prises en charge, vous pouvez toujours en déduire des informations utiles pour la résolution des problèmes. Ces mémoires tampons en anneau fournissent une autre source de diagnostics lorsque SQL Server cesse de répondre ou s’est bloqué.

La requête Transact-SQL (T-SQL) suivante extrait tous les enregistrements d’événements des tampons circulaires AG.

SELECT * FROM sys.dm_os_ring_buffers WHERE ring_buffer_type LIKE '%HADR%'

Pour gérer plus facilement les données, filtrez les données par date et type de mémoire tampon en anneau. La requête suivante récupère à partir de la mémoire tampon en anneau spécifiée les enregistrements qui se sont produits aujourd’hui.

DECLARE @start_of_today DATETIME,
    @start_of_tomorrow DATETIME;

SET @start_of_today = CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME);
SET @start_of_tomorrow = DATEADD(DAY, 1, @start_of_today);

DECLARE @runtime DATETIME;

SET @runtime = GETDATE();

SELECT CONVERT(VARCHAR(30), @runtime, 121) AS data_collection_runtime,
    DATEADD(ms, - 1 * (inf.ms_ticks - ring.timestamp), GETDATE()) AS ring_buffer_record_time,
    ring.timestamp AS record_timestamp,
    inf.ms_ticks AS cur_timestamp,
    ring.*
FROM sys.dm_os_ring_buffers ring
CROSS JOIN sys.dm_os_sys_info inf
WHERE ring_buffer_type = '<RING_BUFFER_TYPE>'
    AND DATEADD(ms, - 1 * (inf.ms_ticks - ring.timestamp), GETDATE()) >= @start_of_today
    AND DATEADD(ms, - 1 * (inf.ms_ticks - ring.timestamp), GETDATE()) < @start_of_tomorrow;
GO

La colonne record dans chaque enregistrement contient des données de diagnostic au format XML. Les données XML varient selon le type de mémoire tampon en anneau. Pour plus d’informations sur chaque type de mémoire tampon en anneau, consultez Types de mémoires tampons en anneau des groupes de disponibilité. Pour améliorer la lisibilité des données XML, vous devez personnaliser votre requête T-SQL de manière à extraire les éléments XML qui vous intéressent. Par exemple, la requête suivante récupère tous les événements de la mémoire tampon en anneau RING_BUFFER_HADRDBMGR_API et met en forme les données XML dans des colonnes de table distinctes.

WITH hadr (ts, type, record)
AS (
    SELECT timestamp AS ts,
        ring_buffer_type AS type,
        CAST(record AS XML) AS record
    FROM sys.dm_os_ring_buffers
    WHERE ring_buffer_type = 'RING_BUFFER_HADRDBMGR_API'
    )
SELECT ts,
    type,
    record.value('(./Record/@id)[1]', 'bigint') AS [Record ID],
    record.value('(./Record/@time)[1]', 'bigint') AS [Time],
    record.value('(./Record/HadrDbMgrAPI/dbId)[1]', 'bigint') AS [DBID],
    record.value('(/Record/HadrDbMgrAPI/API)[1]', 'varchar(50)') AS [API],
    record.value('(/Record/HadrDbMgrAPI/Action)[1]', 'varchar(50)') AS [Action],
    record.value('(/Record/HadrDbMgrAPI/role)[1]', 'int') AS [Role],
    record.value('(/Record/Stack)[1]', 'varchar(100)') AS [Call Stack]
FROM hadr
ORDER BY record.value('(./Record/@time)[1]', 'bigint') DESC;
GO

Types de mémoires tampons en anneau des groupes de disponibilité

Il y a quatre tampons circulaires AG dans sys.dm_os_ring_buffers. La section suivante décrit les types de mémoires tampons en anneau et fournit un exemple du contenu de la colonne record pour chaque type de mémoire tampon en anneau.

RING_BUFFER_HADRDBMGR_API

Enregistre les transitions d’état qui ont eu lieu ou qui sont en cours. Quand vous examinez les transitions d’état, soyez attentif aux valeurs objectType.

<Record id="11" type="RING_BUFFER_HADRDBMGR_STATE" time="860243">
  <HadrDbMgrState>
    <objectType>HadrUsers</objectType>
    <currentState>HDbMState_Starting</currentState>
    <proposedState>HDbMState_Started</proposedState>
    <targetState>HDbMState_Started</targetState>
    <legalTransition>Y</legalTransition>
    <role>1</role>
  </HadrDbMgrState>
</Record>

RING_BUFFER_HADRDBMGR_STATE

Enregistre les appels de méthode ou de fonction internes associés à l’activité des groupes de disponibilité. Elle peut afficher des informations sur la suspension, la reprise ou les changements de rôle, notamment les points d’entrée et de sortie.

<Record id="45" type="RING_BUFFER_HADRDBMGR_STATE" time="1723487912">
  <HadrDbMgrState>
    <dbId>5</dbId>
    <objectType>HadrDbMgr</objectType>
    <currentState>HDbMState_Starting</currentState>
    <proposedState>HDbMState_Started</proposedState>
    <targetState>HDbMState_Started</targetState>
    <legalTransition>Y</legalTransition>
    <role>2</role>
  </HadrDbMgrState>
</Record>

RING_BUFFER_HADRDBMGR_COMMIT

<Record id="0" type="RING_BUFFER_HADRDBMGR_COMMIT" time="1723475368">
  <HadrDbMgrCommitPolicy>
    <dbId>5</dbId>
    <replicaId>883a18f5-97d5-450f-8f8f-9983a4fa5299</replicaId>
    <dbHardenPolicy>KillAll</dbHardenPolicy>
    <dbSyncConfig>0x0</dbSyncConfig>
    <syncPartnerCount>0</syncPartnerCount>
    <minSyncPartnerConfig>0</minSyncPartnerConfig>
    <partnerHardenPolicy>KillAll</partnerHardenPolicy>
    <partnerSyncConfig>0x0</partnerSyncConfig>
    <logBlock>0x0000000000000000</logBlock>
    <leaseExpired>Y</leaseExpired>
    <partnerChange>N</partnerChange>
    <role>2</role>
  </HadrDbMgrCommitPolicy>
</Record>

RING_BUFFER_HADR_TRANSPORT_STATE

<Record id="3" type="RING_BUFFER_HADR_TRANSPORT_STATE" time="1723485399">
  <HadrTransportState>
    <agId>08264B79-D10B-412F-B38D-CA07B08E9BD8</agId>
    <localArId>883A18F5-97D5-450F-8F8F-9983A4FA5299</localArId>
    <targetArId>628D6349-72DD-4D18-A6E1-1272645660BA</targetArId>
    <currentState>HadrSession_Configuring</currentState>
    <targetState>HadrSession_Connected</targetState>
    <legalTransition>Y</legalTransition>
  </HadrTransportState>
</Record>

Analyser les données XML à partir d’une mémoire tampon en anneau

Vous pouvez analyser le champ Record de la mémoire tampon en anneau que vous inspectez en ajoutant la méthode value() (type de données xml) dans votre requête. Pour utiliser cette méthode, vous devez d’abord CASTer la colonne record du tampon circulaire en XML. Par exemple, la requête suivante montre comment utiliser cette méthode pour analyser RING_BUFFER_HADRDBMGR_API dans un format lisible.

WITH hadr (ts, type, record)
AS (
    SELECT timestamp AS ts,
        ring_buffer_type AS type,
        CAST(record AS XML) AS record
    FROM sys.dm_os_ring_buffers
    WHERE ring_buffer_type = 'RING_BUFFER_HADRDBMGR_API'
    )
SELECT ts,
    type,
    record.value('(./Record/@id)[1]', 'bigint') AS [Record id],
    record.value('(./Record/@time)[1]', 'bigint') AS [Time],
    record.value('(./Record/HadrDbMgrAPI/dbId)[1]', 'bigint') AS [dbid],
    record.value('(/Record/HadrDbMgrAPI/API)[1]', 'varchar(50)') AS [API],
    record.value('(/Record/HadrDbMgrAPI/Action)[1]', 'varchar(50)') AS [Action],
    record.value('(/Record/HadrDbMgrAPI/role)[1]', 'int') AS [Role],
    record.value('(/Record/Stack)[1]', 'varchar(100)') AS [Call Stack]
FROM hadr
ORDER BY record.value('(./Record/@time)[1]', 'bigint') DESC;
GO