【发布时间】:2010-11-17 22:02:45
【问题描述】:
我使用的是 SQL Server 2008 Enterprise。我想查看任何活动的 SQL Server 连接,以及所有连接的相关信息,例如来自哪个 IP 地址、连接到哪个数据库等。
是否有现有的命令可以解决这个问题?
【问题讨论】:
-
sys.dm_exec_sessions,要检查的会话 ID >50
标签: sql sql-server sql-server-2008
我使用的是 SQL Server 2008 Enterprise。我想查看任何活动的 SQL Server 连接,以及所有连接的相关信息,例如来自哪个 IP 地址、连接到哪个数据库等。
是否有现有的命令可以解决这个问题?
【问题讨论】:
标签: sql sql-server sql-server-2008
您可以使用sp_who 存储过程。
提供有关 Microsoft SQL Server 数据库引擎实例中当前用户、会话和进程的信息。可以过滤信息以仅返回那些非空闲、属于特定用户或属于特定会话的进程。
【讨论】:
除了sp_who,您还可以使用“未记录的”sp_who2 系统存储过程,它可以为您提供更详细的信息。请参阅Difference between sp_who and sp_who2。
【讨论】:
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 文档。
【讨论】:
hostname 添加到SELECT 和GROUP BY 子句中,以查看连接了哪些客户端。此外,我刚刚意识到 loginame 的 Msft 错字 - 这是列名限制为 8 个字符时的产物吗?大声笑
ORDER BY 1, 2 DESC, 3
单击工具栏中的“活动监视器”图标。
在 SQL Server Management Studio 中,右键单击服务器,从上下文菜单中选择“活动监视器” - 或 - 使用键盘快捷键 Ctrl + Alt + A .
参考:Microsoft Docs - Open Activity Monitor in SQL Server Management Studio (SSMS)
【讨论】:
我把它放在一起,以便您可以对结果进行一些查询
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
【讨论】:
下面是我的脚本,用于查找连接到数据库的所有会话,您可以检查这些会话是否正在执行任何 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
--==============================================================================
【讨论】:
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;
【讨论】:
您可以执行以下 T-SQL 命令:
SELECT * FROM sys.dm_exec_sessions WHERE status = 'running';
【讨论】: