查找sqlserver查询死锁源头的方法 sqlserver死锁监控_MsSql

来源:脚本之家  责任编辑:小易  

在SQL Server 2008数据库中,查看死锁可以用存储过程来实现,本文我们主要就介绍了SQL Server 2008查看死锁的存储过程的代码示例,希望能够对您有所帮助。代码示例如下:if exists(select*from dbo.sysobjects where id=object_id(N'[dbo].[sp_who_lock]')and OBJECTPROPERTY(id,N'IsProcedure')=1)drop procedure[dbo].[sp_who_lock]GO use master go create procedure sp_who_lock as begin declare@spid int,@bl int,@intTransactionCountOnEntry int,@intRowcount int,@intCountProperties int,@intCounter int create table#tmp_lock_who(id int identity(1,1),spid smallint,bl smallint)IF@ERROR<>0 RETURN@ERROR insert into#tmp_lock_who(spid,bl)select 0,blocked from(select*from sysprocesses where blocked>0)a where not exists(select*from(select*from sysprocesses where blocked>0)b where a.blocked=spid)union select spid,blocked from sysprocesses where blocked>0 IF@ERROR<>0 RETURN@ERROR-找到临时表的记录数 select@intCountProperties=Count(*),@intCounter=1 from#tmp_lock_who IF@ERROR<>0 RETURN@ERROR if@intCountProperties=0 select '现在没有阻塞和死锁信息' as message-循环开始 while@intCounter取第一条记录 select@spidspid=spid,@blbl=bl from#tmp_lock_who where Id=intCounter begin if@spid=0 select '引起数据库死锁的是:'+CAST(@bl AS VARCHAR(10))+'进程号,其执行的SQL语法如下' else select '进程号SPID:'+CAST(@spid AS VARCHAR(10))+'被'+'进程号SPID:'+CAST(@bl AS VARCHAR(10))+'阻塞,其当前进程执行的SQL语法如下' DBCC INPUTBUFFER(@bl)end-循环指针下移 set@intCounter=intCounter+1 end drop table#tmp_lock_who return 0 end以上就是SQL Server 2008查看死锁的存储过程的代码示例的全部内容,本文我们就介绍到这里了,希望本次的介绍能够对您有所收获!www.zgxue.com防采集请勿采集本网。

查找出SQLServer的死锁和阻塞的源头 --查找出SQLServer死锁和阻塞的源头

为了查看死锁信息,数据库引擎提供了监视工具,分别为两个跟踪标志以及 SQL Server Profiler中的死锁图形事件。跟踪标志 1204 和跟踪标志 1222 发生死锁时,跟踪标志 1204 和跟踪标志 1222 会

复制代码 代码如下:

查询分析器执行 sp_lock 查看 2.右键服务器-选择“活动和监视器”,查看进程选项。注意“任务状态”字段。3.右键服务名称-选择报表-标准报表-活动-所有正在阻塞的事务。祝你愉快,满意请采纳哦

use master

-死锁检测 use master Select*from sysprocesses where blocked<>0 找到SPID exec sp_lock 根据SPID找到OBJID select object_name(85575343) 根据OBJID找到表名

go

declare @spid int,@bl int

master数据库中,有一个叫sysprocess的表(大概的名字)可以看哪个进程被锁了。

DECLARE s_cur CURSOR FOR

打开 SQL Server Profiler 后点选工具栏上的“新建跟踪”按钮,接着在“连接到服务器”窗口设置服务器类型为“Database Engine”、设置服务器名称以及登录服务实例的验证方式,完成后点选“连接”按钮。

select  0 ,blocked

from (select * from sysprocesses where  blocked>0 ) a

where not exists(select * from (select * from sysprocesses where  blocked>0 ) b

where a.blocked=spid)

union select spid,blocked from sysprocesses where  blocked>0

OPEN s_cur

FETCH NEXT FROM s_cur INTO @spid,@bl

WHILE @@FETCH_STATUS = 0

begin

if @spid =0

select '引起数据库死锁的是:

'+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'

else

select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '

进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'

DBCC INPUTBUFFER (@bl )

FETCH NEXT FROM s_cur INTO @spid,@bl

end

CLOSE s_cur

DEALLOCATE s_cur

查看当前进程,或死锁进程,并能自动杀掉死进程 --查看当前进程,或死锁进程,并能自动杀掉死进程

因为是针对死的,所以如果有死锁进程,只能查看死锁进程。当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程。

复制代码 代码如下:

create proc p_lockinfo

@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示

@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示

as

declare @count int,@s nvarchar(1000),@i int

select id=identity(int,1,1),标志,

进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,

数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,

登陆时间=login_time,打开事务数=open_tran, 进程状态=status,

工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,

域名=nt_domain,网卡地址=net_address

into #t from(

select 标志='死锁的进程',

spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,

status,hostname,program_name,hostprocess,nt_domain,net_address,

s1=a.spid,s2=0

from master..sysprocesses a join (

select blocked from master..sysprocesses group by blocked

)b on a.spid=b.blocked where a.blocked=0

