Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:instanceAlways On:AvailabilityGroup |
component_name |
sysname | Bileşenin adını veya erişilebilirlik grubunun adını gösterir:systemresourcequery_processingio_subsystemevents<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: Unknown1: clean2: warning3: 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