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?



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.


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 .


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


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.


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

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

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

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;

4

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

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.