如何修复错误“灾难性故障。无法从OLE DB提供程序“OraOLEDB.Oracle”检索与链接服务器相关的行”。

4

我有一个SQL Server 2008 R2 64位版本,并使用OraOLEDB.Oracle提供程序建立了到Oracle 12c的联接服务器。

当我使用OPENQUERY从Oracle联接服务器获取数据时,我收到以下错误消息:

链接服务器的OLE DB提供程序“OraOLEDB.Oracle”报告了一个错误,该提供程序报告了意外的灾难性故障。

无法从链接服务器的OLE DB提供程序“OraOLEDB.Oracle”中获取一行。

在OraOLEDB.Oracle提供程序选项中,已选中Allow Inprocess。

此错误仅在查询所有数据时发生,但是如果我添加WHERE子句WHERE ROWNUM <100以将行限制为99行,则可以避免这种情况。

其他使用相同环境的服务器没有此问题。

我尝试了取消勾选/重新勾选Allow Inprocess,但没有成功。 我尝试卸载现有的Oracle客户端并重新安装它,但也没有成功。


1
还在同样的战斗中,有什么线索吗? - Claudio Lopes
2个回答

1
请确保“用户”组对安装Oracle客户端的完整目录具有“读取和执行”,“列出文件夹内容”和“读取”权限。这就是我解决问题的方法。
我在SQLPlus中也可以正常使用查询,但只要我尝试使用链接服务器从Toad执行它,我就会遇到“灾难性故障”。我还无法从SSMS中查看链接服务器的视图或表。 最后,我回到了基础知识,并检查了驱动程序目录上的用户权限,它们都很混乱。 我进入了离驱动器根目录不远的基本文件夹,检查了安全性,然后转到该选项卡中的“高级”。 然后,在“高级安全设置”中点击“更改权限”。 一旦您这样做,就会有一个复选框“替换此对象的所有子对象权限条目为可继承权限条目”。选中该框并单击“确定”。
我验证了SQLPlus查询仍然有效,然后运行了所有失败的测试查询,它们现在都提供了结果。我现在也能在SSMS中看到表格和视图。

0

这篇文章(法语的,如果需要可以使用Google Chrome自动翻译),讨论了使用FetchSize参数来控制每个“页面”获取多少行。在那篇文章中,他们说将该值(默认为100)设置为101足以解决所有请求的错误,无论他们请求多少行。(在我的情况下,使用101的值并没有比使用100的值多给我一行更多的结果)。

请注意,FetchSize值可以像那篇文章中所述,在注册表中设置,也可以在创建Linked Server的脚本中设置:

EXEC master.dbo.sp_addlinkedserver @server = N'MyLinkedServer', 
    @srvproduct=N'Oracle', @provider=N'OraOLEDB.Oracle', 
@datasrc=N'MyDNSnameForMyOracleServer:1521/MyServiceName',
    @provstr='FetchSize=1000'

请注意,在我的实验中,我发现将FetchSize设置为更大的数字会导致问题,具体取决于我查询的表有多宽。对于一个非常宽的表(494列),我无法在FetchSize > 3062的情况下使其工作。使用两列查询,我可以将其增加到10m至100m之间(然后开始出现内存分配错误)。
无论如何,感觉这一定是Oracle Client的bug(我们正在使用版本21.3-64位),因为select语句应该成功检索所有记录,而不管FetchSize参数如何。
也许调整FetchSize参数可以帮助你解决问题,如果问题仍然存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接