• 怎么捕获和记录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日志)
     
    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
     
     
     
     
    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, 1) NOT NULL, 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
     
    设置完成后,应该如下图所示:
     
     
    在"响应"选项卡中,选中"执行作业",并选择步骤3中我们新建的作业(即DeadlockJob)
     
    到这里为止,我们已经完成了全部步骤,以后,你就可以随时查询DeadLockLog表,来显示死锁信息了。
     
    方法二:利用服务器端跟踪。
     
    具体实现步骤如下:
     
    1.编写如下脚本,并执行
     
    SQL code
    -- 定义参数 
     declare @rc int
     declare @TraceID int 
    declare @maxfilesize bigint
    set @maxfilesize = 5
     -- 初始化跟踪 exec @rc = sp_trace_create @TraceID output, 0, N'e:DbLogdeadlockdetect', @maxfilesize, NULL 
    --此处的e:dblogdeadlockdetect是文件名(可自行修改),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, 148, 11, @on
     exec sp_trace_setevent @TraceID, 148, 4, @on
     exec sp_trace_setevent @TraceID, 148, 14, @on
     exec sp_trace_setevent @TraceID, 148, 26, @on
    exec sp_trace_setevent @TraceID, 148, 64, @on
     exec sp_trace_setevent @TraceID, 148, 1, @on 
    -- 启动跟踪 
    exec sp_trace_setstatus @TraceID, 1
    -- 记录下跟踪ID,以备后面使用 
     select TraceID = @TraceID 
    goto finish
    error:
     select ErrorCode=@rc
     finish:
     go
     
     
     
    运行上述语句后,每当SQL Server中发生死锁事件,都会自动往文件e:DbLogdeadlockdetect.trc中插入一条记录。
     
    2.暂停和停止服务器端跟踪
     
    如果要暂停上面的服务器端跟踪,可运行下面的语句:
     
    SQL code
    exec sp_trace_setstatus 1, 0 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为0,即暂停
     
     
     
    如果要停止上面的服务器端跟踪,可运行下面的语句:
     
    SQL code
    exec sp_trace_setstatus 1, 2 --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为2,即停止
     
     
     
    3.查看跟踪文件内容
     
    对于上面生成的跟踪文件(e:DbLogdeadlockdetect.trc),可通过两种方法查看:
     
    1).执行t-sql命令
     
    SQL code
    select * from fn_trace_gettable('e:DbLogdeadlockdetect.trc',1)
     
     
     
    结果中的TextData列即以XML的形式返回死锁的详细信息。
     
    2).在SQL Server Profiler中打开。
     
    依次 进入Profiler -> 打开跟踪文件 ->选择e:DbLogdeadlockdetect.trc,就可以看到以图形形式展现的死锁信息了。
     
    原文来源:http://topic.csdn.net/u/20101220/14/b18ca50f-708a-4548-937d-3f47b49ffec2.html

  • 相关阅读:
    龙井和碧螺春的功效与作用
    064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
    063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法
    062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用
    061 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 08 一维数组总结
    060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序
    059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环
    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值
    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
    056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用
  • 原文地址:https://www.cnblogs.com/yangkangIT/p/14329147.html
Copyright © 2020-2023  润新知