Come vedo le connessioni attive di SQL Server?


298

Sto usando SQL Server 2008 Enterprise. Voglio vedere tutte le connessioni attive di SQL Server e le informazioni correlate di tutte le connessioni, come da quale indirizzo IP, connettersi a quale database o qualcosa del genere.

Esistono comandi esistenti per risolvere questo problema?



sys.dm_exec_sessions, ID sessione da controllare> 50
Shiwangini

Risposte:


354

È possibile utilizzare la sp_whoprocedura memorizzata.

Fornisce informazioni su utenti, sessioni e processi correnti in un'istanza del Motore di database di Microsoft SQL Server. Le informazioni possono essere filtrate per restituire solo quei processi che non sono inattivi, che appartengono a un utente specifico o che appartengono a una sessione specifica.


9
quando devi filtrare per un db specifico selezionare da sys.sysprocesses è meglio
Iman

come aggiungerei un filtro solo per database specifici? DOVE dbname = 'nome database' ?? Ho provato questo e ho avuto un errore
NULL.Dude

1
@ Geo.Dude, Iman Abidi significa creare la propria query di selezione da sys.sysprocesses e aggiungere una clausola where a quella query. Dovrai filtrare su dbid. Puoi trovare l'ID del database in sys.d Database (oppure puoi unirti a questi due).
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
;

Vedi anche la documentazione di Microsoft per sys.sysprocesses .


5
Quando si automatizzano le cose, questa query potrebbe essere più utile di sp_who, che è più orientato alla visualizzazione.
Colin,

Questo è il mio metodo preferito, ma non risponde completamente alla domanda del PO. Suggerisci di aggiungere hostnamele clausole SELECTe GROUP BYper vedere quali client sono connessi. Inoltre ho appena realizzato il refuso di Msft per loginame: è un artefatto da quando i nomi delle colonne erano limitati a 8 caratteri? lol
niente è necessario il

13
sys.sysprocesses è obsoleto nelle versioni più recenti di SQL Server. Associa a queste tre viste di gestione : sys.dm_exec_connections, sys.dm_exec_sessions e sys.dm_exec_requests.
Mike Sherrill "Cat Recall",

Mi piaceORDER BY 1, 2 DESC, 3
slartidan il


44

Fai clic sull'icona "Activity Monitor" nella barra degli strumenti ...

Dai commenti di Thorsten:

In SQL Server Management Studio, fai clic con il pulsante destro del mouse su Server, scegli "Activity Monitor" dal menu di scelta rapida -oppure usa la scorciatoia da tastiera Ctrl+ Alt+ A.


12
In SQL Server Management Studio, fai clic con il pulsante destro del mouse su Server, scegli "Monitoraggio attività" dal menu di scelta rapida oppure utilizza la scorciatoia da tastiera Ctrl + Alt + A
Thorsten Hüglin,

Buona opzione, ma richiede più privilegi rispetto all'estrazione di DB_NAME (dbid) da sys.sysprocesses.
Der Zinger,

25

Di seguito è riportato il mio script per trovare tutte le sessioni connesse a un database e puoi verificare se quelle sessioni stanno eseguendo I / O e c'è un'opzione per ucciderle.

Lo script mostra anche lo stato di ogni sessione.

Dai un'occhiata qui sotto.

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

L'ho messo insieme in modo che tu possa fare delle domande sui risultati

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 è obsoleto
Marcello Miorelli il

5

La query di MS che spiega l'uso del KILLcomando è piuttosto utile fornendo informazioni sulla connessione:

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

È possibile eseguire il seguente comando T-SQL:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.