union all

select '|_牺牲品_>',

spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,

status,hostname,program_name,hostprocess,nt_domain,net_address,

s1=blocked,s2=1

from master..sysprocesses a where blocked<>0

)a order by s1,s2

select @count=@@rowcount,@i=1

if @count=0 and @show_spid_if_nolock=1

begin

insert #t

select 标志='正常的进程',

spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,

open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address

from master..sysprocesses

set @count=@@rowcount

end

if @count>0

begin

create table #t1(id int identity(1,1),a nvarchar(30),

b Int,EventInfo nvarchar(255))

if @kill_lock_spid=1

begin

declare @spid varchar(10),@标志 varchar(10)

while @i<=@count

begin

select @spid=进程ID,@标志=标志 from #t where id=@i

insert #t1 exec('dbcc inputbuffer('+@spid+')')

if @标志='死锁的进程' exec('kill '+@spid)

set @i=@i+1

end

end

else

while @i<=@count

begin

select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')'

from #t where id=@i

insert #t1 exec(@s)

set @i=@i+1

end

select a.*,进程的SQL语句=b.EventInfo

from #t a join #t1 b on a.id=b.id

end

go

exec p_lockinfo

当死锁发生后,通过服务端的Trace就可以将死锁信息传到日志。在SQL Server 2000时代,只能通过Trace flag 1204来开启,由于Trace flag 1204并不能提供XML死锁图,在SQL Server 2005以及之后的版本被Trace flag 1222所取代。为了在服务端针对所有的Session开启Trace flag 1222。可以通过如代码所示。DBCC TRACEON(1222,-1)另一种方法是开启Profiler来捕捉,Profiler捕捉到的图示死锁信息内容就更直观了,内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • sql server中死锁排查的全过程分享
  • 详解sql server中的事务与锁问题
  • sqlserver:查询锁住sql以及解锁方法
  • sql server学习笔记之事务、锁定、阻塞、死锁用法详解
  • sql server 死锁的监控分析解决思路
  • sql server如何查看被锁的表及解锁的方法
  • sqlserver查询和kill进程死锁的语句
  • sqlserver进程死锁关闭的方法
  • sqlserver锁表、解锁、查看销表的方法
  • sql server三种锁定模式的知识讲解
  • sqldatetime溢出该怎么解决
  • sqlserver索引的原理与应用详解
  • 详解sql中group by的用法
  • sqlserver利用存储过程去除重复行的sql语句
  • sqlserver 不重复的随机数
  • sql学习第一天——sql union 和 union all 操作符认识
  • access数据库的压缩,备份,还原,下载,删除的实现
  • ms-sql server 中单引号的两种处理方法
  • 每个分类取最新的几条的sql实现代码
  • sqlserver 存储过程带事务 拼接id 返回值
  • sql server中怎样查询引起死锁的sql语句
  • 如何查看SQL Server 2008的死锁
  • sql server中怎样查询引起死锁的sql语句
  • sql server中怎样查询引起死锁的sql语句
  • 如何查看SQL Server 2008的死锁
  • 如何查看SQL Server 2008的死锁
  • sql server查询数据会不会引发死锁
  • 如何查看SQL Server 2008的死锁
  • 如何在SQL Server Profiler 中 跟踪查看死锁恢复
  • 如何查看SQL Server 2008的死锁
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mssqlsql server中死锁排查的全过程分享详解sql server中的事务与锁问题sqlserver:查询锁住sql以及解锁方法sql server学习笔记之事务、锁定、阻塞、死锁用法详解sql server 死锁的监控分析解决思路sql server如何查看被锁的表及解锁的方法sqlserver查询和kill进程死锁的语句sqlserver进程死锁关闭的方法sqlserver锁表、解锁、查看销表的方法sql server三种锁定模式的知识讲解sqldatetime溢出该怎么解决sqlserver索引的原理与应用详解详解sql中group by的用法sqlserver利用存储过程去除重复行的sql语句sqlserver 不重复的随机数sql学习第一天——sql union 和 union all 操作符认识access数据库的压缩,备份,还原,下载,删除的实现ms-sql server 中单引号的两种处理方法每个分类取最新的几条的sql实现代码sqlserver 存储过程带事务 拼接id 返回值sql server 2012 安装图解教程(附sql server数据库入门学习总结microsoft sql server 2012 数据sql重复记录查询的几种方法win7系统安装sqlserver2000的详细sqlserver中distinct的用法(不重sql server错误代码大全及解释(sql-order by 多字段排序(升序、sql将一个表中的数据插入到另一个用sql语句添加删除修改字段、一些sql语句优化之用exists替代in、用not exi浅析sql server中包含事务的存储过程强制sql server执行计划使用并行提升在复sqlserver对加密的存储过程、视图、触发器sqlserver timestamp数据类使用介绍sql优化经验总结sqlserver 文件数据库和关系数据库的比较sql server删除表及删除表中数据的方法sqlserver数据备份文件的分割备份方法sqlserver利用存储过程去除重复行的sql语
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved