SQL Server 生成零星内存转储

Dep*_*eld 6 sql-server dump sql-server-2014

我们正在运行 2014 年的 SQL Server。在过去的几年里,服务器每 2-7 天就会无缘无故地生成一次内存转储,锁定大多数进程,并迫使我们重新启动 SQL 服务才能使其运行。

这是错误文件的片段:

Exception Address = 00007FFAD7FCBAA2 Module(combase+000000000003BAA2)
Exception Code    = c0000005 EXCEPTION_ACCESS_VIOLATION
Access Violation occurred reading address 00000000D8063158
Input Buffer 74 bytes -
Run Code Online (Sandbox Code Playgroud)

还有什么我们应该探索的吗?
或者让 Microsoft 分析.MDMP文件是我们唯一的选择吗?

需要提及的要点:

  • 我们已将其修补到最新的服务包,以及最新的累积和 GDR 更新。没有改变

    Microsoft SQL Server 2014 (SP3-CU4-GDR) (KB5014164) - 12.0.6439.10 (X64)   
    
    Run Code Online (Sandbox Code Playgroud)
  • 没有与这些内存转储发生时间相关的特定 SQL 语句/存储过程。

  • SQL 数据库文件在与操作系统不同的硬盘上运行。它是一个 1TB 驱动器,在任何给定时间都有 250GB 可用空间。

  • 该计算机是 Windows Server 2012 R2 虚拟机

  • CHKDSK在操作系统和数据驱动器上未发现任何错误。

  • DBCC 检查顺利通过。

  • OPENQUERY&OPENROWSET功能使用相当频繁,使用最新的ACE&ODBC驱动程序。

  • 如果我查询 sys.dm_server_memory_dumps,这是按日期排列的记录计数:

       creation_time  QTY
       2022-09-13 1
       2022-09-09 38
       2022-09-07 11
       2022-09-06 21
       2022-09-04 1
       2022-08-25 2
       2022-08-24 11
       2022-08-23 7
       2022-08-22 1
       2022-08-21 1
       2022-08-17 9
       2022-08-09 7
       2022-07-29 1
       2022-07-27 1
       2022-07-22 1
    
    Run Code Online (Sandbox Code Playgroud)

Dep*_*eld 3

只是对此的后续 - 我们让 Microsoft 分析了内存转储文件,结果发现OPENQUERYOPENROWSETSQL 语句是罪魁祸首。

  1. 我们将Microsoft Access Database Engine驱动程序(2010 和 2016)更新到最新版本
  2. OPENQUERY 语句中的许多注释都使用了双连字符--,由于某些奇怪的原因,这偶尔会导致 Oracle OLEDB 提供程序崩溃/内存转储。/* */我们用注释替换了所有双连字符 synatx

从那时起,我们就看到了令人难以置信的稳定。

  • --双连字符注释是魔鬼的作品 (3认同)