2009-08-08 3 views
210

Я использую SQL Server 2008 Enterprise. Я хочу видеть любые активные соединения SQL Server и связанную с ними информацию обо всех подключениях, например, с какого IP-адреса, подключиться к какой базе данных или что-то в этом роде.Как увидеть активные соединения SQL Server?

Существуют ли существующие инструменты для решения этой проблемы?

ответ

258

Вы можете использовать хранимую процедуру sp_who.

Предоставляет информацию о текущих пользователях, сеансах и процессах в экземпляре Microsoft SQL Server Database Engine. Информацию можно отфильтровать, чтобы возвращать только те процессы, которые не являются простоями, которые принадлежат определенному пользователю или принадлежат к определенному сеансу.

+5

когда вы должны фильтровать для конкретной БД выбора из sys.sysprocesses лучше –

+0

как бы я добавить фильтр только для конкретных баз данных? WHERE dbname = 'имя базы данных'? Я пробовал это, и у меня была ошибка –

+1

@ Geo.Dude, Иман Абиди означает создание собственного запроса выбора из sys.sysprocesses и добавление предложения where к этому запросу. Вам придется фильтровать на dbid. Идентификатор базы данных можно найти в sys.databases (или вы можете присоединиться к этим двум). – bvgheluwe

38

Помимо sp_who, вы можете также использовать «нелегальную» хранимую процедуру sp_who2 системы, которая дает вам более подробную информацию. См. Difference between sp_who and sp_who2.

+10

кто связался с dbo.First? –

+0

Я не знаю. Третья нормальная форма! –

248
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.sysprocesses.

+1

При автоматизации вещей этот запрос может быть более полезным, чем sp_who, который больше ориентирован на отображение. – Colin

+0

Большое вам спасибо!Я искал альтернативу sp_who, поскольку SELECT легче обрабатывать в представлении. –

+0

Когда я запустил это утверждение, он обнаруживает большое количество открытых подключений для управления db от пользователя sa. Почему причина? –

29

Нажмите на значок "Activity Monitor" на панели инструментов ...

Из комментариев Торстен по:

В SQL Server Management Studio, щелкните правой кнопкой мыши на сервере, выберите "Activity Monitor" из контекстного меню -или- использование сочетаний клавиш Ctrl + Alt + A.

+7

В SQL Server Management Studio щелкните правой кнопкой мыши на сервере, выберите «Монитор активности» в контекстном меню -или- -со- используйте комбинацию клавиш Ctrl + Alt + A –

+0

Хороший вариант, но для этого требуется больше привилегий, чем извлечение DB_NAME (dbid) из sys .sysprocesses. –

11

я бросил это вместе, так что вы могли бы сделать некоторые запрашивание по результатам

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 
6

Ниже мой сценарий, чтобы найти все сеансы, подключенные к базе данных, и вы можете проверить, если эти сеансы делать какие-либо 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 

--============================================================================== 
0

Вы можете попробовать DBHawk от Datasparc. Он имеет активный менеджер сеансов, который отображает все активные соединения, последние SQL-запросы для каждого сеанса.

SQL Server Active Connections Viewer

Смежные вопросы