sp_server_diagnostics (Transact-SQL)
Si applica a: SQL Server
Acquisisce dati diagnostici e informazioni di integrità su SQL Server per rilevare potenziali errori. La procedura viene eseguita in modalità di ripetizione e i risultati vengono inviati periodicamente. Può essere richiamato da una connessione normale o da una connessione amministrativa dedicata.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
sp_server_diagnostics [ @repeat_interval = ] 'repeat_interval'
[ ; ]
Argomenti
[ @repeat_interval = ] 'repeat_interval'
Indica l'intervallo di tempo in cui la stored procedure viene eseguita ripetutamente per inviare informazioni sull'integrità.
@repeat_interval è int con l'impostazione predefinita .0
I valori dei parametri validi sono 0
o qualsiasi valore uguale o maggiore di 5
. È necessario eseguire la stored procedure per almeno 5 secondi per restituire i dati completi. Il valore minimo per l'esecuzione della stored procedure in modalità di ripetizione è 5 secondi.
Se questo parametro non è specificato o se il valore specificato è 0
, la stored procedure restituisce i dati una volta e quindi esci.
Se il valore specificato è minore del valore minimo, genera un errore e non restituisce nulla.
Se il valore specificato è uguale o maggiore di 5
, la stored procedure viene eseguita ripetutamente per restituire lo stato di integrità fino a quando non viene annullata manualmente.
Valori del codice restituito
0
(esito positivo) o 1
(errore).
Set di risultati
sp_server_diagnostics
restituisce le informazioni seguenti.
Colonna | Tipo di dati | Descrizione |
---|---|---|
create_time |
datetime | Indica il timestamp della creazione della riga. Ogni riga di un singolo set di righe dispone dello stesso timestamp. |
component_type |
sysname | Indica se la riga contiene informazioni per il componente a livello di istanza di SQL Server o per un gruppo di disponibilità AlwaysOn:instance Always On:AvailabilityGroup |
component_name |
sysname | Indica il nome del componente o il nome del gruppo di disponibilità:system resource query_processing io_subsystem events <name of the availability group> |
state |
int | Indica lo stato di integrità del componente. Può essere uno dei valori seguenti: 0 , 1 , 2 o 3 |
state_desc |
sysname | Descrive la colonna contenente gli stati. Le descrizioni che corrispondono ai valori nella colonna contenente gli stati sono: 0: Unknown 1: clean 2: warning 3: error |
data |
varchar (max) | Indica dati specifici del componente. |
Di seguito sono riportate le descrizioni dei cinque componenti:
system: raccoglie i dati dal punto di vista del sistema su spinlock, condizioni di elaborazione gravi, attività che non producono, errori di pagina e utilizzo della CPU. Queste informazioni producono un'indicazione dello stato di integrità complessiva.
risorsa: raccoglie i dati dal punto di vista delle risorse in memoria fisica e virtuale, pool di buffer, pagine, cache e altri oggetti memoria. Queste informazioni producono un'indicazione dello stato di integrità complessiva.
query_processing: raccoglie i dati dal punto di vista dell'elaborazione delle query sui thread di lavoro, sulle attività, sui tipi di attesa, sulle sessioni a elevato utilizzo della CPU e sulle attività di blocco. Queste informazioni producono un'indicazione dello stato di integrità complessiva.
io_subsystem: raccoglie i dati in I/O. Oltre ai dati diagnostici, questo componente produce uno stato di integrità di avviso o integro e pulito solo per un sottosistema di IO.
eventi: raccoglie dati e superfici tramite la stored procedure sugli errori e sugli eventi di interesse registrati dal server, inclusi i dettagli sulle eccezioni del buffer circolare, gli eventi del buffer circolare relativi al broker di memoria, memoria insufficiente, monitoraggio dell'utilità di pianificazione, pool di buffer, spinlock, sicurezza e connettività. Gli eventi mostrano
0
sempre come stato.<nome del gruppo> di disponibilità: raccoglie i dati per il gruppo di disponibilità specificato (se
component_type = "Always On:AvailabilityGroup"
).
Osservazioni:
Dal punto di vista degli errori, i system
componenti , resource
e query_processing
vengono usati per il rilevamento degli errori mentre i io_subsystem
componenti e events
vengono usati solo a scopo diagnostico.
Nella tabella seguente viene eseguito il mapping dei componenti agli stati di integrità associati.
Componenti | Pulito (1) | Avviso (2) | Errore (3) | Sconosciuto (0) |
---|---|---|---|---|
system |
x | x | x | |
resource |
x | x | x | |
query_processing |
x | x | x | |
io_subsystem |
x | x | ||
events |
x |
In x
ogni riga rappresenta gli stati di integrità validi per il componente. Ad esempio, io_subsystem
viene visualizzato come clean
o warning
. Non mostra gli stati di errore.
Nota
La sp_server_diagnostics
procedura interna viene implementata in un thread preemptive con priorità alta.
Autorizzazioni
È richiesta l'autorizzazione VIEW SERVER STATE
per il server.
Esempi
È consigliabile usare sessioni eventi estesi per acquisire le informazioni sull'integrità e salvarle in un file che si trova all'esterno di SQL Server. Pertanto, è comunque possibile accedervi in caso di errore.
R. Salvare l'output da una sessione eventi estesi in un file
Nell'esempio seguente viene salvato l'output da una sessione eventi in un file:
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. Leggere il log delle sessioni degli eventi estesi
La query seguente legge il file di log delle sessioni degli eventi estesi in 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. Acquisire l'output sp_server_diagnostics
in una tabella
L'esempio seguente acquisisce l'output di sp_server_diagnostics
in una tabella in modalità non ripetuta:
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;
La query seguente legge l'output di riepilogo dalla tabella di esempio:
SELECT create_time,
component_name,
state_desc
FROM SpServerDiagnosticsResult;
D. Leggere l'output dettagliato da ogni componente
Nell'esempio seguente viene eseguita una query per leggere parte dell'output dettagliato di ogni componente, nella tabella creata nell'esempio precedente.
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
Monitoraggio risorse:
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
Attese nonpreemptive:
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
Attese preemptive:
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
Richieste a elevato utilizzo di 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
Report processo bloccato:
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
Input/output:
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
Informazioni sugli eventi:
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