Wie sehe ich aktive SQL Server-Verbindungen?

298

Ich verwende SQL Server 2008 Enterprise. Ich möchte alle aktiven SQL Server-Verbindungen und die zugehörigen Informationen aller Verbindungen anzeigen, z. B. von welcher IP-Adresse, welcher Verbindung zu welcher Datenbank oder etwas anderem.

Gibt es vorhandene Befehle, um dieses Problem zu lösen?

George2
quelle
sys.dm_exec_sessions, zu überprüfende Sitzungs-ID> 50
Shiwangini

Antworten:

354

Sie können die sp_whogespeicherte Prozedur verwenden.

Bietet Informationen zu aktuellen Benutzern, Sitzungen und Prozessen in einer Instanz des Microsoft SQL Server-Datenbankmoduls. Die Informationen können gefiltert werden, um nur die Prozesse zurückzugeben, die nicht inaktiv sind, die einem bestimmten Benutzer gehören oder die zu einer bestimmten Sitzung gehören.

Mehrdad Afshari
quelle
9
Wenn Sie nach einer bestimmten Datenbank filtern müssen, ist die Auswahl aus sys.sysprocesses besser
Iman
Wie würde ich einen Filter nur für bestimmte Datenbanken hinzufügen? WO dbname = 'Datenbankname' ?? Ich habe es versucht und ich habe einen Fehler bekommen
NULL.Dude
1
@ Geo.Dude, Iman Abidi bedeutet, eine eigene Auswahlabfrage aus sys.sysprocesses zu erstellen und dieser Abfrage eine where-Klausel hinzuzufügen. Sie müssen nach dbid filtern. Sie finden die Datenbank-ID in sys.databases (oder Sie können diese beiden verbinden).
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
;

Siehe auch die Microsoft-Dokumentation zu sys.sysprocesses .

Syed Umar Ahmed
quelle
5
Bei der Automatisierung von Dingen ist diese Abfrage möglicherweise nützlicher als sp_who, das sich mehr an der Anzeige orientiert.
Colin
Dies ist meine bevorzugte Methode, aber sie beantwortet die Frage des OP nicht vollständig. Schlagen Sie vor hostname, die Klauseln SELECTund hinzuzufügen, um GROUP BYzu sehen, welche Clients verbunden sind. Außerdem habe ich gerade den Msft-Tippfehler für loginame- ist das ein Artefakt aus der Zeit, als die Spaltennamen auf 8 Zeichen begrenzt waren? lol
nichts ist
13
sys.sysprocesses ist in neueren Versionen von SQL Server veraltet . Es wird diesen drei Verwaltungsansichten zugeordnet : sys.dm_exec_connections, sys.dm_exec_sessions und sys.dm_exec_requests.
Mike Sherrill 'Cat Recall'
Ich magORDER BY 1, 2 DESC, 3
Slartidan
56

Abgesehen davon sp_whokönnen Sie auch die sp_who2gespeicherte Systemprozedur "undokumentiert" verwenden, die Ihnen detailliertere Informationen liefert. Siehe Unterschied zwischen sp_who und sp_who2 .

Sklivvz
quelle
16
Wer ist mit dbo verbunden?
Carl G
44

Klicken Sie in der Symbolleiste auf das Symbol "Aktivitätsmonitor" ...

Aus Thorstens Kommentaren:

Klicken Sie in SQL Server Management Studio mit der rechten Maustaste auf Server und wählen Sie "Aktivitätsmonitor" aus dem Kontextmenü - oder verwenden Sie die Tastenkombination Ctrl+ Alt+ A.

Fernando Santos
quelle
12
Klicken Sie in SQL Server Management Studio mit der rechten Maustaste auf Server und wählen Sie "Aktivitätsmonitor" aus dem Kontextmenü - oder verwenden Sie die Tastenkombination Strg + Alt + A
Thorsten Hüglin
Gute Option, erfordert jedoch mehr Berechtigungen als die Extraktion von DB_NAME (dbid) aus sys.sysprocesses.
Der Zinger
25

Unten ist mein Skript, um alle mit einer Datenbank verbundenen Sitzungen zu finden. Sie können überprüfen, ob diese Sitzungen E / A ausführen, und es gibt eine Option, um sie zu beenden.

Das Skript zeigt auch den Status jeder Sitzung an.

Schauen Sie unten.

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

Ich habe das zusammengeschmissen, damit Sie die Ergebnisse abfragen können

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
quelle
sys.sysprocesses ist veraltet
Marcello Miorelli
5

Die Abfrage von MS, in der die Verwendung des KILLBefehls erläutert wird, ist sehr nützlich, wenn Sie Informationen zur Verbindung bereitstellen:

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
quelle
4

Sie können den folgenden T-SQL-Befehl ausführen:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
sinkmanu
quelle