6

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

SqlException 未被用户代码处理:

等待页面 (1:37660679)、数据库 ID 10 的缓冲区锁存器类型 2 时发生超时。

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

问题:如何解决或调试此问题?

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

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

日志中没有关于 845 事件的信息。这是我在应用程序日志中找到的一些内容(对于事件 ID 847):

等待闩锁时发生超时:类 'FGCB_ADD_REMOVE',id 00000004F146FBD8,类型 2,任务 0x00000004F60450C8:0,等待时间 300 秒,标志 0x1a,拥有任务 0x00000004EDC38928。继续等待。

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

等待缓冲区锁存器时发生超时——类型 2,bp 00000004F96EE880,页面 1:37660679,stat 0x10b,数据库 ID:10,分配单元 ID:72057594048544768,任务 0x00000004D502E188:0,等待时间,300 秒,标志拥有 01任务 0x00000004D5316558。没有继续等待。

这是 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

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

4

2 回答 2

4

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

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

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

于 2013-02-24T22:32:06.603 回答
1

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

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

一些更一般的“好管家”想法 -

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

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

于 2014-04-09T07:45:55.660 回答