《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学习 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|