Búferes de anillo de AlwaysOn

SQL Server 2012
 

Información de diagnóstico AlwaysOn puede obtenerse de los búferes de anillo de SQL Server o la vista de administración dinámica (DMV) de sys.dm_os_ring_buffers. Los búferes de anillo se crean durante el inicio de SQL Server y las alertas de registro en el sistema de SQL Server para el diagnóstico interno. No se admiten, pero todavía puede extraer información valiosa de ellos al solucionar problemas. Estos búferes de anillo proporcionan otra fuente de diagnósticos cuando SQL Server se bloquea o ha dejado de funcionar.

La siguiente consulta de Transact-SQL (T-SQL) recupera todos los registros de eventos de los búferes de anillo de AlwaysOn.

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

Para hacer que los datos más fáciles de administrar, filtrar los datos por fecha y el tipo de búfer de anillo. La siguiente consulta recupera registros desde el búfer de anillo especificado ocurridos hoy en día.

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

La columna del registro en cada registro contiene datos de diagnóstico en formato XML. Los datos XML difieren entre los tipos de búfer de anillo. Para obtener más información sobre cada tipo de búfer de anillo, consulte tipos de búfer de anillo de AlwaysOn. Para que los datos XML sea más legible, debe personalizar la consulta de T-SQL para extraer los elementos XML deseados. Por ejemplo, la consulta siguiente recupera todos los eventos desde el búfer de anillo RING_BUFFER_HADRDBMGR_API y da formato a los datos XML en columnas de tabla independiente.

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  

Hay 4 búferes de anillo de AlwaysOn en sys.dm_os_ring_buffers. La siguiente tabla describe los tipos de búfer de anillo y un ejemplo del contenido de la columna del registro para cada tipo de búfer de anillo.

RING_BUFFER_HADRDBMGR_API

Las transiciones de estado de los registros que han tenido colocar o están llevando a cabo. Cuando se examinan las transiciones de estado preste especial atención a los valores de 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

Registros método o función llamadas internas realizadas por las actividades de AlwaysOn. Pueden mostrar información como suspender, reanudar o cambios de rol, incluidos los puntos de entrada y salida.

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

Puede analizar el campo de registro desde el búfer de anillo que está inspeccionando utilizando valor ( ) Método ( tipo de datos xml ) en la consulta. Para usar este método, primero debe conversión la columna del registro en el búfer de anillo en XML. Por ejemplo, la consulta siguiente muestra cómo analizar RING_BUFFER_HADRDBMGR_API en formato legible con este método.

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  

Mostrar: