SQLServer数据库的死锁分析

摘要:
服务器启动时启动事件会话*/SELECTes.name,esf.name,esf.value,es.startup_stateFROMsys.server_event_session_fieldsASesfJOINsys.server_event_sessionsASesONesf.event_session_id=es.event_session_idWHEREes.name='system_health'SELECTs.name,se.event_name,s.create_time--,CASTASTarget_DataFROMsys.dm_xe_sessionssINNERJOINsys.dm_xe_session_eventsseONANDWHEREname='system_health';/*默认情况下,system_health会话使用环形缓冲区目标和事件文件目标存储数据。事件文件目标配置为最大大小为5MB,文件保留策略为4个文件;在SQLServer2008或SQLServer2008R2下,默认使用环形缓冲区目标;而SQLServer2012或以上版本默认使事件文件目标存储数据。我们可以使用下面脚本来查看ringbuffertarget中的死锁信息。
--分析死锁语句--其中时间加八小时为发生死锁时间

SELECTxed.value('@timestamp', 'datetime') asCreation_Date,
       xed.query('.') ASExtend_Event

FROM(
       SELECT CAST([target_data] AS XML) ASTarget_Data
       FROM sys.dm_xe_session_targets ASxt
       INNER JOIN sys.dm_xe_sessions ASxs
       ON xs.address =xt.event_session_address
       WHERE xs.name = N'system_health'
       AND xt.target_name = N'ring_buffer') ASXML_Data
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') ASXEventData(xed)
ORDER BY Creation_Date DESC

以下来自于博客 https://www.cnblogs.com/kerrycode/p/10910538.html

SQLServer数据库的死锁分析第1张SQLServer数据库的死锁分析第2张
/*——以下来自于博客
    https://www.cnblogs.com/kerrycode/p/10910538.html


如果要确认system_health会话是否在启动时是否启动会话,可以使用下面脚本:
startup_state:0 (OFF)。 服务器启动时不启动会话。
               1 (ON)。  服务器启动时启动事件会话
*/

SELECTes.name, esf.name, esf.value, es.startup_state
FROM sys.server_event_session_fields ASesf
JOIN sys.server_event_sessions AS es ON esf.event_session_id=es.event_session_id
WHERE  es.name='system_health'



SELECTs.name , se.event_name, s.create_time
--,CAST(target_data AS XML) AS Target_Data
FROMsys.dm_xe_sessions s 
INNER JOIN sys.dm_xe_session_events se ON ( s.address =se.event_session_address ) 
    AND ( event_name = 'xml_deadlock_report')
WHERE name = 'system_health';


/*
默认情况下,system_health会话使用
    环形缓冲区目标(ring buffer target)和事件文件目标(event file target)存储数据。
    
事件文件目标配置为最大大小为 5 MB,文件保留策略为4个文件;
在SQL Server 2008或 SQL Server 2008R2下,默认使用环形缓冲区目标(ring buffer target);
而SQL Server 2012或以上版本默认使事件文件目标(event file target)存储数据。

如下脚本所示,你可以使用下面脚本查看system_health会话的而设置

*/
    
SELECTes.name, esf.name, esf.value 
FROM sys.server_event_session_fields ASesf 
JOIN sys.server_event_sessions AS es ON esf.event_session_id=es.event_session_id
WHERE es.startup_state=1 AND es.name='system_health' 
    AND (esf.name= 'filename' OR esf.name ='max_file_size' OR esf.name='max_rollover_files')



/*system_health会话分析死锁
如果system_health会话使用ring buffer target保存事件数据的话,那么你需要知道下面这些内容:
ring buffer target将事件数据保存到内存中,事件数据以XML格式存储。一旦事件数据把分配的内存Buffers 用尽,那么最老的事件数据将被清除。
ring buffer target简单地把数据存储到内存中,这种target模式采用两种模式来管理事件:
第一种模式是严格地先进先出(first-in first-out ,FIFO),也就是说,当分配的内存被target耗尽时,从内存中移除创建时间最早的事件。
第二种模式是per-event 先进先出模式,也就是说,每一种类型的事件都持有一个计数。在这种模式下,当分配的内存被target耗尽时,每个类型中创建时间最早的事件从内存中被移除。
我们可以使用下面脚本来查看ring buffer target中的死锁信息。
*/

