Oracle链接服务器导致SQL Server异常终止

笔记哥 / 05-09 / 28点赞 / 0评论 / 320阅读
## 现象 首先该链接服务器是使用 OraOLEDB provider (OLEDB Provider for Oracle)创建的,在使用该链接服务器的SQL语句中出现特殊字符 “--”时,例如,SELECT \* FROM OPENQUERY(LINKEDSERVER\_OA,‘SELECT \* FROM student WHERE name = ''王'' --一些注释’),就会导致SQL Server服务异常终止。 在Windows 系统事件日志中看到“SQL Server (MSSQLSERVER) 服务意外终止,它已执行此操作 X 次”的错误消息。另外SQL Server会生成DUMP文件。 ![](https://cdn.res.knowhub.vip/c/2505/09/9dc4b2ce.png?G1QAAETd9Ly0MbTQ7jvd0Q2cCq4ZkKgiqNSzXs%2f%2f73OJvF8S1HrPPlaeD3%2foY6WEw5xC0GAoHtFgoSS9OLRpKLzumQ%3d%3d)  注意,软硬件故障、杀毒软件、安全软件等都会导致SQL Server进程异常终止并生成EXCEPTION\_ACCESS\_VIOLATION的DUMP。因此一定要通过WinDbg分析DUMP文件,只有看到下面的程序运行堆栈才能确定是链接服务器导致的。 ![](https://cdn.res.knowhub.vip/c/2505/09/674e76f0.png?G1QAAMTsdJzIJ5Ki26hD2jvFHc2ARBVBpZ71es9Z%2byb6fheIxme0Pn1%2f%2bEPr06kWWBESiMEQPCozgML5ChWqklRzXMMB) ## 原因 首先这是Oracle的链接服务器提供程序(OraOLEDB Provider)的BUG,当遇到特殊字符“--”时,错误地修改了不属于它的堆内存,如果进程内的堆函数不稳定,为了防止数据损坏,操作系统会自动关闭该进程。 当该链接服务器提供程序配置为“允许进程内”,SQL Server进程将一起关闭。详细请参考微软官方文档:https://learn.microsoft.com/en-US/troubleshoot/sql/database-engine/linked-servers/crashes-run-oracle-linked-server-query。 ![](https://cdn.res.knowhub.vip/c/2505/09/450dc382.png?G1UAAMS22TiVehlo29gP%2fkNfQTUDFWkElXrW6713n0b0%2fQGG5mf2seJ8%2bEUfK8iNq4HAqFyRArsISxEzS5CibnCVvGcA) ## 解决 1. 去掉SQL语句中的特殊字符,如果是为了注释用的,可以替换成“/\*\*/”; 2. Oracle官网上下载最新的链接服务器提供程序,https://www.oracle.com/database/technologies/odac-downloads.html; 3. 禁用该提供程序的“允许进程内”选项(重启SQL Server服务后生效)。链接服务器提供程序进程作为独立的进程运行,被终止时不会导致SQL Server进程的终止,把影响控制在局部。