Etkin SQL Server bağlantılarını nasıl görebilirim?


298

SQL Server 2008 Enterprise kullanıyorum. Herhangi bir aktif SQL Server bağlantısını ve hangi IP adresinden hangi veritabanına bağlandığına benzer tüm bağlantıların ilgili bilgilerini görmek istiyorum.

Bu sorunu çözmek için mevcut komutlar var mı?



sys.dm_exec_sessions, kontrol edilecek oturum kimliği> 50
Shiwangini

Yanıtlar:


354

sp_whoSaklı yordamı kullanabilirsiniz .

Microsoft SQL Server Veritabanı Altyapısı örneğinde geçerli kullanıcılar, oturumlar ve işlemler hakkında bilgi sağlar. Bilgiler yalnızca boşta olmayan, belirli bir kullanıcıya ait olan veya belirli bir oturuma ait olan işlemleri döndürmek için filtrelenebilir.


9
sys.sysprocesses arasından belirli bir db seçmek için filtre gerektiğinde
Iman

yalnızca belirli veritabanları için nasıl filtre eklerim? NEREDE dbname = 'veritabanı adı' ?? Bunu denedim ve bir hata aldım
NULL.Dude

1
@ Geo.Dude, Iman Abidi sys.sysprocesses kendi seçme sorgunuzu hazırlamak ve bu sorguya bir nerede yan tümcesi eklemek anlamına gelir. Dbid'e filtre uygulamanız gerekir. Veritabanı kimliğini sys.databases içinde bulabilirsiniz (veya bu ikisine katılabilirsiniz).
bvgheluwe

342
SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame
;

Ayrıca sys.sysprocesses için Microsoft belgelerine bakın .


5
Bir şeyleri otomatikleştirirken, bu sorgu görüntülenmeye yönelik daha sp_who'dan daha yararlı olabilir.
Colin

Bu benim tercih ettiğim yöntem, ama OP'nin sorusuna tam olarak cevap vermiyor. Hangi istemcilerin bağlı olduğunu görmek hostnameiçin SELECTve GROUP BYmaddelerine eklemenizi öneririz. Ayrıca sadece Msft yazım hatası fark ettim loginame- bu sütun isimleri 8 karakter ile sınırlı olduğu bir eser mi? lol
hiçbir şey gereksiz

13
sys.sysprocesses, SQL Server'ın daha yeni sürümlerinde kullanımdan kaldırılmıştır . Bu üç yönetim görünümüyle eşleşir: sys.dm_exec_connections, sys.dm_exec_sessions ve sys.dm_exec_requests.
Mike Sherrill 'Cat Recall'

I like toORDER BY 1, 2 DESC, 3
slartidan


44

Araç çubuğundaki "etkinlik izleyici" simgesini tıklayın ...

Thorsten'in yorumlarından:

SQL Server Management Studio'da Sunucu'ya sağ tıklayın, bağlam menüsünden "Etkinlik Monitörü" nü seçin -veya- Ctrl+ Alt+ klavye kısayolunu kullanın A.


12
SQL Server Management Studio'da Sunucu'ya sağ tıklayın, bağlam menüsünden "Etkinlik Monitörü"

İyi bir seçenek, ancak sys.sysprocesses'ten DB_NAME (dbid) ayıklamasından daha fazla ayrıcalık gerektirir.
Der Zinger

25

Aşağıda, bir veritabanına bağlı tüm oturumları bulmak için komut dosyam var ve bu oturumların herhangi bir G / Ç yapıp yapmadığını ve bunları öldürmek için bir seçenek olup olmadığını kontrol edebilirsiniz.

Komut dosyası ayrıca her oturumun durumunu gösterir.

Aşağıya bir göz atın.