SELECTDeadlockGraph
    , [DbId] = DeadlockGraph.value ( '(/deadlock/resource-list//@dbid)[1]', 'int')
    , [DbName] = DB_NAME ( DeadlockGraph.value ( '(/deadlock/resource-list//@dbid)[1]', 'int') ) 
    , [LastTranStarted] = DeadlockGraph.value ( '(/deadlock/process-list/process/@lasttranstarted)[1]', 'datetime')
FROM(   
    SELECT CAST ( event_data.value ( '(event/data/value)[1]', 'varchar(max)' ) AS XML ) ASDeadlockGraph   
    FROM( 
        SELECT XEvent.query('.') ASevent_data 
        FROM ( --Cast the target_data to XML
             SELECT CAST( st.target_data AS XML ) ASTargetData 
             FROMsys.dm_xe_session_targets st 
             JOIN sys.dm_xe_sessions s ON s.[address] =st.event_session_address 
             WHERE name = 'system_health' AND target_name = 'ring_buffer') ASData        
        CROSS APPLY      --Split out the Event Nodes         
        TargetData.nodes ( 'RingBufferTarget/event[@name="xml_deadlock_report"]') ASXEventData ( XEvent )   
    ) AStab ( event_data )
) AS A ORDER BY [LastTranStarted];
View Code

免责声明:文章转载自《SQLServer数据库的死锁分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇3 使用selenium模拟登录csdnjsplumb 中文教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据库 简单查询 Sql Server 学生表 课程表 选课表

创建教材中的三张表格,并输入相应的数据 Create table student( Sno char(9), Same char(20), Ssex char(2), Sage smallint, Sdept char(20) ); Create table course( Cno char(4), Cname char(40), Cpno...

SQLServer数据库(二)

数据库设计:就是将数据库中的数据库实体及这些数据库实体之间的关系,进行规划和结构化的过程。 项目开发过程: 需求分析 概要设计 详细设计 代码编写 运行测试 打包发行 数据库的系统分析基本步骤:收集信息、标识实体、标识每个实体需要存储的详细信息、标识实体之间的关系。 实体,就是指现实世界中具有区分其它事物的特征或属性,并与其他实体有联系的实体。实体一般是名...

sql server维护解决方案(备份、检查完整性、索引碎片整理)

请务必看原文原文:https://ola.hallengren.com/frequently-asked-questions.html经常问的问题入门 如何开始使用SQL Server维护解决方案? SQL Server维护解决方案入门很容易。跟着这些步骤。 下载MaintenanceSolution.sql。 在脚本中,找到以下行:SET @Ba...

Ant命令总结

1 Ant是什么? Apache Ant 是一个基于 Java的生成工具。生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本2 下载、安装Ant 安装Ant下载.zip...

Ant基础

一 Ant 介绍 Ant是构建工具,用来实现软件的自动化的构建,类似于VisualStudio的project文件,Linux上构建C++的makefile,Ant通常用来构建Java程序。 Ant是基于XML的文件,所以更容易阅读;Ant是用Java实现的,本身支持跨平台;Ant基于插件的方式开发,本身内置了常用的大部分的插件,而且第三方的扩展也很容易...

Luci实现框架

1.总述 上一篇总结了uhttpd的工作方式,openwrt中利用它作为web服务器,实现客户端web页面配置功能。对于request处理方式,采用的是cgi,而所用的cgi程序就是luci,工作框架如下图所示: Client端和serv端采用cgi方式交互,uhttpd服务器的cgi方式中,fork出一个子进程,子进程利用execl替换为luci进...