如何修复在等待页(1:37660679)、数据库ID 10的缓冲区闩锁类型2时发生的SqlException超时

本文关键字:缓冲区 类型 2时 超时 SqlException ID 在等待 何修复 数据库 37660679 | 更新日期: 2023-09-27 18:01:07

我运行了几个小时的应用程序,然后突然:

SqlException未由用户代码处理:

等待页面的缓冲区闩锁类型2时超时(1:37660679(,数据库ID 10。

查看异常的详细信息显示它是一个"数字"845"。错误代码和HRESULT-2146232060

问题:如何修复或调试此问题?

  • 我正在运行ASP。NET C#。NET 4.5和SQL Server 2012。

  • 我运行了chkdsk,但没有发现任何错误。

日志中没有任何关于845事件的内容。以下是我在应用程序日志中发现的一些内容(对于事件id 847(:

等待闩锁时超时:类"FGCB_ADD_REMOVE",id0000000 4F146FBD8,类型2,任务0x00000004F60450C8:0,等待时间300秒,标志0x1a,拥有任务0x00000004EDC38928。继续到等待

有很多847看起来差不多。然后,事件id为846:的事件要少得多

等待缓冲区闩锁时发生超时--类型2,bp0000000 4F96EE880,第1:37660679页,数据0x10b,数据库id:10,分配单元Id:72057594048544768,任务0x00000004D502E188:0,等待时间300秒,标志0x1a,拥有任务0x00000004D531658。不继续等待。

以下是847事件的xml视图:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="MSSQLSERVER" /> 
  <EventID Qualifiers="16384">847</EventID> 
  <Level>4</Level> 
  <Task>2</Task> 
  <Keywords>0x80000000000000</Keywords> 
  <TimeCreated SystemTime="2013-02-24T19:21:54.000000000Z" /> 
  <EventRecordID>281870</EventRecordID> 
  <Channel>Application</Channel> 
  <Computer>xyz-PC</Computer> 
  <Security UserID="S-1-and-so-on" /> 
  </System>
- <EventData>
  <Data>FGCB_ADD_REMOVE</Data> 
  <Data>00000004F146FBD8</Data> 
  <Data>2</Data> 
  <Data>00000004D5316188</Data> 
  <Data>0</Data> 
  <Data>1200</Data> 
  <Data>1a</Data> 
  <Data>00000004EDC38928</Data> 
  <Binary>4F0300000A00000006000000540053002D005000430000000800000053006300680061006200650072000000</Binary> 
  </EventData>
  </Event>

错误发生在线上

  db.SubmitChanges();

在手表窗口中,我可以看到:

db.GetChangeSet() {Inserts: 1, Deletes: 0, Updates: 0} System.Data.Linq.ChangeSet

谷歌搜索显示了一些来自微软的修补程序,但它们只适用于SQL server 2008。

如何修复在等待页(1:37660679)、数据库ID 10的缓冲区闩锁类型2时发生的SqlException超时

FGCB_ADD_REMOVE锁存可能意味着在您的情况下,文件由于自动增长而扩展。这会导致大量等待和IO负载。

或者,这可能只是服务器IO过载的症状(由于负载或磁盘故障(。是的,这可能只是一种症状,因为你也看到其他IO等待超时。

确定服务器磁盘是否过载(例如使用perfmon(并改善这种情况。

我建议检查/更改受影响数据库的自动增长设置,可能还有tempdb。右键单击,属性,文件即可到达。然后,如果你只有默认设置(数据自动增长1mb,日志自动增长10%(,则将其更改为10mb和10mb。您可能也想对tempdb执行类似的操作。通常,将这些值设置为适合数据库大小和使用的值。随着时间的推移,你会比我更好地了解这一点。

如果您知道数据库的"正确大小",则应直接在文件属性页中设置该大小,并抢占任何相关的文件扩展错误。我的意思是,例如,如果您的数据库当前为10GB,并且您预计在未来几周内将再添加3或4GB的数据,那么只需将初始大小设置为15GB左右。在估计可能的文件增长时,不要忘记索引也会占用空间。

一些更通用的"良好内务管理"理念-

请确保定期进行碎片整理。

根据CPU的数量考虑几个数据文件。如果可能的话,将数据文件和日志文件放在不同的磁盘上。