SQL Server 2000 - '性能:死锁'

Ste*_*old 5 sql-server deadlock sql-server-2000 sql-server-agent

我们今天必须重新启动我们的 SQL Server,我们没有对其进行任何更改。

当它恢复时,我们立即开始从服务器收到此错误

日期/时间:2014/2/27 下午 3:09:31

描述:对象“SQLServer:Locks”的 SQL Server 性能计数器“死锁数/秒”(实例“数据库”)现在高于阈值 1.00(当前值为 2.00)。

评论:(无)

作业运行:(无)

我们运行了DBCC TRACEON (1204)命令并查看了日志,但它没有报告任何死锁。

知道什么会触发它关闭吗?我们每分钟都收到警报,但找不到任何实际的死锁。

编辑:我应该补充一点,在这次重启之前,我们从未收到过这个错误

编辑 2:我们也使用 SQL Server Profiler 来查找死锁,让它运行 5 分钟,在此期间我们收到了 5 个错误警报,当我们检查详细信息时,我们没有发现死锁。

编辑 3:2014 年 3 月 6 日:运行查询并且它起作用了,但它报告了我们的其他详细信息所说的我们没有锁定我们仍然在整个时间内收到错误。

再次感谢你的帮助!

在此处输入图片说明

编辑 4:2014 年 3 月 6 日:我运行了查询,这里是结果集的一个样本,我承认我不确定我在这里看的是什么,也就是说我不确定它是否显示了一些东西我可以采取或不采取行动。

在此处输入图片说明

编辑 5:2014 年 3 月 7 日:下图显示了突然生成此错误的警报。

在此处输入图片说明

谢谢

Cra*_*ein 3

2014 年 3 月 5 日更新

-- 删除了 CTE 和任何可能与 SQL SERVER 2000 不兼容的选项

if OBJECT_ID(N'tempdb..#process', N'U') is not null
    drop table #process
GO

if OBJECT_ID(N'tempdb..#tmp', N'U') is not null
    drop table #tmp
GO

select spid as victim, blocked as blocker
into #process
from master..sysprocesses p1 
where spid > 50
and blocked > 0
and spid <> blocked

insert into #process
select spid as victim, blocked as blocker
from master..sysprocesses p 
inner join #process
on #process.blocker = p.spid
where spid > 50


select  distinct 'dbcc inputbuffer(' + CAST( victim as nvarchar(4)) + ')' as cmd, 'sp_who2 ' + CAST( victim as nvarchar(4)) as spwho, *
into #tmp
from #process 
where blocker = 0
order by victim


select *
from #tmp 
order by victim

DECLARE @cmd nvarchar(400)
DECLARE @spwho nvarchar(12)

DECLARE curseur CURSOR
FOR
    select  cmd, spwho
    from #tmp 
    order by victim

OPEN curseur
FETCH NEXT FROM curseur INTO @cmd, @spwho

WHILE @@FETCH_STATUS = 0
BEGIN
    print (@cmd)
    exec (@cmd)
    print (@spwho)
    exec (@spwho)
    FETCH NEXT FROM curseur INTO @cmd, @spwho
END

CLOSE curseur
DEALLOCATE curseur 

GO

select
    db_name(dbid),
    'dbcc inputbuffer(' + CAST(a.spid as nvarchar(4)) + ')',
    a.spid,
    a.blocked,
    a.status, 
    a.cmd, 
    a.cpu,
    a.waittime,
    a.loginame,
    Base = DB_NAME(a.dbid),
    *
from master.dbo.sysprocesses a
where 1 = 1
    and a.spid > 50
    and spid <> @@spid
order by
    a.blocked desc,
    a.waittime desc,
    a.cpu desc         
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

2013 年 3 月 6 日更新

所以我们看到没有会话被阻止。现在我们还可以查看系统上当前的所有锁。

显示服务器范围内的锁 MSSQL 2000

监控锁活动

select convert(varchar(30), suser_sname(p.sid)) as login,
       convert (smallint, req_spid) As spid,
       convert(varchar(30), db_name(rsc_dbid)) As db_name,
       case rsc_dbid when db_id()
            then convert(varchar(30), object_name(rsc_objid))
            else convert(varchar(30), rsc_objid) end As Object,
       rsc_indid As indid,
       substring (lock_type.name, 1, 4) As Type,
       substring (lock_mode.name, 1, 12) As Mode,
       substring (lock_status.name, 1, 5) As Status,
       substring (rsc_text, 1, 16) as Resource
   from master..syslockinfo s
   join master..spt_values lock_type on s.rsc_type = lock_type.number
   join master..spt_values lock_status on s.req_status = lock_status.number
   join master..spt_values lock_mode on s.req_mode = lock_mode.number -1
   join master..sysprocesses p on s.req_spid = p.spid
   where lock_type.type = 'LR'
     and lock_status.type = 'LS'
     and lock_mode.type = 'L'
     and db_name(rsc_dbid) not in ('master', 'msdb', 'tempdb', 'model')
order by spid, lock_type.number
go
Run Code Online (Sandbox Code Playgroud)

输出将告诉您 1. 持有什么类型的锁:数据库、表、页。2. 锁的模式:S 共享、X 独占、RangeS-S,其中某个范围的值被锁定在索引中

在此输入图像描述

更新 2014 年 3 月 7 日

我已经用一些基本解释更新了您的屏幕截图。我们看到的只是一堆共享数据库锁。

简而言之,系统上的锁是共享的(换句话说,它们不会阻止其他会话访问数据库),这些锁旨在防止在读取数据时数据库被删除、分离或重命名。 /或从该数据库及其内容写入或写入该数据库及其内容。

回到你原来的问题;您的服务器上没有死锁或阻塞的会话。我不记得以前见过这条消息,但从您发回的内容来看,这绝对不是关于死锁的问题,而更可能只是一条信息性消息。

或者使用sp_lock

sp_lock [[@spid1 =] 'spid1'] [,[@spid2 =] 'spid2']

这将使您更详细地了解当前服务器上持有的所有锁。

http://technet.microsoft.com/en-us/library/aa238824(v=sql.80).aspx