sp_server_diagnostics (Transact-SQL)
Aplica-se: SQL Server
Captura dados de diagnóstico e informações de integridade sobre o SQL Server para detectar possíveis falhas. O procedimento é executado no modo de repetição e envia resultados periodicamente. Ele pode ser invocado de uma conexão regular ou de uma conexão de administrador dedicada.
Convenções de sintaxe de Transact-SQL
Sintaxe
sp_server_diagnostics [ @repeat_interval = ] 'repeat_interval'
[ ; ]
Argumentos
@repeat_interval [ = ] 'repeat_interval'
Indica o intervalo de tempo no qual o procedimento armazenado é executado repetidamente para enviar informações de integridade.
@repeat_interval é int com o padrão de 0
. Os valores de parâmetro válidos são 0
, ou qualquer valor igual ou maior que 5
. O procedimento armazenado deve ser executado por pelo menos 5 segundos para retornar dados completos. O valor mínimo de execução do procedimento armazenado no modo de repetição é de 5 segundos.
Se esse parâmetro não for especificado ou se o valor especificado for 0
, o procedimento armazenado retornará dados uma vez e, em seguida, sairá.
Se o valor especificado for menor que o valor mínimo, ele gerará um erro e não retornará nada.
Se o valor especificado for igual ou maior que 5
, o procedimento armazenado será executado repetidamente para retornar o estado de integridade até que ele seja cancelado manualmente.
Valores do código de retorno
0
(sucesso) ou 1
(falha).
Conjunto de resultados
sp_server_diagnostics
retorna as informações a seguir.
Coluna | Tipo de dados | Descrição |
---|---|---|
create_time |
datetime | Indica o carimbo de data/hora de criação de linha. Cada linha em um único conjunto de linhas tem o mesmo carimbo de data/hora. |
component_type |
sysname | Indica se a linha contém informações para o componente de nível de instância do SQL Server ou para um grupo de disponibilidade AlwaysOn:instance Always On:AvailabilityGroup |
component_name |
sysname | Indica o nome de componente ou o nome do grupo de disponibilidade:system resource query_processing io_subsystem events <name of the availability group> |
state |
int | Indica o status da integridade do componente. Pode ser um dos seguintes valores: 0 , 1 , 2 , ou 3 |
state_desc |
sysname | Descreve a coluna de estado. Descrições que correspondem aos valores na coluna de estado são: 0: Unknown 1: clean 2: warning 3: error |
data |
varchar (max) | Especifica dados que são específicos do componente. |
Aqui estão as descrições dos cinco componentes:
system: coleta dados de uma perspectiva do sistema sobre spinlocks, condições severas de processamento, tarefas não produtivas, falhas de página e uso da CPU. Essas informações produzem uma recomendação geral do estado de integridade.
resource: coleta dados de uma perspectiva de recurso na memória física e virtual, buffer pools, páginas, cache e outros objetos de memória. Essas informações produzem uma recomendação geral do estado de integridade.
query_processing: coleta dados de uma perspectiva de processamento de consulta nos threads de trabalho, tarefas, tipos de espera, sessões intensivas de CPU e tarefas de bloqueio. Essas informações produzem uma recomendação geral do estado de integridade.
io_subsystem: Coleta dados sobre E/S. Além dos dados de diagnóstico, esse componente produz um estado de integridade limpo ou de integridade de aviso somente para um subsistema de IO.
events: coleta dados e superfícies por meio do procedimento armazenado nos erros e eventos de interesse registrados pelo servidor, incluindo detalhes sobre exceções de buffer de anel, eventos de buffer de anel sobre o agente de memória, memória insuficiente, monitor do agendador, pool de buffers, spinlocks, segurança e conectividade. Os eventos sempre são exibidos
0
como o estado.<nome do grupo> de disponibilidade: coleta dados para o grupo de disponibilidade especificado (se
component_type = "Always On:AvailabilityGroup"
).
Comentários
De uma perspectiva de falha, os system
componentes , resource
e query_processing
são usados para detecção de falhas, enquanto os io_subsystem
componentes e events
são usados apenas para fins de diagnóstico.
A tabela a seguir mapeia os componentes para seus estados de integridade associados.
Componentes | Clean (1) | Warning (2) | Erro (3) | Unknowns (0) |
---|---|---|---|---|
system |
x | x | x | |
resource |
x | x | x | |
query_processing |
x | x | x | |
io_subsystem |
x | x | ||
events |
x |
O x
em cada linha representa estados de integridade válidos para o componente. Por exemplo, io_subsystem
mostra como clean
ou warning
. Ele não mostra os estados de erro.
Observação
O sp_server_diagnostics
procedimento interno é implementado em um thread preemptivo em alta prioridade.
Permissões
Requer a permissão VIEW SERVER STATE
no servidor.
Exemplos
É uma prática recomendada usar sessões de Eventos Estendidos para capturar as informações de integridade e salvá-las em um arquivo localizado fora do SQL Server. Portanto, você ainda pode acessá-lo se houver uma falha.
R. Salvar a saída de uma sessão de Eventos Estendidos em um arquivo
O exemplo a seguir salva a saída de uma sessão de evento em um arquivo:
CREATE EVENT SESSION [diag]
ON SERVER
ADD EVENT [sp_server_diagnostics_component_result] (set collect_data=1)
ADD TARGET [asynchronous_file_target] (set filename='C:\temp\diag.xel');
GO
ALTER EVENT SESSION [diag]
ON SERVER STATE = start;
GO
B. Ler o log da sessão de Eventos Estendidos
A consulta a seguir lê o arquivo de log de sessão de Eventos Estendidos no SQL Server 2016 (13.x):
SELECT xml_data.value('(/event/@name)[1]', 'varchar(max)') AS Name,
xml_data.value('(/event/@package)[1]', 'varchar(max)') AS Package,
xml_data.value('(/event/@timestamp)[1]', 'datetime') AS 'Time',
xml_data.value('(/event/data[@name=''component_type'']/value)[1]', 'sysname') AS SYSNAME,
xml_data.value('(/event/data[@name=''component_name'']/value)[1]', 'sysname') AS Component,
xml_data.value('(/event/data[@name=''state'']/value)[1]', 'int') AS STATE,
xml_data.value('(/event/data[@name=''state_desc'']/value)[1]', 'sysname') AS State_desc,
xml_data.query('(/event/data[@name="data"]/value/*)') AS Data
FROM (
SELECT object_name AS event,
CONVERT(XML, event_data) AS xml_data
FROM sys.fn_xe_file_target_read_file('C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Log\*.xel', NULL, NULL, NULL)
) AS XEventData
ORDER BY TIME;
C. Capturar sp_server_diagnostics
saída para uma tabela
O exemplo a seguir captura a saída de sp_server_diagnostics
para uma tabela em um modo sem repetição:
CREATE TABLE SpServerDiagnosticsResult (
create_time DATETIME,
component_type SYSNAME,
component_name SYSNAME,
[state] INT,
state_desc SYSNAME,
[data] XML
);
INSERT INTO SpServerDiagnosticsResult
EXEC sp_server_diagnostics;
A consulta a seguir lê a saída resumida da tabela de exemplo:
SELECT create_time,
component_name,
state_desc
FROM SpServerDiagnosticsResult;
D. Leia a saída detalhada de cada componente
As consultas de exemplo a seguir leem algumas das saídas detalhadas de cada componente, na tabela criada no exemplo anterior.
Sistema:
SELECT data.value('(/system/@systemCpuUtilization)[1]', 'bigint') AS 'System_CPU',
data.value('(/system/@sqlCpuUtilization)[1]', 'bigint') AS 'SQL_CPU',
data.value('(/system/@nonYieldingTasksReported)[1]', 'bigint') AS 'NonYielding_Tasks',
data.value('(/system/@pageFaults)[1]', 'bigint') AS 'Page_Faults',
data.value('(/system/@latchWarnings)[1]', 'bigint') AS 'Latch_Warnings',
data.value('(/system/@BadPagesDetected)[1]', 'bigint') AS 'BadPages_Detected',
data.value('(/system/@BadPagesFixed)[1]', 'bigint') AS 'BadPages_Fixed'
FROM SpServerDiagnosticsResult
WHERE component_name LIKE 'system'
GO
Monitor de recursos:
SELECT data.value('(./Record/ResourceMonitor/Notification)[1]', 'VARCHAR(max)') AS [Notification],
data.value('(/resource/memoryReport/entry[@description=''Working Set'']/@value)[1]', 'bigint') / 1024 AS [SQL_Mem_in_use_MB],
data.value('(/resource/memoryReport/entry[@description=''Available Paging File'']/@value)[1]', 'bigint') / 1024 AS [Avail_Pagefile_MB],
data.value('(/resource/memoryReport/entry[@description=''Available Physical Memory'']/@value)[1]', 'bigint') / 1024 AS [Avail_Physical_Mem_MB],
data.value('(/resource/memoryReport/entry[@description=''Available Virtual Memory'']/@value)[1]', 'bigint') / 1024 AS [Avail_VAS_MB],
data.value('(/resource/@lastNotification)[1]', 'varchar(100)') AS 'LastNotification',
data.value('(/resource/@outOfMemoryExceptions)[1]', 'bigint') AS 'OOM_Exceptions'
FROM SpServerDiagnosticsResult
WHERE component_name LIKE 'resource'
GO
Esperas não preemptivas:
SELECT waits.evt.value('(@waitType)', 'varchar(100)') AS 'Wait_Type',
waits.evt.value('(@waits)', 'bigint') AS 'Waits',
waits.evt.value('(@averageWaitTime)', 'bigint') AS 'Avg_Wait_Time',
waits.evt.value('(@maxWaitTime)', 'bigint') AS 'Max_Wait_Time'
FROM SpServerDiagnosticsResult
CROSS APPLY data.nodes('/queryProcessing/topWaits/nonPreemptive/byDuration/wait') AS waits(evt)
WHERE component_name LIKE 'query_processing'
GO
Esperas preemptivas:
SELECT waits.evt.value('(@waitType)', 'varchar(100)') AS 'Wait_Type',
waits.evt.value('(@waits)', 'bigint') AS 'Waits',
waits.evt.value('(@averageWaitTime)', 'bigint') AS 'Avg_Wait_Time',
waits.evt.value('(@maxWaitTime)', 'bigint') AS 'Max_Wait_Time'
FROM SpServerDiagnosticsResult
CROSS APPLY data.nodes('/queryProcessing/topWaits/preemptive/byDuration/wait') AS waits(evt)
WHERE component_name LIKE 'query_processing'
GO
Solicitações com uso intensivo de CPU:
SELECT cpureq.evt.value('(@sessionId)', 'bigint') AS 'SessionID',
cpureq.evt.value('(@command)', 'varchar(100)') AS 'Command',
cpureq.evt.value('(@cpuUtilization)', 'bigint') AS 'CPU_Utilization',
cpureq.evt.value('(@cpuTimeMs)', 'bigint') AS 'CPU_Time_ms'
FROM SpServerDiagnosticsResult
CROSS APPLY data.nodes('/queryProcessing/cpuIntensiveRequests/request') AS cpureq(evt)
WHERE component_name LIKE 'query_processing'
GO
Relatório de processo bloqueado:
SELECT blk.evt.query('.') AS 'Blocked_Process_Report_XML'
FROM SpServerDiagnosticsResult
CROSS APPLY data.nodes('/queryProcessing/blockingTasks/blocked-process-report') AS blk(evt)
WHERE component_name LIKE 'query_processing'
GO
Entrada/saída:
SELECT data.value('(/ioSubsystem/@ioLatchTimeouts)[1]', 'bigint') AS 'Latch_Timeouts',
data.value('(/ioSubsystem/@totalLongIos)[1]', 'bigint') AS 'Total_Long_IOs'
FROM SpServerDiagnosticsResult
WHERE component_name LIKE 'io_subsystem'
GO
Informações do evento:
SELECT xevts.evt.value('(@name)', 'varchar(100)') AS 'xEvent_Name',
xevts.evt.value('(@package)', 'varchar(100)') AS 'Package',
xevts.evt.value('(@timestamp)', 'datetime') AS 'xEvent_Time',
xevts.evt.query('.') AS 'Event Data'
FROM SpServerDiagnosticsResult
CROSS APPLY data.nodes('/events/session/RingBufferTarget/event') AS xevts(evt)
WHERE component_name LIKE 'events'
GO