Mysql应用如何捕获和记录SQL Server中发生的死锁

Mysql应用如何捕获和记录SQL Server中发生的死锁,第1张

概述介绍《Mysql应用如何捕获和记录SQL Server中发生死锁》开发教程,希望对您有用。

《MysqL应用如何捕获和记录sql Server中发生的死锁》要点:
本文介绍了MysqL应用如何捕获和记录sql Server中发生的死锁,希望对您有用。如果有疑问,可以联系我们。

方法一:利用sql Server代理(Alert+Job)
具体步骤如下:
1.首先使用下面的命令,将有关的跟踪标志启用.
sql code
DBCC TRACEON (3605,1204,1222,-1) 
说明:
3605 将DBCC的结果输出到错误日志.
1204 返回参与死锁的锁的资源和类型,以及受影响的当前命令.
1222 返回参与死锁的锁的资源和类型,以及使用了不符合任何 XSD 架构的 XML 格式的受影响的当前命令(比1204更进一步,sql 2005及以上可用).
-1 以全局方式打开指定的跟踪标记.
以上跟踪标志作用域都是全局,即在sql Server运行过程中,会一直发挥作用,直到sql Server重启.
如果要确保sql Server在重启后自动开启这些标志,可以在sql Server服务启动选项中,使用 /T 启动选项指定跟踪标志在启动期间设置为开.(位于sql Server配置管理器->sql Server服务->sql Server->属性->高级->启动参数)
在运行上面的语句后,当sql Server中发生死锁时,已经可以在错误日志中看到了,但还不够直观(和其它信息混在一起).(SSMS -> sql Server实例 -> 管理 -> sql Server日志)MysqL学习

2.建表,存放死锁记录
sql code
USE [Cole] --Cole是我的示例数据库,你可以根据实际情况修改. 
GO 
CREATE table DeadLockLog ( 
ID int IDENTITY (1,1) NOT NulL,  
LogDate DATETIME,  
ProcessInfo VARCHAR(10),  
ErrorText VARCHAR(MAX) 

GO  MysqL学习

3.建立JOB
新建一个JOB(假设名称为DeadLockJob),在"步骤"中新建一步骤,随便写一个步骤名称,数据库为"Cole"(见2.建表),在"命令"栏中输入以下语句:
sql code
--新建临时表 
IF OBJECT_ID('tempdb.dbo.#ErrorLog') IS Not Null 
DROP table #ErrorLog 
CREATE table #ErrorLog (ID int IDENTITY (1,a DATETIME,b VARCHAR(10),c VARCHAR(MAX)) 
--将当前日志记录插入临时表 
INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog 
--将死锁信息插入用户表 
insert DeadLockLog 
select a,b,c  
from #ErrorLog  
where ID >= (select MAX(ID) from #ErrorLog WHERE c like '%Deadlock encountered%')
DROP table #ErrorLog 

4.新建警报
在"新建警报"窗体的"常规"选项卡中,进行以下设置:
名称:可根据实际自行命名,这里我用DeadLockAlert
类型:选择"sql Server性能条件警报"
对象:sqlServer:Locks
计数器:Number of Deadlocks/sec
实例:_Total
计数器满足以下条件时触发警报:高于
值:0
设置完成后,应该如下图所示:


MysqL学习

在"响应"选项卡中,选中"执行作业",并选择步骤3中我们新建的作业(即DeadlockJob)
到这里为止,我们已经完成了全部步骤,以后,你就可以随时查询DeadLockLog表,来显示死锁信息了.MysqL学习

方法二:利用服务器端跟踪.
具体实现步骤如下:
1.编写如下脚本,并执行
sql code
-- 定义参数 
declare @rc int 
declare @TraceID int 
declare @maxfilesize bigint 
set @maxfilesize = 5  
-- 初始化跟踪 
exec @rc = sp_trace_create @TraceID output,N'e:/DbLog/deadlockdetect',@maxfilesize,NulL  
--此处的e:/dblog/deadlockdetect是文件名(可自行修改),sql会自动在后面加上.trc的扩展名 
if (@rc != 0) goto error 
-- 设置跟踪事件 
declare @on bit 
set @on = 1 
--下述语句中的148指的是locks:deadlock graph事件(参见sys.trace_events),12指的是spID列(参见sys.trace_columns) 
exec sp_trace_setevent @TraceID,148,12,@on   
exec sp_trace_setevent @TraceID,11,@on 
exec sp_trace_setevent @TraceID,4,14,26,64,1,@on 
-- 启动跟踪 
exec sp_trace_setstatus @TraceID,1 
-- 记录下跟踪ID,以备后面使用 
select TraceID = @TraceID 
goto finish 
error:  
select ErrorCode=@rc 
finish:  
go 
运行上述语句后,每当sql Server中发生死锁事件,都会自动往文件e:/DbLog/deadlockdetect.trc中插入一条记录.MysqL学习

2.暂停和停止服务器端跟踪
如果要暂停上面的服务器端跟踪,可运行下面的语句:
sql code
exec sp_trace_setstatus 1,0 --第一个参数表示TraceID,即步骤1中的输出参数.第二个参数表示将状态改为0,即暂停
如果要停止上面的服务器端跟踪,2 --第一个参数表示TraceID,即步骤1中的输出参数.第二个参数表示将状态改为2,即停止MysqL学习

3.查看跟踪文件内容
对于上面生成的跟踪文件(e:/DbLog/deadlockdetect.trc),可通过两种方法查看:
1).执行t-sql命令
sql code
select * from fn_trace_gettable('e:/DbLog/deadlockdetect.trc',1) 

结果中的TextData列即以XML的形式返回死锁的详细信息.
2).在sql Server Profiler中打开.
依次 进入Profiler -> 打开跟踪文件 ->选择e:/DbLog/deadlockdetect.trc,就可以看到以图形形式展现的死锁信息了.
MysqL学习

总结

以上是内存溢出为你收集整理的Mysql应用如何捕获和记录SQL Server中发生的死锁全部内容,希望文章能够帮你解决Mysql应用如何捕获和记录SQL Server中发生的死锁所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162505.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存