MSSQLSERVER_7391

适用于:SQL Server

属性 Value
产品 SQL Server
事件 ID 7391
事件源 MSSQLSERVER
组件 SQLEngine
符号名称 RMT_TRANS_JOIN_FAIL
消息正文 无法执行该操作,因为链接服务器 "%ls" 的 OLE DB 访问接口 "%ls" 无法启动分布式事务。

说明

发生此错误的原因是 Microsoft 分布式事务处理协调器 (MSDTC) 服务未运行或已禁用网络访问。

在某些情况下,也可能收到错误 8522:

Microsoft Distributed Transaction Coordinator (MS DTC) has stopped this transaction.

7300 到 7399 范围内的错误号表示影响提供程序的问题。 由于每个提供程序可能具有不同的功能并显示不同的详细信息,因此可能不会收到完整的错误消息。 若要从提供程序检索完整的错误消息,请在运行生成错误的查询之前运行以下命令:

DBCC TRACEON (3604, 7300)

如果从 SQL Server 复制或 SQL Server Integration Services (SSIS)等进程收到错误 7391,则如果代码包含 BEGIN DISTRIBUTED TRAN 语句,则也可能会收到错误消息。

用户操作

注意

最佳做法是限制事务中的代码,该事务涉及仅对远程服务器进行的分布式查询。

可支持性

  • 若要检查驱动程序是否支持分布式事务,请联系链接服务器查询中使用的驱动程序供应商。

  • 检查目标服务器上的对象是否指向第一台服务器。 这称为环回情况。 环回链接服务器 用于测试,许多操作(如分布式事务)不支持。

服务器通信

若要确保服务器之间的通信成功,请执行以下步骤:

  1. 检查网络名称解析是否正常工作。 确保服务器可以按名称相互通信,而不仅仅是通过 IP 地址进行通信。 检查两个方向(例如,从服务器 A 到服务器 B,从服务器 B 到服务器 A)。 在运行分布式查询之前,请解决网络上的所有名称解析问题。 这可能涉及更新 WINS、DNS 或 LMHost 文件。

  2. 如果有防火墙,请确保正确打开远程过程调用(RPC)端口。 有关详细信息,请参阅以下文章:

  3. 检查指向目标服务器上的对象。 如果对象是视图或存储过程,或者它导致触发器运行,请检查它是否隐式指向另一个服务器。 如果是,则第三台服务器是问题的根源。 直接在第三台服务器上运行查询。 如果无法执行此操作,则链接服务器查询不是问题。 首先解决基础问题。

  4. 检查是否使用远程访问服务器(RAS)访问远程服务器。 如果是,请确保已实现路由 RAS(RRAS)。 链接服务器不适用于 RAS,因为 RAS 仅允许单向通信。

服务器配置

按照以下步骤配置服务器:

  1. 在分布式事务涉及的所有服务器上启动分布式事务处理协调器(DTC 或 MS DTC)。 有关启用网络 DTC 访问的信息,请参阅 OLE DB 提供程序 - SQL Server 的错误消息。

  2. 针对 大多数 OLE DB 访问接口(包括 SQL Server)在隐式或显式事务中,将XACT_ABORT 选项设置为 ON。 在运行查询之前,可以运行以下命令来执行此操作。

    SET XACT_ABORT ON
    

    注意

    如果提供程序支持嵌套事务,则不需要此选项。

  3. 检查任何服务器是否位于 Windows Server 故障转移群集上。 群集上的 MSDTC 服务必须有自己的 IP 地址。 确保在每个服务器上发生 DTC 服务的正确名称解析。 必须在名称解析系统中定义 DTC 的 IP 地址(例如 WINS、DNS 或 LMHosts)。 验证每个服务器是否可以按名称与其他服务器上的 MSDTC 通信,而不仅仅是 IP 地址。 检查两个方向。 例如,从服务器 A 检查到服务器 B 的 MSDTC 服务,然后从服务器 B 检查到服务器 A 的 MSDTC。 在运行分布式查询之前,必须解决网络上的所有名称解析问题。 若要在群集上配置 MSDTC,请参阅 SQL 故障转移群集上的 MSDTC 建议 - Microsoft 社区中心

  4. 如果使用较旧的远程服务器技术而不是建议的链接服务器,请将 远程进程跨 配置选项设置为 OFF 服务器,或在运行任何分布式查询之前运行 SET REMOTE_PROC_TRANSACTIONS OFF 语句。 如果此设置设置为 ON,则远程过程调用是在本地事务中进行的。 有关详细信息,请参阅 配置远程过程 trans (服务器配置选项) - SQL Server

  5. 检查两台服务器上的系统函数 @@SERVERNAME 的返回值。 验证返回值是否与每台服务器的计算机名称匹配。 如果不匹配,请重命名服务器。

  6. 验证 SQL Server 启动帐户是否对以下注册表项具有完全控制权限:

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

后续步骤