--==============================================================================
-- See who is connected to the database.
-- Analyse what each spid is doing, reads and writes.
-- If safe you can copy and paste the killcommand - last column.
-- Marcelo Miorelli
-- 18-july-2017 - London (UK)
-- Tested on SQL Server 2016.
--==============================================================================
USE master
go
SELECT
     sdes.session_id
    ,sdes.login_time
    ,sdes.last_request_start_time
    ,sdes.last_request_end_time
    ,sdes.is_user_process
    ,sdes.host_name
    ,sdes.program_name
    ,sdes.login_name
    ,sdes.status

    ,sdec.num_reads
    ,sdec.num_writes
    ,sdec.last_read
    ,sdec.last_write
    ,sdes.reads
    ,sdes.logical_reads
    ,sdes.writes

    ,sdest.DatabaseName
    ,sdest.ObjName
    ,sdes.client_interface_name
    ,sdes.nt_domain
    ,sdes.nt_user_name
    ,sdec.client_net_address
    ,sdec.local_net_address
    ,sdest.Query
    ,KillCommand  = 'Kill '+ CAST(sdes.session_id  AS VARCHAR)
FROM sys.dm_exec_sessions AS sdes

INNER JOIN sys.dm_exec_connections AS sdec
        ON sdec.session_id = sdes.session_id

CROSS APPLY (

    SELECT DB_NAME(dbid) AS DatabaseName
        ,OBJECT_NAME(objectid) AS ObjName
        ,COALESCE((
            SELECT TEXT AS [processing-instruction(definition)]
            FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)
            FOR XML PATH('')
                ,TYPE
            ), '') AS Query

    FROM sys.dm_exec_sql_text(sdec.most_recent_sql_handle)

) sdest
WHERE sdes.session_id <> @@SPID
  AND sdest.DatabaseName ='yourdatabasename'
--ORDER BY sdes.last_request_start_time DESC

--==============================================================================

13

Bunu bir araya getirdim, böylece sonuçlarda bazı sorgulamalar yapabilirsin

Declare @dbName varchar(150)
set @dbName = '[YOURDATABASENAME]'

--Total machine connections
--SELECT  COUNT(dbid) as TotalConnections FROM sys.sysprocesses WHERE dbid > 0

--Available connections
DECLARE @SPWHO1 TABLE (DBName VARCHAR(1000) NULL, NoOfAvailableConnections VARCHAR(1000) NULL, LoginName VARCHAR(1000) NULL)
INSERT INTO @SPWHO1 
    SELECT db_name(dbid), count(dbid), loginame FROM sys.sysprocesses WHERE dbid > 0 GROUP BY dbid, loginame
SELECT * FROM @SPWHO1 WHERE DBName = @dbName

--Running connections
DECLARE @SPWHO2 TABLE (SPID VARCHAR(1000), [Status] VARCHAR(1000) NULL, [Login] VARCHAR(1000) NULL, HostName VARCHAR(1000) NULL, BlkBy VARCHAR(1000) NULL, DBName VARCHAR(1000) NULL, Command VARCHAR(1000) NULL, CPUTime VARCHAR(1000) NULL, DiskIO VARCHAR(1000) NULL, LastBatch VARCHAR(1000) NULL, ProgramName VARCHAR(1000) NULL, SPID2 VARCHAR(1000) NULL, Request VARCHAR(1000) NULL)
INSERT INTO @SPWHO2 
    EXEC sp_who2 'Active'
SELECT * FROM @SPWHO2 WHERE DBName = @dbName

sys.sysprocesses kullanımdan kaldırıldı
Marcello Miorelli

5

MS'in KILLkomutun kullanımını açıklayan sorgusu , bağlantı bilgilerinin sağlanması açısından oldukça kullanışlıdır:

SELECT conn.session_id, host_name, program_name,
    nt_domain, login_name, connect_time, last_request_end_time 
FROM sys.dm_exec_sessions AS sess
JOIN sys.dm_exec_connections AS conn
   ON sess.session_id = conn.session_id;

4

Aşağıdaki T-SQL komutunu gerçekleştirebilirsiniz:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.