Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Niektóre informacje diagnostyczne dotyczące grupy dostępności Always On (AG) mogą być uzyskane z buforów pierścieniowych SQL Server lub dynamicznego widoku zarządzania (sys.dm_os_ring_buffers DMV). Bufory cykliczne są tworzone podczas uruchamiania serwera SQL Server i rejestrują alerty w systemie SQL Server na potrzeby diagnostyki wewnętrznej. Nie są one obsługiwane, ale nadal można wyodrębnić cenne informacje z nich podczas rozwiązywania problemów. Te bufory pierścieniowe zapewniają inne źródło diagnostyki, gdy SQL Server przestaje odpowiadać lub się zawiesił.
Następujące zapytanie Transact-SQL (T-SQL) pobiera wszystkie zdarzenia z bufora pierścienia AG.
SELECT * FROM sys.dm_os_ring_buffers WHERE ring_buffer_type LIKE '%HADR%'
Aby zwiększyć możliwości zarządzania danymi, przefiltruj dane według daty i typu buforu pierścieniowego. Poniższe zapytanie pobiera rekordy z określonego bufora cyklicznego, które wystąpiły dzisiaj.
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
Kolumna record w każdym rekordzie zawiera dane diagnostyczne w formacie XML. Dane XML różnią się między typami buforów kołowych. Aby uzyskać więcej informacji na temat każdego typu bufora pierścieniowego, zobacz Typy bufora pierścieniowego grupy dostępności. Aby zwiększyć czytelne dane XML, należy dostosować zapytanie T-SQL w celu wyodrębnienia żądanych elementów XML. Na przykład następujące zapytanie pobiera wszystkie zdarzenia z buforu pierścienia RING_BUFFER_HADRDBMGR_API i formatuje dane XML w oddzielne kolumny tabeli.
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
Typy buforów cyklicznych grupy dostępności
W sys.dm_os_ring_buffers znajdują się cztery bufory pierścieniowe AG. W poniższej sekcji opisano typy buforów pierścieniowych oraz przykładową zawartość kolumny record dla każdego typu bufora pierścieniowego.
RING_BUFFER_HADRDBMGR_API
Rejestruje przejścia stanu, które miały miejsce lub mają miejsce. Podczas przeglądania przejść stanu należy zwrócić szczególną uwagę na wartości 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
Rejestruje wewnętrzne wywołania metod lub funkcji dokonywane przez aktywność AG. Może wyświetlać informacje, takie jak wstrzymanie, wznowienie lub zmiany roli, w tym zarówno punkty wejścia, jak i wyjścia.
<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>
Stan Transportu Bufora Pierścieniowego HADR
<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>
Analizowanie danych XML z buforu pierścieniowego
Możesz przeanalizować pole Record w buforze pierścieniowym, który inspekcjonujesz, przy użyciu metody value() (typ danych XML) w swoim zapytaniu. Aby użyć tej metody, należy najpierw rzutować kolumnę rekordu w buforze pierścieniowym do formatu XML. Na przykład następujące zapytanie pokazuje, jak przekształcić RING_BUFFER_HADRDBMGR_API w czytelny format przy użyciu tej metody.
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