Как увидеть активные соединения SQL Server?
Я использую SQL Server 2008 Enterprise. Я хочу видеть любые активные подключения к SQL Server и связанную информацию о всех подключениях, например, с какого IP-адреса, к какой базе данных подключаться или что-то еще.
Существуют ли команды для решения этой проблемы?
Ответы
Ответ 1
Вы можете использовать хранимую процедуру sp_who
.
Предоставляет информацию о текущих пользователях, сеансах и процессах в экземпляре ядра СУБД Microsoft SQL Server. Информация может быть отфильтрована, чтобы возвращать только те процессы, которые не простаивают, принадлежат определенному пользователю или принадлежат определенному сеансу.
Ответ 2
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.
Ответ 3
Помимо sp_who
, вы также можете использовать "недокументированную" sp_who2
хранимую процедуру sp_who2
, которая дает вам более подробную информацию. Смотрите Разница между sp_who и sp_who2.
Ответ 4
Нажмите значок "Монитор активности" на панели инструментов...
Из комментариев Торстен:
В SQL Server Management Studio щелкните правой кнопкой мыши на сервере, выберите "Монитор активности" из контекстного меню или используйте комбинацию клавиш Ctrl + Alt + A.
Ответ 5
Ниже мой script, чтобы найти все сеансы, связанные с базой данных, и вы можете проверить, делают ли эти сеансы какие-либо операции ввода-вывода, и есть возможность их убить.
script показывает статус каждого сеанса.
Посмотрите ниже.
--==============================================================================
-- 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
--==============================================================================
Ответ 6
Я выбросил это вместе, чтобы вы могли сделать некоторые запросы по результатам
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
Ответ 7
Или используя этот инструмент: sqldog.com
Ответ 8
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;
HTH, привет,