浅谈一次恼火的死锁追踪经历

最近,刚跳槽到一新公司,就遇到生产数据库晚上突然出现大面积中断,并持续近一小时,而发生事故时,我没有在现场,错过了直接获取信息的机会;过后boss要求追查原因,于是艰难的排查过程开始了。

开始以为是数据库某个JOB运行出现异常引起或者是因为程序里面哪个鸟人写了垃圾语句造成了大面积的死锁,于是将收集的trace信息拿到本地分析,从收集到的trace信息看,数据库在19:49:28时出现了锁,系统cancel了它,而且是连续三个,之后数据库大部分连接都是Abort了。

 

初步估计应该是死锁了,首先想到的就是因为数据库更新语句造成,于是查找Agent里面是否有对应时间的JOB运行,结果没有匹配的,然后分析trace文件里面是否有该时间段内运行的长Update、Insert或者Delete语句,查了半天也没发现,汗。。。,调查长查询,还是没有,狂汗。。。

Trace文件分析来分析去也没办法定位到具体语句(Trace 文件中只抓取了运行时间超过2秒或者读大于10000的记录),看来问题不是那么简单了;光根据Trace文件信息想要找到凶手估计不可能了,于是把Windows日志和数据库错误日志都查了一遍,也没有发现任何异常,难道是无头案。。。(没查到任何信息,担心饭碗不保了)

想来想去,也问了一些牛人,都没有啥结果,看来通过手头上现有的资料估计要找出问题是没多少希望了,只能另辟蹊径;既然可以肯定是因为死锁造成的,那说明数据库里面肯定存在资源的不一致访问或者竞争,那就从死锁下手,于是先清空掉当前的数据库错误日志文件,再打开1204和1222跟踪标志,等待鱼儿上钩。

  1. DBCC errorlog 
  2. DBCC TRACEON (1204, 1222, -1); 
  3. DBCC tracestatus 

收集了几天数据,准备收网了,将ERROR.LOG从服务器拷贝到本地,用UE打开,认真一行行看,找到如下信息:

  1. Deadlock encountered .... Printing deadlock information 

果然是死锁,总算找到真凶了,用UE查找一把,不查不知道,一查吓一跳,一堆死锁… 

死锁信息如下:

查看一下页面信息:

  1. DBCC TRACEON (3604)   
  2. DBCC PAGE('XXXX',1,22664690,3) WITH TABLERESULTS  
  3. DBCC TRACEOFF (3604) 

这些页面信息都正常。

再根据信息,Input Buf 的信息,反过来查询Trace文件(Input Buffer 只能存放255个字节,信息显示不全,只能反过来找):

  1. select top 10 * from fn_trace_gettable('F:\perfmon\Trace_xxxx_20110406A.trc',default)   
  2. where TextData like '%@SMESSAGE varchar(8000),@SINMATERECID varchar(8000),@SREFRECID varchar(8000)%' 

 

  1. select top 10 * from fn_trace_gettable('F:\perfmon\Trace_xxxx_20110406A.trc',default)   
  2. where TextData like '%@P0_ varchar(7),@P1_ datetime,@P2_ datetime,@P3_ varchar(7),@P4_ datetime%' 

 

 发现,死锁在表Rec_Main表上,一个是修改,一个是查询,而这个表数据量达700多W,又一个汗…..

 

不过很奇怪的是,死锁显示的信息都是些简单的修改(单条记录修改)和查询操作,不至于引起这么多死锁呀,继续头大中…

继续追查后发现,这两个操作在数据库中比较频繁(一天的trace记录):

  1. select COUNT(0) from fn_trace_gettable('F:\perfmon\Trace_xxxx_20110406A.trc',default)   
  2. where TextData like '%@P0_ varchar(7),@P1_ datetime,@P2_ datetime,@P3_ varchar(7),@P4_ datetime%' 

 

  1. select COUNT(0) from fn_trace_gettable('F:\perfmon\Trace_xxxx_20110406A.trc',default)   
  2. where TextData like '%@SMESSAGE varchar(8000),@SINMATERECID varchar(18),@SREFRECID varchar(8000)%' 

一天的死锁次数大概有20次左右,Update一次只有一条记录,但是为啥会出现如此频繁的死锁呢? 除了这个表本身的数据量大
以及查询超级变态之外(后面发现是主因),还有没有其他的原因呢?

最后,实在找不出问题所在,将问题反映到微软,和微软的人经过几天的沟通,最终给出的结果是数据库的Bug(吐血,运气真好呀),微软回答如下:

问题分析:

========

您的数据库版本是:Microsoft SQL Server 2005 – 9.00.4207.00 (Intel IA-64)  Enterprise Edition,SP3 CU1

我检查了您提供的死锁相关信息后发现,如您所说,您的这个死锁问题正是SQL2005的Bug所引起,详细可以参考文档:<http://support.microsoft.com/kb/975090>

处理方法:

============

您可以单独安装SP3 CU6,也可以直接安装SP4来解决您的这个问题

SP3 CU6下载地址:<http://support.microsoft.com/kb/974648>

SP4下载地址:<http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b953e84f-9307-405e-bceb-47bd345baece>

您的SQL Server是IA64的版本,所以请选择正确对应的安装文件

——-补充—

微软虽然给出了一个可能的原因(还不知道靠不靠谱),但是基于目前系统的情况,boss不建议打补丁(要留到定期维护的时候再做),于是要我提改进方案,有了以上的追踪信息,再来提改进方案就不是什么难事了,于是mail给了boss:

根据这些信息,我们可以知道:

死锁主要发生在表Rec_main上,这个表的数据量有700多万;

 主要是由一个Update和一个Select语句引起了死锁,这两条语句运行频率比较高,并且查询语句非常长(见附件,这样的查询不可能使用到索引);

主要问题出在这个复杂的查询和表的数据量上(还包括微软说的bug);

目前这种死锁在我们数据库里面还是频繁的发生。

为处理这种情况,有以下建议:

业务上,是否能够将该表的信息分开,减少数据量;

开发人员能否改进这个查询语句;

查询是否可以考虑加上with(nolock),Update 语句可以加上 with(rowlock);

其他(考虑分区表等)。

最终,将表中数据搬移掉一部分,修改了查询的语句,同时加上了with(nolock),问题得到解决(至于微软的方案,要见下回分解了)

原文链接:http://www.cnblogs.com/fygh/archive/2011/04/12/DeadLock.html

 

 

 

【编辑推荐】

  1. SQL Server & 死锁
  2. SQL Server死锁的解除方法
  3. SQL Server死锁监控的语句写法
  4. 深度探究SQL Server死锁的原因

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/232400.html<

(0)
运维的头像运维
上一篇2025-04-20 03:48
下一篇 2025-04-20 03:49

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注