运行 Oracle 链接服务器查询时 SQL Server 服务崩溃

本文可帮助你解决运行 Oracle 链接服务器查询时可能发生的问题。

原始产品版本:SQL Server
原始 KB 数: 2295405

现象

假设出现了下面这种情景:

  • 在运行 Windows Server 的计算机上安装 SQL Server。
  • 为 Oracle 数据库创建链接服务器。
  • 使用 OraOLEDB 提供程序(用于 Oracle 的 OLEDB 提供程序)运行链接服务器查询。

在此方案中,SQL Server 服务崩溃,不会为查询返回任何结果。 此外,你可能会注意到以下问题:

  • 在 Windows 系统事件日志中收到以下错误消息:

    SQL Server (MSSQLSERVER) 服务意外终止。 它已经完成了这 1 次(秒)。

  • SQL Server 进程的小型转储文件会生成堆损坏,并收到类似于以下内容的异常消息:

    在 minidump.mdmp 中,程序集指令位于 ntdll!来自 Microsoft Corporation 的 C:\Windows\System32\ntdll.dll 中的 RtlReportCriticalFailure+62 导致线程 235 上出现未知异常(0xc0000374)
    或者有时在错误日志中可以看到另一个异常:
    SqlDumpExceptionHandler:进程 74 生成了致命异常 c0000005 EXCEPTION_ACCESS_VIOLATION。 SQL Server 正在终止此进程。

  • 小型转储文件的堆栈包含Sqlserver.exe进程中的第三方模块。 例如,小型转储文件在 Oracle 模块中包含以下信息:

    OraOLEDButl11
    OraOLEDBrst11
    OraOLEDBrst10
    
    Full Call Stack:
    
    ntdll!RtlReportCriticalFailure+62 
    ntdll!RtlpReportHeapFailure+26 
    ntdll!RtlpHeapHandleError+12 
    ntdll!RtlpLogHeapFailure+a4 
    ntdll!RtlFreeHeap+1aa8f 
    ole32!CoTaskMemFree+36 
    OraOLEDButl11+1a5f 
    0x403d6b00 
    0x00000001 
    0x4d200e30 
    0x00000024 
    0x403d7ab8 
    OraOLEDBrst11+12843 
    0x403b8c00 
    0x403c95f0 
    0x403ca610 
    0x403ca610 
    0x403c95f0 
    OraOLEDBrst11+128b1 
    0x403d7ab8 
    0x403c95f0 
    0x4966a260 
    0x05cd21e0 
    

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。

原因

出现此问题的原因是 Oracle 链接服务器的查询中存在特殊字符 -- 。 这些字符用于表示注释符号。

SQL Server 进程崩溃,因为第三方链接服务器提供程序在 SQL Server 进程中加载,它错误地修改了不属于它的堆内存。 如果进程内的堆函数不稳定,为了防止数据损坏,操作系统会自动关闭该过程。 如果第三方链接服务器提供程序与 “允许进程 内”选项一起启用,则当第三方链接服务器遇到上述问题时,SQL Server 进程会崩溃。

解决方法

在某些情况下,以下方法之一可解决问题:

  • 删除注释符号。
  • 将注释符号替换为 /* */

解决方法

请联系第三方提供商获取信息和最新修补程序。 有关最新的 OLEDB 提供程序版本,请参阅 64 位 Oracle 数据访问组件 (ODAC) 下载