SQL Server阻塞的检查

1. 阻塞  

除了内存、CPU、I/O这些系统资源以外,阻塞和死锁是影响数据库应用性能的另一大因素。

所谓的「阻塞」,是指当一个数据库会话中的事务,正在锁定其他会话事务想要读取或修改的资源,造成这些会话发出的请求进入等待的状态。SQL Server 默认会让被阻塞的请求无限期地一直等待,直到原来的事务释放相关的锁,或直到它超时、服务器关闭、进程被杀死。一般的系统中,偶尔有短时间的阻塞是正常且合理的;但若设计不良的程序,就可能导致长时间的阻塞,这样就不必要地锁定了资源,而且阻塞了其他会话欲读取或更新的需求。遇到这种情况,可能就需要手工排除阻塞的状态。

2.阻塞和死锁可能带来的问题

(1)并发用户少的时候,一切还都正常。但是随着并发用户的增加,性能越来越慢。

(2)应用程序运行很慢,但是SQL Server 这个CPU和磁盘利用率很低。

(3)客户端经常受到以下错误。

   Error 1222--Lock request time out period exceeded.

   Error 1205--Your transaction(process ID #XX) was deadlocked on resources with another process and has been chosen as the deadlock victim. Return your transaction.

  超时错误--Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

(4)有些查询能够进行,但是有些特定的查询或修改总是不能返回。

(5)重启SQL Server就能解决。但是有可能跑一段时间以后又会出现问题。

3.阻塞的检查

3.1 主要的系统表或函数

Sys.SysProcesses 系统表是一个很重要的系统视图,主要用来定位与解决Sql Server的阻塞和死锁。主要字段1.Spid:Sql Servr 会话ID 2.Blocked:正在阻塞求情的会话 ID。如果此列为 Null,则标识请求未被阻塞 3. Program_name:应用程序的名称,就是 连接字符串中配的 Application Name 4. Hostname:建立链接的客户端工作站的名称。

sys.dm_exec_requests、sys.dm_exec_sql_text返回指定SPIDer的 SQL 查询文本。

DBCC INPUTBUFFER 显示从客户端发送到 Microsoft SQL Server 实例的最后一个语句。

sp_lock 系统存储过程,报告有关锁的信息。

3.2 Check逻辑

对应的存储为dblockcheck(job为DB_Lockcheck),主要Check逻辑如下:

3.3 保存的数据

所收集的数据保存dblock_information中,主要包含信息如截图,定期的统计分析可获得经常被阻塞和引起阻塞SQL语句和Table,这些信息是进行数据库优化的一个角度。

select top 100* from dblock_information
order by TransDateTime desc 

4.代码实现

4.1 Table的创建脚本

CREATE TABLE [dbo].dblock_information](
    ID] intIDENTITY(1,1) NOT NULL,Messagenvarchar](300) LockTypechar1) SPID1] SPID2EventType100) Parameters10) EventInfo3000) IndividualQuery1000) TransDateTimedatetimeNULL CONSTRAINT DF_dblock_information_TransDateTime]  DEFAULT (getdate()),1)">AppNamevarchar50) HostNamePK_dblock_informationPRIMARY KEY CLUSTERED 
(
    ASC
)WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE ON,ALLOW_PAGE_LOCKS ON) ON PRIMARY
) ]

4.2 存储的创建脚本

Create procedure dblockcheck] 
     @AlarmThreshold as tinyint=10
 as
set nocount on
--------------------------------------------------------------------------------------------------------
--*Program*: <dblock check for job>*Programer*:<>*Date*:<>*Description*:<Query SQL Locking Process>*Unify*:<UA>########## Parameter Description Begin ##########

########## Parameter Description End # ##########

##########Update Log Begin #############################Update Log End # ###################------------------------------------------------------------------------------------------------------
declare @SQL varchar(200)
@Subject @Body nvarchar(max@SPName @Message nvarchar(@DBname 15@IP 20@CNT int
@cnt2 @IndividualQuery 1000@HostName 50@AppName SET @DBname=DB_NAME()

SELECT @IP'XXX.XXX.XXX.XXX'
--不手动定义IP也可通过以下函数来实现
Declare @ServerIP NVARCHAR(30)'',@SERVERNAME 60)'' 
    1 @SERVERNAME @@SERVERNAME,1)">@ServerIP=LOCAL_NET_ADDRESS
    FROM SYS.DM_EXEC_CONNECTIONS where LOCAL_NET_ADDRESS is not null
------
begin
    @spid int,1)">@bl int@intTransactionCountOnEntry @intRowcount @intCountProperties @intCounter int

create table #tmp_lock_who (
    id int identity(1),spid smallint)

 #tmp_lock_information (
    id char(10010)
    )

IF @@ERROR<>0 RETURN @@ERROR
    insert into #tmp_lock_who(spid,bl) 
    select 0from (from master..sysprocesses where blocked> ) a
        where not exists( ) b
    where a.blockedspid)
    union 
    select spid,blocked 0
     找到临时表的记录数
        @intCountProperties = Count(*),1)">@intCounter = 1
             #tmp_lock_who
    @@ERROR
        if @intCountProperties0
            select N现在没有阻塞信息!' as message
             循环开始
                while <= @intCountProperties
                    begin
                     取第一条记录
                        @spid = spid,1)">@bl  bl
                            from #tmp_lock_who where Id @intCounter
                        begin
                            @IndividualQuerySUBSTRING (qr.text,qs.statement_start_offset/2CASE WHEN qs.statement_end_offset -THEN LEN(CONVERT(NVARCHAR(MAX),qr.text)) * 2 
                                           ELSE qs.statement_end_offset END - qs.statement_start_offset))
                            FROM SYS.DM_EXEC_REQUESTS qs OUTER APPLY SYS.DM_EXEC_SQL_TEXT(qs.sql_handle) AS qr
                            WHERE qr.text null and qs.session_id@bl
                            @HostName=left(HostName,1); font-weight: bold">50),1)">@AppName=Left(Program_Name,1)">) 
                                With(nolock) Where SPIDset @SQLDBCC INPUTBUFFER ('+cast(20)))'
                            0
                                begin
                                    @Message=N引起数据库阻塞的是: + CAST(AS 100)) + N进程号,其执行的SQL语法如下'
                                    set @SQL='DBCC INPUTBUFFER ('+cast(@bl as char(20))+')'
                                    into #tmp_lock_information(EventType,Parameters,EventInfo) exec(@sql)
                                    update #tmp_lock_information set LockType1',SPID1@bl,SPID2@IndividualQuery,]@Message,AppName@APPName,HostNamewhere is null
                                end
                            else
                                进程号SPID:100))' 10)) +N阻塞,其当前进程执行的SQL语法如下2@spid,1)">end 
                        end
                         循环指针下移
                        + 1
                    end
            drop  #tmp_lock_who
            if  #tmp_lock_information)
            Begin

                    Insert  dblock_information(Message,LockType,SPID1,SPID2,EventType,EventInfo,IndividualQuery,AppName,HostName) 
                    Select ],1)">Substring(EventInfo,1); font-weight: bold">500),HostName  #tmp_lock_information

            End

             #tmp_lock_information
            return 0
end

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( &#39;table_name&#39; [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: &#39;No Process is on the Other End of the Pipe&#39;。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:&#xD;&#xA;对于指定的缓冲区大小而言,源列的数据太大