Como vejo as conexões ativas do SQL Server?


298

Estou usando o SQL Server 2008 Enterprise. Quero ver as conexões ativas do SQL Server e as informações relacionadas de todas as conexões, como de qual endereço IP, conectar a qual banco de dados ou algo assim.

Existem comandos existentes para resolver esse problema?



sys.dm_exec_sessions, ID da sessão para verificar> 50
Shiwangini 20/20

Respostas:


354

Você pode usar o sp_whoprocedimento armazenado.

Fornece informações sobre usuários, sessões e processos atuais em uma instância do Microsoft SQL Server Database Engine. As informações podem ser filtradas para retornar apenas os processos que não estão ociosos, pertencem a um usuário específico ou pertencem a uma sessão específica.


9
quando você tem que filtro para selecionar db específico sys.sysprocesses é melhor
Iman

como eu adicionaria um filtro apenas para bancos de dados específicos? ONDE dbname = 'nome do banco de dados' ?? Eu tentei isso e recebi um erro
NULL.Dude

1
@ Geo.Dude, Iman Abidi significa criar sua própria consulta de seleção a partir de sys.sysprocesses e adicionar uma cláusula where a essa consulta. Você terá que filtrar no dbid. Você pode encontrar o ID do banco de dados em sys.databases (ou pode ingressar nesses dois).
precisa saber é o seguinte

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

Consulte também a documentação da Microsoft para sys.sysprocesses .


5
Ao automatizar as coisas, essa consulta pode ser mais útil do que sp_who, que é mais orientado para a exibição.
Colin

Esse é o meu método preferido, mas não responde totalmente à pergunta do OP. Sugira adicionar hostnameàs cláusulas SELECTe GROUP BYpara ver quais clientes estão conectados. Também acabei de perceber o erro de digitação Msft para loginame- isso é um artefato de quando os nomes das colunas eram limitados a 8 caracteres? lol
nothingisnecessary

13
O sys.sysprocesses foi preterido nas versões mais recentes do SQL Server. Ele é mapeado para essas três visualizações de gerenciamento : sys.dm_exec_connections, sys.dm_exec_sessions e sys.dm_exec_requests.
Mike Sherrill 'Cat Recall'

Eu gosto deORDER BY 1, 2 DESC, 3
slartidan 10/07/19


44

Clique no ícone "monitor de atividade" na barra de ferramentas ...

Dos comentários de Thorsten:

No SQL Server Management Studio, clique com o botão direito do mouse em Server, escolha "Activity Monitor" no menu de contexto - ou - use o atalho do teclado Ctrl+ Alt+ A.


12
No SQL Server Management Studio, clique direito sobre Server, escolha "Activity Monitor" no menu de contexto -ou- atalho uso do teclado Ctrl + Alt + A
Thorsten Huglin

Boa opção, mas requer mais privilégios do que a extração DB_NAME (dbid) do sys.sysprocesses.
Zinger

25

Abaixo está o meu script para encontrar todas as sessões conectadas a um banco de dados e você pode verificar se essas sessões estão realizando alguma E / S e se há uma opção para eliminá-las.

O script mostra também o status de cada sessão.

Dê uma olhada abaixo.

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

Joguei isso juntos para que você pudesse fazer uma consulta sobre os resultados

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 está obsoleto
Marcello Miorelli

5

A consulta da Microsoft que explica o uso do KILLcomando é bastante útil, fornecendo informações da conexão:

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

Você pode executar o seguinte comando T-SQL:

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.