활성 SQL Server 연결을 보려면 어떻게합니까?


298

SQL Server 2008 Enterprise를 사용하고 있습니다. 모든 활성 SQL Server 연결과 IP 주소, 데이터베이스 또는 연결 대상과 같은 모든 연결의 관련 정보를보고 싶습니다.

이 문제를 해결하기위한 기존 명령이 있습니까?



sys.dm_exec_sessions,> 50을 확인하기위한 세션 ID
Shiwangini

답변:


354

sp_who저장 프로 시저를 사용할 수 있습니다 .

Microsoft SQL Server 데이터베이스 엔진 인스턴스에서 현재 사용자, 세션 및 프로세스에 대한 정보를 제공합니다. 유휴 상태가 아니거나 특정 사용자에게 속하거나 특정 세션에 속하는 프로세스 만 반환하도록 정보를 필터링 할 수 있습니다.


9
sys.sysprocesses에서 선택하는 특정 db를 필터링해야 할 때 더 좋습니다
Iman

특정 데이터베이스에 대해서만 필터를 추가하려면 어떻게합니까? 어디 dbname = '데이터베이스 이름'?? 나는이 시도하고 나는 오류가있어
NULL.Dude

1
@ Geo.Dude, Iman Abidi는 sys.sysprocesses에서 자체 선택 쿼리를 만들고 해당 쿼리에 where 절을 추가하는 것을 의미합니다. dbid를 필터링해야합니다. sys.databases에서 데이터베이스 ID를 찾을 수 있습니다 (또는이 두 가지를 결합 할 수도 있습니다).
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
;

sys.sysprocesses에 대한 Microsoft 설명서도 참조하십시오 .


5
사물을 자동화 할 때이 쿼리는 sp_who보다 표시가 더 유용 할 수 있습니다.
Colin

이것이 내가 선호하는 방법이지만 OP의 질문에 완전히 대답하지는 않습니다. 클라이언트가 연결되어 있는지 확인 hostname하려면 SELECTand GROUP BY절을 추가 하십시오. 또한 Msft 오타가 있음을 깨달았습니다. loginame열 이름이 8 자로 제한되었을 때의 인공물입니까? lol
nothingisnecessary

13
sys.sysprocesses는 최신 버전의 SQL Server에서 더 이상 사용되지 않습니다 . sys.dm_exec_connections, sys.dm_exec_sessions 및 sys.dm_exec_requests의 세 가지 관리 뷰에 매핑됩니다 .
Mike Sherrill 'Cat Recall'2

나는ORDER BY 1, 2 DESC, 3
slartidan

56

이외에도 보다 자세한 정보를 제공 sp_who하는 "언급되지 않은" sp_who2시스템 저장 프로 시저를 사용할 수도 있습니다 . sp_who와 sp_who2의 차이점을 참조하십시오 .


16
누가 dbo.First에 연결되어 있습니까?
Carl G

44

툴바에서 "활동 모니터"아이콘을 클릭하십시오 ...

Thorsten의 의견에서 :

SQL Server Management Studio에서 서버를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 "활동 모니터"를 선택하거나 키보드 단축키 Ctrl+ Alt+를 사용하십시오 A.


12
SQL Server Management Studio에서 서버를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 "활동 모니터"를 선택하거나 키보드 단축키를 사용하십시오. Ctrl + Alt + A
Thorsten Hüglin

좋은 옵션이지만 sys.sysprocesses에서 DB_NAME (dbid) 추출보다 더 많은 권한이 필요합니다.
Der Zinger

25

아래는 데이터베이스에 연결된 모든 세션을 찾는 스크립트이며 해당 세션에서 I / O를 수행하고 있으며 종료하는 옵션이 있는지 확인할 수 있습니다.

스크립트는 각 세션의 상태도 보여줍니다.

아래를보세요.

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

결과를 쿼리 할 수 ​​있도록 이것을 함께 던졌습니다.

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가되지 않습니다
마르첼로 Miorelli을

5

KILL명령 사용을 설명하는 MS의 쿼리 는 연결 정보를 제공하는 데 매우 유용합니다.

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

다음 T-SQL 명령을 수행 할 수 있습니다.

SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.