最近发现一个非常奇怪的阻塞问题,如下截图所示(来自监控工具DPA),会话583被会话1036阻塞,而且阻塞发生在tempdb,被阻塞的SQL如下截图所示,会话等待类型为LCK_M_S

因为DPA工具不好截取全部信息,使用下面SQL语句获取了阻塞会话的详细信息如下,来自Microsoft SQL Server Management Studio - Transact-SQL IntelliSense的的SQL被阻塞了

SELECT  s.session_id ,

        r.status ,

        r.blocking_session_id 'Blk by' ,

        r.wait_type ,

        wait_resource ,

        r.wait_time / ( 1000 * 60 ) 'Wait M' ,

        r.cpu_time ,

        r.logical_reads ,

        r.reads ,

        r.writes ,

        r.total_elapsed_time / ( 1000 * 60 ) 'Elaps M' ,

        SUBSTRING(st.text, ( r.statement_start_offset / 2 ) + 1,

                  ( ( CASE r.statement_end_offset

                        WHEN -1 THEN DATALENGTH(st.text)

                        ELSE r.statement_end_offset

                      END - r.statement_start_offset ) / 2 ) + 1) AS statement_text ,

        COALESCE(QUOTENAME(DB_NAME(st.dbid)) + N'.'

                 + QUOTENAME(OBJECT_SCHEMA_NAME(st.objectid, st.dbid)) + N'.'

                 + QUOTENAME(OBJECT_NAME(st.objectid, st.dbid)), '') AS command_text ,

        r.command ,

        s.login_name ,

        s.host_name ,

        s.program_name ,

        s.last_request_end_time ,

        s.login_time ,

        r.open_transaction_count

FROM    sys.dm_exec_sessions AS s

        JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id

        CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st

WHERE r.session_id =583

ORDER BY r.cpu_time DESC;

而会话1036处于睡眠(sleeping)状态,有一个Open的事务。通过wait_resource的值“KEY: 2:1125899909070848 (79c68d10aa42)”,我们定位到是一个系统表sysschobj.它是sys.triggers这个系统视图的基表。如下所示:

SET QUOTED_IDENTIFIER ON

SET ANSI_NULLS ON

GO

CREATE VIEW sys.triggers AS

    SELECT o.name,

        object_id = o.id,

        parent_class = o.pclass,

        parent_class_desc = pc.name,

        parent_id = o.pid,

        type = o.type,

        type_desc = n.name,

        create_date = o.created,

        modify_date = o.modified,

        is_ms_shipped = sysconv(bit, o.status & 1),         -- OBJALL_MSSHIPPED

        is_disabled = sysconv(bit, o.status & 256),         -- OBJTRG_DISABLED

        is_not_for_replication = sysconv(bit, o.status & 512), -- OBJTRG_NOTFORREPL

        is_instead_of_trigger = sysconv(bit, o.status & 1024)     -- OBJTRG_INSTEADOF

    FROM sys.sysschobjs o

    LEFT JOIN sys.syspalnames n ON n.class = 'OBTY' AND n.value = o.type

    LEFT JOIN sys.syspalvalues pc ON pc.class = 'UNCL' AND pc.value = o.pclass

    WHERE o.type IN ('TA','TR') AND o.pclass <> 100

        AND has_access('TR', o.id, o.pid, o.nsclass) = 1

 

GO

使用下面脚本可以查到对应的锁信息(其实,正确的做法应该是加上条件过滤spid),从而可以判断,会话1036可能因为事务中,间接涉及对基表sysschobj的DML操作(有可能是衍生的系统视图),而由于事务没有提交也没有释放,导致在基表上的锁没有释放,从而导致出现这样一个阻塞。个人也很好奇是什么样的SQL会导致这样一个阻塞出现,不过这种阻塞源头是Sleeping状态的会话,已经无法定位阻塞源头SQL,只能通过Profile去跟踪捕获。但是这种阻塞出现时机和场景不清楚,很难一下子捕获到。

 

USE tempdb

GO

