无法执行操作,因为链接服务器的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务

Posted

技术标签:

【中文标题】无法执行操作,因为链接服务器的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务【英文标题】:The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server was unable to begin a distributed transaction 【发布时间】:2014-07-23 18:17:50 【问题描述】:

我正在尝试从我的机​​器 (SQL Server 2012) 到客户端服务器 (SQL Server 2008) 运行分布式事务。

我正在尝试运行:

begin distributed transaction
select * from [172.01.01.01].master.dbo.sysprocesses
Commit Transaction

我得到:

OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 2
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" was unable to begin a distributed transaction.

我可以在返回数据的情况下对该服务器运行 SELECT,所以至少我知道服务器可以互相看到,并且链接服务器存在并且正在运行

现在,网上有很多关于这个的帖子,但我无法让它发挥作用。这是我迄今为止尝试过的:

    将 DTC 属性设置为以下(在两个服务器上)

    从控制面板 -> 服务(在两台服务器上)重新启动分布式事务协调器 (MSDTC)。

    卸载和安装 DTC(在两台服务器上)。

    重启远程服务器。

    关闭两台服务器上的防火墙。

    启用 sp_configure 'Ad Hoc Distributed Queries', 1(在两台服务器上)。

    我运行了 DTCPing,它 ping 成功了。

    链接的服务器属性更改为以下内容:

还有什么可以尝试的?

更新: 将事务从另一台服务器运行到 172.01.01.01 有效。 因此,问题不在目标服务器上,而是在我作为源的机器上。

【问题讨论】:

您找到解决方案了吗?如果你这样做,请把答案放在这里:) 我也遇到了同样的问题,如果你找到了解决办法请分享一下 【参考方案1】:

在开始分布式事务上方尝试此 SQL

set XACT_ABORT on

【讨论】:

msdn.microsoft.com/en-us/library/ms188792.aspx。看起来不是一个好的解决方案。【参考方案2】:

如果根据 OP 的原始帖子在两个 SQL 服务器上配置您的 MS 分布式事务协调器 (MSDTC) 后,您仍然得到“没有事务处于活动状态”,您应该检查每个主机是否可以通过 IP 访问(假设这是您已经使用)在链接服务器中注册。

例如;在最近的设置中,可以通过 192.168.200.x 范围(同一子网)中的网络访问两个 SQL 服务器,但每个服务器也通过 10.x.x.x 范围内的 IP 间接连接。在一台 SQL Server 上,它使用的 DNS 服务器一直将目标 SQL 服务器解析为其 10.x.x.x IP(已被防火墙),即使链接服务器条目使用目标服务器的 192.168.200.x 中的 IP。

似乎 MSDTC 使用服务器的主机名,而 SQL 服务器使用链接服务器条目中定义的 IP 或主机名通过任何链接连接进行连接,导致在 SQL 中检查目标链接服务器时出现明显连接的这种令人困惑的行为Management Studio,但无法在目标上执行远程过程。

解决方案是在主机文件 (%windir%\system32\drivers\etc\hosts) 中添加条目,以显式强制每个 SQL 服务器将另一个解析为 192.168.200.x 网络上的 IP 地址。

在主机 1 上(IP 192.168.200.15):

# TARGET SERVER
192.168.200.20    targetserverhostname.and.any.domain.suffix  targetserverhostname

在主机 2 上(IP 192.168.200.20

# SOURCE SERVER
192.168.200.15    sourceserverhostname.and.any.domain.suffix sourceserverhostname

不要忘记确保 MSDTC 已根据上面 OP 的屏幕截图进行配置,允许网络访问和(如果需要)无身份验证。

【讨论】:

【参考方案3】:

我遇到了类似的问题,我解决了如下问题。 SQL Server 的对象资源管理器的树结构中有一个节点。在那里你会发现 Serverobjects → LinkedServers → 下面有一个分布式服务器的 IP 地址列表。

右键单击它,选择属性,会弹出一个窗口。在左侧窗格中选择服务器选项;您将获得属性列表。将标志值 false 设置为属性“启用分布式事务的提升”。

【讨论】:

【参考方案4】:

将“启用分布式事务提升”标志设置为 false(在链接服务器属性窗口中)解决了我的类似问题。

【讨论】:

究竟是什么解决了我的问题! 你的回答在2021年依然有用 干杯【参考方案5】:

我遇到了类似的问题。浏览了所有列出的内容,但无济于事。我们有一个集群环境,事实证明我们的 DBA 是在集群上而不是在主服务器上进行服务工作。如果一切都失败了,请记住这一点:-)

【讨论】:

【参考方案6】:

条件这样可能会导致同样的错误:

1- 像这样运行事务脚本并从链接服务器读取:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
Begin Tran
... (select command from linked server)...
Commit

2- 在代码中打开一个新连接并运行一个非事务性脚本

结果:将引发错误!

解决方法:删除SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

【讨论】:

以上是关于无法执行操作,因为链接服务器的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务的主要内容,如果未能解决你的问题,请参考以下文章

无法执行该操作,因为链接服务器 "XXX" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务。

无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行

无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”的数据源对象

SQL Server:无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象

因为链接服务器 "XXXX" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务

链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务 外加SQL事务死锁问题