Bagikan melalui


Menggunakan buffer cincin untuk mendapatkan informasi kesehatan tentang grup ketersediaan AlwaysOn

Berlaku untuk:SQL Server

Beberapa informasi grup ketersediaan AlwaysOn (AG) diagnostik dapat diperoleh dari buffer cincin SQL Server, atau sys.dm_os_ring_buffers tampilan manajemen dinamis (DMV). Buffer cincin dibuat selama startup SQL Server, dan merekam pemberitahuan dalam sistem SQL Server untuk diagnostik internal. Mereka tidak didukung, tetapi Anda masih dapat mengekstrak informasi berharga dari mereka saat memecahkan masalah. Buffer cincin ini menyediakan sumber diagnostik lain ketika SQL Server macet atau mengalami crash.

Kueri Transact-SQL (T-SQL) berikut mengambil semua rekaman peristiwa dari buffer cincin AG.

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

Untuk membuat data lebih mudah dikelola, filter data menurut tanggal dan jenis buffer cincin. Kueri berikut mengambil rekaman dari buffer cincin yang ditentukan yang terjadi hari ini.

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

Kolom record di setiap rekaman berisi data diagnostik dalam format XML. Data XML berbeda di antara jenis buffer cincin. Untuk informasi selengkapnya tentang setiap jenis buffer cincin, lihat Jenis buffer cincin grup ketersediaan. Untuk membuat data XML lebih mudah dibaca, Anda perlu mengkustomisasi kueri T-SQL Anda untuk mengekstrak elemen XML yang diinginkan. Misalnya, kueri berikut mengambil semua peristiwa dari buffer cincin RING_BUFFER_HADRDBMGR_API dan memformat data XML ke dalam kolom tabel terpisah.

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

Jenis buffer cincin grup ketersediaan

Ada empat buffer cincin AG di sys.dm_os_ring_buffers. Bagian berikut ini menjelaskan jenis buffer cincin dan sampel konten record kolom untuk setiap jenis buffer cincin.

RING_BUFFER_HADRDBMGR_API

Merekam transisi status yang telah terjadi atau sedang berlangsung. Saat melihat transisi status, perhatikan nilai-nilainya 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

Merekam metode internal atau panggilan fungsi yang dilakukan oleh aktivitas AG. Ini dapat menampilkan informasi seperti menangguhkan, melanjutkan, atau mengubah peran, termasuk titik masuk dan keluar.

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

Mengurai data XML dari buffer cincin

Anda dapat mengurai Record bidang dari buffer cincin yang Anda periksa dengan menggunakan Metode nilai() (Tipe Data xml) dalam kueri Anda. Untuk menggunakan metode ini, Pertama-tama Anda perlu MENTRANSMISIKAN kolom rekaman di buffer cincin ke XML. Misalnya, kueri berikut menunjukkan cara mengurai RING_BUFFER_HADRDBMGR_API ke dalam format yang dapat dibaca menggunakan metode ini.

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

Langkah berikutnya