SELECT  request_session_id AS spid ,

        DB_NAME(resource_database_id) AS dbname ,

        CASE WHEN resource_type = 'OBJECT'

             THEN OBJECT_NAME(resource_associated_entity_id)

             WHEN resource_associated_entity_id = 0 THEN 'n/a'

             ELSE OBJECT_NAME(p.object_id)

        END AS entity_name ,

        index_id ,

        resource_type AS resource ,

        resource_description AS description ,

        request_mode AS mode ,

        request_status AS status

FROM    sys.dm_tran_locks t

LEFT JOIN sys.partitions p

ON      p.partition_id = t.resource_associated_entity_id

WHERE   resource_database_id = DB_ID()

今天早上有发现同样的阻塞,猜测是SQL里面有创建临时表或对临时表做DDL或DML操作的迹象。不过依然没有找到源头SQL,只能静候下次机会。找出“罪魁祸首”。不过让我头痛的是,对于这种特殊阻塞情况,即使是使用Profile跟踪也是相当麻烦,因为不知道它什么时间点出现、出现在那个会话。

SELECT  tl.resource_type AS [Resource Type] ,

        DB_NAME(tl.resource_database_id) AS [DB Name] ,

        CASE tl.resource_type

          WHEN 'OBJECT'

          THEN OBJECT_NAME(tl.resource_associated_entity_id,

                           tl.resource_database_id)

          WHEN 'DATABASE' THEN 'DB'

          ELSE CASE WHEN tl.resource_database_id = DB_ID()

                    THEN ( SELECT   OBJECT_NAME(object_id,

                                                tl.resource_database_id)

                           FROM     sys.partitions

                           WHERE    hobt_id = tl.resource_associated_entity_id

                         )

                    ELSE '(Run under DB context)'

               END

        END AS [Object] ,

        tl.resource_description AS [Resource] ,

        tl.request_session_id AS [Session] ,

        tl.request_mode AS [Mode] ,

        tl.request_status AS [Status] ,

        wt.wait_duration_ms AS [Wait (ms)] ,

        qi.sql ,

        qi.query_plan

FROM    sys.dm_tran_locks tl WITH ( NOLOCK )

LEFT OUTER JOIN sys.dm_os_waiting_tasks wt WITH ( NOLOCK )

ON      tl.lock_owner_address = wt.resource_address

        AND tl.request_status = 'WAIT'

OUTER APPLY ( SELECT    SUBSTRING(s.text,

                                  ( er.statement_start_offset / 2 ) + 1,

                                  ( ( CASE er.statement_end_offset

                                        WHEN -1 THEN DATALENGTH(s.text)

                                        ELSE er.statement_end_offset

                                      END - er.statement_start_offset ) / 2 )

                                  + 1) AS sql ,

                        qp.query_plan

              FROM      sys.dm_exec_requests er WITH ( NOLOCK )

              CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) s

              OUTER APPLY sys.dm_exec_query_plan(er.plan_handle) qp

              WHERE     tl.request_session_id = er.session_id

            ) qi

WHERE   tl.request_session_id =134

链接资料

一个特殊的SQL Server阻塞案例分析

SQL Server一个特殊的阻塞案例分析2

