本文可帮助你解决运行 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) 下载。