设为首页 收藏本站
查看: 1315|回复: 0

[经验分享] 使用系统存储过程来监控SQLServer进程和会话详解

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-8-11 10:43:40 | 显示全部楼层 |阅读模式
SQLServer同样也提供了一系列系统存储过程用于监控SQLServer,获取当前进程、会话、请求以及锁定的详细信息。本文将演示系统存储过程来实现这些监控。
情景:有时候你会发现应用程序突然变得很慢,经常需要等待数据库响应,此时你需要快速查看是否请求被阻塞或者挂起。
准备工作:在本文中,将使用以下存储过程来获取当前进程的信息:
  • Sp_who
  • Sp_who2
步骤:1、  打开SSMS连到SQLServer实例并打开新查询窗口。
2、  在新查询窗口中输入以下脚本









1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

USEtempdb
GO

--创建测试表
IFOBJECT_ID('tempdb.dbo.#tbl_SPWho')IS NOTNULL
    BEGIN
        DROPTABLE tempdb.dbo.#tbl_SPWho
    END

CREATE TABLE tempdb.dbo.#tbl_SPWho
    (
      spid SMALLINT,
      ecidSMALLINT ,
      [status]NVARCHAR(30),
      loginameNVARCHAR(128),
      hostName NVARCHAR(128),
      blkCHAR(5),
      dbname NVARCHAR(128),
      cmdNVARCHAR(16),
      request_id INT
    )

--从系统存储过程中获取数据并插入临时表中
INSERT  INTO tempdb.dbo.#tbl_SPWho
        EXECsp_who
GO

--创建存放sp_who2信息的临时表
IFOBJECT_ID('tempdb.dbo.#tbl_SPWho2')IS NOTNULL
    BEGIN
        DROPTABLE tempdb.dbo.#tbl_SPWho2
    END

CREATE TABLE tempdb.dbo.#tbl_SPWho2
    (
      spid SMALLINT,
      [status]NVARCHAR(30),
      [login]NVARCHAR(128),
      HostNameNVARCHAR(128),
      BlkBy CHAR(5),
      DBNameNVARCHAR(128),
      Command NVARCHAR(16),
      CPUTimeINT ,
      DiskIO INT,
      LastBatchNVARCHAR(50),
      ProgramName NVARCHAR(100),
      SPID2SMALLINT ,
      REQUESTID INT
    )

--从系统存储过程中获取数据并插入临时表中
INSERT  INTO tempdb.dbo.#tbl_SPWho2
        EXECsp_who2
GO

--查看特定数据库的数据
SELECT  spidAS SessionID,
        ecid ASExecutionContextID ,
        [status]AS ProcessStatus,
        loginame ASLoginName ,
        hostnameAS HostName,
        blk ASBlockedBy ,
        dbnameAS DatabaseName,
        cmd ASCmomandType ,
        request_idAS RequestID
FROM    dbo.#tbl_SPWho
WHERE  dbname ='AdventureWorks'
GO

--仅查看阻塞的数据
SELECT  spidAS SessionID,
        ecid ASExecutionContextID ,
        [status]AS ProcessStatus,
        loginame ASLoginName ,
        hostnameAS HostName,
        blk ASBlockedBy ,
        dbnameAS DatabaseName,
        cmd ASCmomandType ,
        request_idAS RequestID
FROM    dbo.#tbl_SPWho
WHERE  blk >0
GO

--查看挂起的数据
SELECT  spidAS SessionID,
        ecid ASExecutionContextID ,
        [status]AS ProcessStatus,
        loginame ASLoginName ,
        hostnameAS HostName,
        blk ASBlockedBy ,
        dbnameAS DatabaseName,
        cmd ASCmomandType ,
        request_idAS RequestID
FROM    dbo.#tbl_SPWho
WHERE  [STATUS]= 'suspended'
GO



分析:本例中,创建了两个临时表,用于存放sp_who 和sp_who2存储过程返回的数据结果,然后通过INSERT…EXECUTE命令把结果插入到临时表中,例子中演示了对sp_who的使用,至于sp_who2的使用是一样的。
之所以使用临时表来存放数据,是因为sp_who/sp_who2这两个系统存储过程不能直接筛选结果,所以需要存到表里面做二次处理。
扩充信息:现在来简单介绍一下,在DMO被加入到SQLServer之前,sp_moitor、sp_who2、sp_who这三个系统存储过程被广泛用于监控系统当前信息。
Sp_monitor在上文中已经提到过,并且可以和系统统计函数互换使用。
Sp_who是用于获取当前SQLServer进程、会话和请求的详细信息的系统存储过程。通过这个存储过程,可以知道谁执行了什么操作或者命令,和哪些进程被哪些进程阻塞了。这个存储过程有一些可选的参数:@loginame(类型为sysname),session ID(类型为smallint),和ACTIVE。可以通过传入@loginame来筛选特定的登录名的信息,如果Session ID也被定义,也会筛选特定sessionid的信息。如果没有参数,将范围实例级别的信息。如果你没有VIEW SYSTEM STATE权限,你仅仅可以查看自己这个会话的信息。如果使用了ACTIVE参数。存储过程将返回活动的进程。
对于sp_who返回的结果:
Spid:返回sessionID也就是会话ID,这些ID中,1到50(含)为系统会话。51及以上sessionid才是用户会话ID。
Exid:有时候结果中可能会有多个相同的SPID,这往往是因为发生了并行查询。这一列代表了查询的上下文ID。而0代表了父线程,其他值代表子线程。
Status:返回进程的的状态,包括:Dormant(休眠)、Running(正在运行)、Background(正在后台运行的进程如死锁侦测)、Rollback(事务正在回滚)、Pending(挂起,该会话正在等待可用的工作线程)、Runnable(会话的任务在等待获取时间量程时位于计划程序的可运行队列中)、Spinloop(会话的任务正在等待调节锁变为可用)、Suspended(会话正在等待时间如I/O完成)。
Loginame:会话所对应的登录名
Hostname:会话对应的机器名
Blk:如果会话被阻塞,这里将显示阻塞的会话ID,如果没有,降为0。
Dbname:返回特定会话所请求的数据库名。
Cmd:返回数据库引擎的命令类型。
Request_id:会话中的请求ID。
相对于sp_who,sp_who2返回更多的信息,但是sp_who2是未公开的系统存储过程,意味着你在联机丛书中找不到相关信息。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-23492-1-1.html 上篇帖子: 如何恢复SQLServer表级数据详解 下篇帖子: SQLServer2008-2012资源及性能监控—CPU使用率监控详解 监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表