SQL Server一个特殊的阻塞案例分析2的更多相关文章

  1. SQL Server服务没有自动启动原因案例分析

    这个案例是前两天出现的,一直没有时间总结,25号凌晨4点去处理数据库的故障问题.远程连上公司的局域网,psping检查发现服务器的1433端口不通,数据库连接不上,但是主机又能ping通,登录服务器检 ...

  2. SQL Server 的锁定和阻塞

    本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...

  3. 一个特殊的SQL Server阻塞案例分析

    上周,在SQL Server数据库下面遇到了一个有意思的SQL阻塞(SQL Blocking)案例.其实个人对SQL Server的阻塞还是颇有研究的.写过好几篇相关文章. 至于这里为什么要总结一下这 ...

  4. Sql Server 2012 的新分页方法分析(offset and fetch) - 转载

    最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的 其中 offset ...

  5. SQL Server 数据库中关于死锁的分析

    SQL Server数据库发生死锁时不会像Oracle那样自动生成一个跟踪文件.有时可以在[管理]->[当前活动] 里看到阻塞信息(有时SQL Server企业管理器会因为锁太多而没有响应). ...

  6. SQL SERVER:使用工具观察与分析数据库中锁信息

    SQL SERVER 2005可以通过Microsoft SQL Server Management Studio的“管理–>活动监视器”–>“右键”–>“进程信息”,这里呈现连接. ...

  7. SQL Server作业报错特殊案例

    一个作业报错,报错信息如下,从错误信息根本看不出为什么出错,手工运行作业又成功了.一时不清楚什么原因导致作业出错. Message Executed as user: NT SERVICE\SQLSE ...

  8. SQL Server数据库邮件发送异常案例

      最近遇到两起关于SQL Server数据库邮件发送异常的案例,这些问题也有点意思,顺便记录一下.方便以后遇到类似问题的人参考,不要被这些问题弄得抓狂! 案例1:我们一台数据库服务器突然发送邮件都不 ...

  9. SQL Server 2012中LEAD函数简单分析

    LEAD函数简单点说,就是把下一行的某列数据提取到当前行来显示,看示例更能解释清楚,先看测试用脚本 DECLARE @TestData TABLE( ID INT IDENTITY(1,1), Dep ...

随机推荐

  1. Oracle数据去重

    一.完全重复数据去重方法    具体思路是,首先创建一个临时表,然后将DISTINCT之后的表数据插入到这个临时表中;然后清空原表数据;再讲临时表中的数据插入到原表中;最后删除临时表. 对于表中完全重 ...

  2. Matcher的replaceAll ()/appendReplacement()/appendTail()详细举例

    直接上例子: package com.dajiangtai.djt_spider.util; import java.util.regex.Matcher;import java.util.regex ...

  3. HDU 5546 Ancient Go (搜索)

    题意: Alice和Bob正在下古代围棋,规则如下: 棋盘有8×8个格子,棋子下在棋盘的交叉点上,故可以有9×9个落子的位置 Alice执黑棋Bob执白棋轮流落子 与棋子直线相连的空白交叉点叫做气.当 ...

  4. HRBUST - 1214 NOIP2000提高组 方格取数(多线程dp)

    方格取数 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0.如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走过的 ...

  5. GTK学习笔记之Linux下Gtk环境搭建

    下面介绍下Ubuntu 环境下具体的安装过程: 1.配置安装gcc/g++/gdb/make 等基本编程工具(必须装好) 刚装好的Ubuntu系统中已经有GCC了,但是这个GCC几乎什么文件都不能编译 ...

  6. python_文件目录的操作

    Python文件的主要操作 主要包括: 1,创建一个文件 2,删除一个文件 3,创建一个目录 4,删除一个目录 5,拷贝,重命名,查看文件大小 6,列出某个目录下文件的数量 7,递归打印某个目录下的所 ...

  7. ubuntu18.04安装配置opencv3.4.0

    1.安装配置相关工具及依赖库 sudo apt-get install build-essential # 必须的,gcc编译环境 sudo apt-get install cmake git lib ...

  8. 51nod1060(反素数&dfs)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1060 题意:中文题诶- 思路: 这里用到了反素数的性质: 对 ...

  9. floyd判环算法(龟兔赛跑算法)

    floyd判环算法(龟兔赛跑算法) 注意,这个算法是用来判断一条链+一条环的图,环的长度或者环与链的交界处的,所以此floyd非彼floyd(虽然都是一个人想出来的). (图不是我的) 如果只要求环的 ...

  10. jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)

    题面 题解 幸好咱不是在晚上做的否则咱就不用睡觉了--都什么年代了居然还会出高精的题-- 先考虑如果暴力怎么做,令\(G(x)\)为\(F(n,k)\)的生成函数,那么不难发现\[G^R(x)=\pr ...