Jak wyświetlić aktywne połączenia z serwerem SQL?

298

Używam SQL Server 2008 Enterprise. Chcę zobaczyć wszystkie aktywne połączenia z serwerem SQL Server i powiązane informacje o wszystkich połączeniach, takie jak adres IP, połączenie z bazą danych lub coś takiego.

Czy istnieją istniejące polecenia, aby rozwiązać ten problem?

George2
źródło
sys.dm_exec_sessions, identyfikator sesji do sprawdzenia> 50
Shiwangini,

Odpowiedzi:

354

Możesz użyć sp_whoprocedury składowanej.

Zawiera informacje o bieżących użytkownikach, sesjach i procesach w wystąpieniu aparatu bazy danych Microsoft SQL Server. Informacje można filtrować, aby zwrócić tylko te procesy, które nie są bezczynne, należą do określonego użytkownika lub należą do określonej sesji.

Mehrdad Afshari
źródło
9
gdy trzeba filtrować dla konkretnej bazy danych, wybierając sys.sysprocesses, lepiej
Iman
jak dodać filtr tylko do określonych baz danych? GDZIE dbname = „nazwa bazy danych”? Próbowałem tego i dostałem błąd
NULL. Koleś
1
@ Geo.Dude, Iman Abidi oznacza stworzenie własnego wybranego zapytania z sys.sysprocesses i dodanie do tego zapytania klauzuli where. Musisz przefiltrować według dbid. Możesz znaleźć identyfikator bazy danych w sys.databases (lub możesz dołączyć do tych dwóch).
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
;

Zobacz także dokumentację Microsoft dotyczącą sys.sysprocesses .

Syed Umar Ahmed
źródło
5
Podczas automatyzacji rzeczy to zapytanie może być bardziej przydatne niż sp_who, który jest bardziej zorientowany na wyświetlanie.
Colin
To moja preferowana metoda, ale nie w pełni odpowiada na pytanie PO. Proponuję dodanie hostnamedo SELECTi GROUP BYklauzul, aby zobaczyć, co klienci są połączone. Właśnie zdałem sobie sprawę z literówki Msft loginame- czy to artefakt z czasów, gdy nazwy kolumn były ograniczone do 8 znaków? lol
nic nie jest potrzebne
13
sys.sysprocesses jest przestarzały w nowszych wersjach SQL Server. Mapuje te trzy widoki zarządzania : sys.dm_exec_connections, sys.dm_exec_sessions i sys.dm_exec_requests.
Mike Sherrill „Cat Recall”
LubięORDER BY 1, 2 DESC, 3
slartidan
56

Oprócz tego sp_whomożesz także skorzystać z „nieudokumentowanej” sp_who2procedury przechowywanej w systemie, która daje bardziej szczegółowe informacje. Zobacz Różnica między sp_who i sp_who2 .

Sklivvz
źródło
16
kto jest podłączony do dbo. pierwszy?
Carl G
44

Kliknij ikonę „monitor aktywności” na pasku narzędzi ...

Z komentarzy Thorsten:

W SQL Server Management Studio kliknij prawym przyciskiem myszy Serwer, wybierz „Monitor aktywności” z menu kontekstowego lub użyj skrótu klawiaturowego Ctrl+ Alt+ A.

Fernando Santos
źródło
12
W SQL Server Management Studio kliknij prawym przyciskiem myszy Serwer, wybierz „Monitor aktywności” z menu kontekstowego lub użyj skrótu klawiaturowego Ctrl + Alt + A
Thorsten Hüglin
Dobra opcja, ale wymaga więcej uprawnień niż ekstrakcja DB_NAME (dbid) z sys.sysprocesses.
Der Zinger
25

Poniżej znajduje się mój skrypt, aby znaleźć wszystkie sesje podłączone do bazy danych. Możesz sprawdzić, czy sesje te wykonują jakieś operacje we / wy i istnieje możliwość ich zabicia.

Skrypt pokazuje także status każdej sesji.

Spójrz poniżej.

--==============================================================================
-- 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

--==============================================================================
Marcello Miorelli
źródło
13

Zrzuciłem to razem, abyś mógł wykonać zapytanie dotyczące wyników

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
Don Rolling
źródło
sys.sysprocesses jest przestarzały
Marcello Miorelli
5

Pytanie MS wyjaśniające użycie KILLpolecenia jest dość przydatne, dostarczając informacji o połączeniu:

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;
Zalakain
źródło
4

Możesz wykonać następujące polecenie T-SQL:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
sinkmanu
źródło