Delen via


Ringbuffers gebruiken om statusinformatie te verkrijgen over AlwaysOn-beschikbaarheidsgroepen

Van toepassing op:SQL Server

Sommige diagnostische AlwaysOn-beschikbaarheidsgroepgegevens (AG) kunnen worden verkregen uit de SQL Server-ringbuffers of de sys.dm_os_ring_buffers dynamische beheerweergave (DMV). De ringbuffers worden gemaakt tijdens het opstarten van SQL Server en registreren waarschuwingen in het SQL Server-systeem voor interne diagnostische gegevens. Ze worden niet ondersteund, maar u kunt er nog steeds waardevolle informatie uit ophalen bij het oplossen van problemen. Deze ringbuffers bieden een andere bron van diagnostische gegevens wanneer SQL Server niet meer reageert of is vastgelopen.

Met de volgende Transact-SQL (T-SQL)-query worden alle gebeurtenisrecords opgehaald uit de AG-ringbuffers.

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

Als u de gegevens beter beheerbaar wilt maken, filtert u de gegevens op datum en het type ringbuffer. Met de volgende query worden records opgehaald uit de opgegeven ringbuffer die vandaag heeft plaatsgevonden.

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

De record kolom in elke record bevat diagnostische gegevens in XML-indeling. De XML-gegevens verschillen tussen de ringbuffertypen. Zie Beschikbaarheidsgroep-ringbuffertypen voor meer informatie over elk type ringbuffer. Als u de XML-gegevens beter leesbaar wilt maken, moet u uw T-SQL-query aanpassen om de gewenste XML-elementen te extraheren. Met de volgende query worden bijvoorbeeld alle gebeurtenissen opgehaald uit de RING_BUFFER_HADRDBMGR_API ringbuffer en worden de XML-gegevens opgemaakt in afzonderlijke tabelkolommen.

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

Ringbuffertypen van beschikbaarheidsgroepen

Er zijn vier AG-ringbuffers in sys.dm_os_ring_buffers. In de volgende sectie worden de ringbuffertypen en een voorbeeld van de inhoud van de record kolom voor elk ringbuffertype beschreven.

RING_BUFFER_HADRDBMGR_API

Registreert statusovergangen die hebben plaatsgevonden of plaatsvinden. Let bij het bekijken van de statusovergangen goed op de objectType waarden.

<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

Registreert interne methode- of functie-aanroepen die worden uitgevoerd door AG-activiteit. Er kan informatie worden weergegeven, zoals onderbreken, hervatten of wijzigingen in rol, inclusief zowel de begin- als de eindpunten.

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

XML-gegevens parseren uit een ringbuffer

U kunt het Record veld parseren uit de ringbuffer die u inspecteert met behulp van de methode value() (XML-gegevenstype) in uw query. Als u deze methode wilt gebruiken, moet u eerst de recordkolom in de ringbuffer casten naar XML. De volgende query laat bijvoorbeeld zien hoe u RING_BUFFER_HADRDBMGR_API met deze methode kunt parseren naar een leesbaar formaat.

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

Volgende stappen