Як я бачу активні підключення до SQL Server?


298

Я використовую SQL Server 2008 Enterprise. Я хочу бачити будь-які активні підключення до SQL Server та пов’язану з ними інформацію про всі з'єднання, наприклад, з якої IP-адреси, до якої бази даних чи чогось іншого.

Чи існують команди для вирішення цього питання?



sys.dm_exec_sesions, ідентифікатор сесії для перевірки> 50
Shiwangini

Відповіді:


354

Ви можете використовувати sp_whoзбережену процедуру.

Надає інформацію про поточних користувачів, сеанси та процеси в екземплярі бази даних Microsoft SQL Server Engine Engine. Інформація може бути відфільтрована, щоб повернути лише ті процеси, які не працюють, які належать певному користувачеві або належать певному сеансу.


9
коли вам доведеться фільтрувати конкретні db, вибираючи з sys.sysprocessів краще
Іман

як я можу додати фільтр лише для конкретних баз даних? ДЕ dbname = 'ім'я бази даних' ?? Я спробував це, і я отримав помилку
NULL.Dude,

1
@ Geo.Dude, Іман Абіді означає створити власний запит вибору з sys.sysprocess і додати до цього запиту пункт де. Вам доведеться фільтрувати на dbid. Ви можете знайти ідентифікатор бази даних у sys.databases (або ви можете приєднатись до цих двох).
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
;

Дивіться також документацію Microsoft щодо sys.sysprocess .


5
Під час автоматизації речей цей запит може бути кориснішим, ніж sp_who, більш орієнтований на показ.
Колін

Це мій кращий метод, але він не відповідає повністю на питання ОП. Запропонуйте додати hostnameдо пункту SELECTта GROUP BYпункти, щоб побачити, які клієнти підключені. Також я щойно зрозумів помилку Msft loginame- це артефакт, коли назви стовпців обмежувались 8 символами? lol
нічогонеобхідного

13
У новіших версіях SQL Server застарілі процеси sys.sysproces . Він відображає ці три види управління : sys.dm_exec_connections, sys.dm_exec_sesions та sys.dm_exec_requests.
Майк Шеррілл 'Відкликання котів'

Мені подобаєтьсяORDER BY 1, 2 DESC, 3
slartidan


44

На панелі інструментів натисніть значок "Монітор активності" ...

З коментарів Торстена:

У студії управління SQL Server клацніть правою кнопкою миші на сервері, у контекстному меню виберіть "Монітор активності" - або скористайтесь комбінацією клавіш Ctrl+ Alt+ A.


12
У студії управління SQL Server клацніть правою кнопкою миші на сервері, виберіть "Монітор активності" у контекстному меню - або скористайтеся комбінацією клавіш Ctrl + Alt + A
Thorsten Hüglin

Хороший варіант, але він вимагає більше привілеїв, ніж вилучення DB_NAME (dbid) з sys.sysprocess.
Der Zinger

25

Нижче наведено мій сценарій, щоб знайти всі сеанси, підключені до бази даних, і ви можете перевірити, чи виконуються ці сеанси вводу-виводу і є можливість їх вбити.

Сценарій також показує статус кожного сеансу.

Подивіться нижче.

--==============================================================================
-- 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.sysproces застаріла
Marcello Miorelli

5

Запит MS, що пояснює використання KILLкоманди, є досить корисним, надаючи інформацію про з'єднання:

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';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.