在 MS SQL Server 2012 中经常有 30 多个连接到“master”数据库是否正常?

Rob*_*b V 4 sql-server max-connections sql-server-2012 connections master-system-database

在解决为什么我在 SQL Server 2012 中看到与我们内部使用的数据库之一的这么多连接时。

我在网上找到的一个对我有帮助的查询是这样的:

 SELECT DB_NAME(sP.dbid) AS the_database
         , COUNT(sP.spid) AS total_database_connections
 FROM sys.sysprocesses sP
 GROUP BY DB_NAME(sP.dbid)
 ORDER BY 1;
Run Code Online (Sandbox Code Playgroud)

但是,尽管在解决问题后,我看到与我们自己的自定义数据库的连接恢复到正常水平,但我始终看到与master数据库的连接数始终超过 30 个连接。

这对于 SQL Server 2012 是否正常?master运行此查询时,还有其他人获得 30 个或更多连接吗?

Aar*_*and 5

30个系统进程绝对不是闻所未闻,实际上听起来比正常情况要好。

但是,您不应该使用sysprocesses,它已被弃用并且仅出于向后兼容性原因而存在 - 请参阅文档顶部的重要说明。(如果您仅将它用于数据库列,请参阅最近的问题和评论。)

您应该查看sys.dm_exec_sessions- 此视图有一个名为的列is_user_process,可让您识别您的进程并将它们与系统进程区分开来(旧的 < 50 技巧在现代版本的 SQL Server 上不再可靠)。

举个例子,在我的本地开发机器上——我可以向你保证什么都没有发生——我有以下几行:

sys.sysprocesses                                    62
sys.dm_exec_sessions                                68
sys.dm_exec_sessions where is_user_process = 1      26
Run Code Online (Sandbox Code Playgroud)

这 26 个用户进程中的大多数只是与主机上的 Visual Studio Code 保持打开的实例(位于 VM 来宾上)的连接。

其他 42 个是正常的、休眠的、后台系统进程,如LOG WRITER, LOCK MONITOR, XE DISPATCHER, 'CHECKPOINT' 等。你不可能摆脱这些。

您还可以比较未记录的输出sys.sp_who2

EXEC sys.sp_who2;                       -- 64 rows in my case
EXEC sys.sp_who2 @loginame = N'active'; -- 40 rows in my case
Run Code Online (Sandbox Code Playgroud)

或者限制为sys.dm_exec_requests.

但是为了更深入地了解系统上的进程,最好使用 Adam Machanic 的sp_whoisactive 之类的工具或适当的监视工具(免责声明:我为其中一个工作)。