sp_server_diagnostics (Transact-SQL)

Şunlar için geçerlidir: SQL Server

SQL Server hakkında tanı verilerini ve sağlık bilgilerini toplayarak potansiyel arızaları tespit eder. İşlem tekrar modunda çalışır ve periyodik olarak sonuç gönderir. Ya normal bir bağlantıdan ya da özel bir yönetici bağlantıdan çağrılabilir.

Transact-SQL söz dizimi kuralları

Sözdizimi

sp_server_diagnostics [ @repeat_interval = ] 'repeat_interval'
[ ; ]

Argümanlar

Important

Genişletilmiş saklı yordamlar için bağımsız değişkenler, Sözdizimi bölümünde açıklandığı gibi belirli bir sırada girilmelidir. Parametreler sıra dışı girilirse bir hata iletisi oluşur.

[ @repeat_interval = ] 'repeat_interval'

Sağlık bilgisi göndermek için saklanan prosedürün tekrar tekrar çalıştığı zaman aralığını gösterir.

@repeat_intervalint ile varsayılan 0olarak 'dir. Geçerli parametre değerleri 0, veya herhangi bir değer ile eşdeğer veya daha fazladır 5. Depolanan prosedür, tam veri döndürmek için en az 5 saniye çalışmalıdır. Tekrar modunda saklanan prosedürün çalıştırılması için minimum değer 5 saniyedir.

Bu parametre belirtilmemişse veya belirtilen değer 0ise , saklanan prosedür bir kez veri döndürür ve sonra çıkış yapar.

Belirtilen değer minimum değerden küçükse, hata oluşur ve hiçbir şey döndürmez.

Belirtilen değer eşit veya daha 5fazla ise, saklanan prosedür sağlık durumunu geri döndürmek için tekrar tekrar çalışır ve manuel iptal edilir.

Dönüş kodu değerleri

0 (başarı) veya 1 (başarısızlık).

Sonuç kümesi

sp_server_diagnostics aşağıdaki bilgileri geri döndürür.

Column Veri türü Description
create_time datetime Satır oluşturma zaman damgasını gösterir. Tek bir satır setindeki her satırın aynı zaman damgası vardır.
component_type sysname Satırın SQL Server örnek seviyesi bileşeni için mi yoksa her zaman açık erişilebilirlik grubu için mi bilgi içerdiğini gösterir:

instance
Always On:AvailabilityGroup
component_name sysname Bileşenin adını veya erişilebilirlik grubunun adını gösterir:

system
resource
query_processing
io_subsystem
events
<name of the availability group>
state int Bileşenin sağlık durumunu gösterir. Aşağıdaki değerlerden biri olabilir: 0, 1, 2, veya 3
state_desc sysname Eyalet sütununu tanımlıyor. Durum sütunundaki değerlere karşılık gelen açıklamalar şunlardır:

0: Unknown
1: clean
2: warning
3: error
data Varchar (Max) Bileşene özgü verileri belirtir.

İşte beş bileşenin açıklamaları:

  • sistem: Spinlocklar, ciddi işlem koşulları, verim vermeyen görevler, sayfa hataları ve CPU kullanımı hakkında sistem bakış açısından veri toplar. Bu bilgi, genel bir sağlık durumu önerisi oluşturur.

  • kaynak: Fiziksel ve sanal bellek, tampon havuzları, sayfalar, önbellek ve diğer bellek nesneleri hakkında kaynak perspektifinden veri toplar. Bu bilgi, genel bir sağlık durumu önerisi oluşturur.

  • query_processing: Çalışan iş parçacıkları, görevler, bekleme türleri, CPU yoğun oturumlar ve engelleme görevleri hakkında sorgu işleme açısından veri toplar. Bu bilgi, genel bir sağlık durumu önerisi oluşturur.

  • io_subsystem: IO hakkında veri toplar. Tanı verilerine ek olarak, bu bileşen yalnızca bir IO alt sistemi için temiz, sağlıklı veya uyarı sağlık durumu üretir.

  • olaylar: Sunucu tarafından kaydedilen hata ve olaylar hakkında verileri toplar ve yüzeye çıkar; bunlar arasında halka tampon istisnaları, bellek aracı ile ilgili halka tampon olayları, bellek dışı, zamanlayıcı monitörü, tampon havuzu, spinlocklar, güvenlik ve bağlantı gibi detaylar bulunur. Olaylar her zaman eyalet olarak gösterilir 0 .

  • <erişilebilirlik grubunun> adı: Belirtilen erişilebilirlik grubu için veri toplar (eğer component_type = "Always On:AvailabilityGroup").

Açıklamalar

Arıza açısından, system, resource, ve query_processing bileşenleri arıza tespiti için kullanılırken io_subsystem , ve events bileşenleri sadece tanı amaçlı kullanılır.

Aşağıdaki tablo, bileşenleri ilişkili sağlık durumlarına eşlemektedir.

Components Temiz (1) Uyarı (2) Hata (3) Bilinmeyenler (0)
system x x x
resource x x x
query_processing x x x
io_subsystem x x
events x

Her satırdaki kısım, x bileşen için geçerli sağlık durumlarını temsil eder. Örneğin, io_subsystem ya veya warningolarak gösterilirclean. Hata durumlarını göstermiyor.

Note

İç prosedür, sp_server_diagnostics yüksek öncelikli bir önleyici iş parçacığında uygulanır.

İzinler

Sunucuda VIEW SERVER STATE izin gerektirir.

SQL Server 2022 ve üzeri için izinler

Sunucuda VIEW SERVER PERFORMANCE STATE izin gerektirir.

Examples

Sağlık bilgilerini yakalamak ve SQL Server'ın dışındaki bir dosyaya kaydetmek için Genişletilmiş Olaylar oturumlarını kullanmak en iyi uygulamadır. Bu nedenle, bir arıza olursa hâlâ erişebilirsiniz.

A. Genişletilmiş Olaylar oturumundan çıkan çıktıyı bir dosyaya kaydet

Aşağıdaki örnek, bir olay oturumundan çıkan çıktıyı bir dosyaya kaydeder:

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. Genişletilmiş Etkinlikler oturum kaydını okuyun

Aşağıdaki sorgu, SQL Server 2016 (13.x) üzerindeki Genişletilmiş Olaylar oturum günlüğü dosyasını okur:

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\MSSQL16.MSSQLSERVER\MSSQL\Log\*.xel', NULL, NULL, NULL)) AS XEventData
ORDER BY TIME;

C. Bir tabloya çıktı yakalama sp_server_diagnostics

Aşağıdaki örnek, bir sp_server_diagnostics tabloya yapılan çıktıyı tekrarlanmayan modda yakalar:

CREATE TABLE SpServerDiagnosticsResult
(
    create_time DATETIME,
    component_type SYSNAME,
    component_name SYSNAME,
    [state] INT,
    state_desc SYSNAME,
    [data] XML
);

INSERT INTO SpServerDiagnosticsResult
EXECUTE sp_server_diagnostics;

Aşağıdaki sorgu, örnek tablodan özet çıktısını okur:

SELECT create_time,
       component_name,
       state_desc
FROM SpServerDiagnosticsResult;

D. Her bileşenden ayrıntılı çıktıyı okuyun

Aşağıdaki örnek sorgular, önceki örnekte oluşturulan tabloda her bileşenden bazı ayrıntılı çıktıları okuyordu.

Sistem:

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

Kaynak İzleyicisi:

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

Önleyici olmayan beklemeler:

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

Önleyici beklemeler:

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

CPU yoğun talepler:

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

Engellenmiş süreç raporu:

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

Giriş/çıkış:

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

Etkinlik bilgileri:

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