source

활성 SQL Server 연결을 확인하려면 어떻게 해야 합니까?

itover 2023. 4. 7. 21:12
반응형

활성 SQL Server 연결을 확인하려면 어떻게 해야 합니까?

SQL Server 2008 Enterprise를 사용하고 있습니다.활성 SQL Server 연결 및 모든 연결의 관련 정보(예: IP 주소에서 어떤 데이터베이스로 연결되는지)를 확인합니다.

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

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 의 메뉴얼도 참조해 주세요.

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

Microsoft SQL Server Database Engine 인스턴스의 현재 사용자, 세션 및 프로세스에 대한 정보를 제공합니다.정보를 필터링하여 아이돌 상태가 아닌 프로세스, 특정 사용자에게 속한 프로세스 또는 특정 세션에 속한 프로세스만 반환할 수 있습니다.

이외에는sp_who, 「서류 첨부」를 사용할 수도 있습니다.sp_who2자세한 정보를 제공하는 시스템 저장 프로시저를 참조하십시오.sp_who와 sp_who2차이를 참조하십시오.

도구 모음에서 "활동 모니터" 아이콘을 클릭합니다.

Thorsten코멘트로부터:

SQL Server Management Studio에서 Server를 오른쪽 클릭하여 컨텍스트메뉴에서 [Activity Monitor]를 선택하거나 키보드숏컷 + 를 사용합니다.

레퍼런스:Microsoft Docs - SQL Server Management Studio(SSMS)에서 액티비티 모니터를 엽니다.

아래는 데이터베이스에 연결된 모든 세션을 검색하기 위한 스크립트입니다.이러한 세션이 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

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

업데이트 2022년 1월 20일

sys.dm_tran_tran을 사용하는 더 나은 버전이 있습니다.이것은 특히 모든 사용자가 특정 데이터베이스에서 벗어나야 할 때 유용합니다.그래서 이 파라미터가 있습니다.@dbname

누군가가 SSMS를 열고 데이터베이스에 연결하기만 해도 이 쿼리에 표시됩니다.

DECLARE @dbname SYSNAME =NULL

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
       
       ,DatabaseName = COALESCE( db_name(sdes.database_id),  N'')
       ,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_tran_locks t
INNER JOIN sys.dm_exec_sessions sdes
        ON t.request_session_id = sdes.session_id

LEFT OUTER JOIN sys.dm_exec_connections AS sdec 
        ON sdec.session_id = sdes.session_id

OUTER 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 t.resource_type = 'database' 
  and t.resource_database_id = CASE WHEN @dbname IS NULL 
                                    THEN t.resource_database_id  
                                    ELSE DB_ID(@dbname)  
                               END 
  and t.request_type = 'LOCK' 
  and t.request_status = 'GRANT'

명령어 사용을 설명하는 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;

당신이 결과를 조회할 수 있도록 이걸 합친 겁니다

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

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

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

언급URL : https://stackoverflow.com/questions/1248423/how-do-i-see-active-sql-server-connections

반응형