103

我正在尝试对链接服务器运行 SQL,但出现以下错误:

BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions


OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".

Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.

提供程序返回两个错误:

错误 #1:

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile: 
HelpContext: $00000000
SQLState: 01000
NativeError: 7412

错误 #2

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile: 
HelpContext: $00000000
SQLState: 42000
NativeError: 7391

如何让 Microsoft 偏爱功能而不是安全?

或者,至少,我怎样才能让两个 SQL 服务器相互通信?

相关问题


所做的无关紧要,但无论如何我都会发布它。

  1. 确保Distributed Transaction Coordinator服务在两台机器上运行:

    在此处输入图像描述

    在此处输入图像描述

  2. 禁用两台机器上的所有 MSDTC 安全性:

    在此处输入图像描述

    在此处输入图像描述

  3. 在链接服务器上打开随机选项:

在此处输入图像描述

  1. 诅咒和发誓。

  2. 砸东西。

  3. 检查是否SELECT可以使用链接服务器

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
    
  4. 检查客户端服务器是否可以ping远程服务器

         C:\Documents and Settings\avatar>ping asicmstest.contoso.com
    
         Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data:
    
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.40:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
    
  5. 检查远程服务器是否可以按名称与启动服务器通信:

         C:\Documents and Settings\avatar>ping asitestserver.contoso.com
    
         Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data:
    
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.22:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
    
  6. 检查是否@@SERVERNAME与两台服务器上的服务器名称匹配

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       -------------  -------------
       ASITESTSERVER  ASITESTSERVER
    

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
    
  7. 尖叫

  8. 在发出SET XACT_ABORT ON我的查询之前发出

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
    
  9. 授予Everyone Full Control_

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

    在两台服务器上。

4

10 回答 10

33

找到了,远程服务器上的MSDTC是本地服务器的克隆。

从 Windows 应用程序事件日志:

事件类型:错误
事件源:MSDTC
事件类别:CM
事件 ID:4101
日期: 2011 年 9 月 19 日
时间:下午 1:32:59
用户:N/A
计算机:ASITESTSERVER
描述:

本地 MS DTC 检测到 ASICMSTEST 上的 MS DTC 与本地 MS DTC 具有相同的唯一标识。这意味着两个 MS DTC 将无法相互通信。如果使用不受支持的克隆工具克隆了其中一个系统,则通常会出现此问题。MS DTC 要求使用支持的克隆工具(例如 SYSPREP)克隆系统。从命令提示符运行“msdtc -uninstall”,然后运行“msdtc -install”将解决问题。注意:运行“msdtc -uninstall”将导致系统丢失所有 MS DTC 配置信息。

有关详细信息,请参阅http://go.microsoft.com/fwlink/events.asp上的帮助和支持中心 。

跑步

msdtc -uninstall
msdtc -install

然后停止并重新启动 SQL Server 服务修复它。

于 2011-09-19T18:47:55.587 回答
18

我能够通过禁用“为 RPC 启用分布式事务的提升”(即设置为)来解决这个问题(正如评论中提到的其他人False):

在此处输入图像描述

根据@WonderWorker 的要求,您可以通过 SQL 脚本执行此操作:

EXEC master.dbo.sp_serveroption
     @server = N'[mylinkedserver]',
     @optname = N'remote proc transaction promotion',
     @optvalue = N'false'
于 2019-07-29T21:11:33.017 回答
7

好的,所以服务已启动,它们之间有一条以太网路径,名称解析工作,链接服务器工作,并且您禁用了事务身份验证。

我的直觉说防火墙问题,但我想到了一些事情......

  1. 机器是否在同一个域中?(是的,与禁用身份验证无关)
  2. 机器上是否运行防火墙?DTC 对防火墙来说可能有点痛苦,因为它使用了一系列端口,请参阅http://support.microsoft.com/kb/306843 目前,我会禁用防火墙以识别问题
  3. DTC ping 说明了什么? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. SQL 服务以什么帐户运行?
于 2011-09-19T18:30:11.797 回答
2

如果服务器是集群的并且存在集群 DTC,则您必须禁用集群 DTC 而不是本地 DTC 上的安全性。

于 2014-10-09T19:15:43.833 回答
2

对我来说,它与防火墙设置有关。转到您的防火墙设置,允许 DTC 服务,它工作。在此处输入图像描述

于 2020-01-02T09:58:58.150 回答
1

我在 MSDTC 上的最后一次冒险,今天这个错误被证明是 DNS 问题。你在正确的轨道上询问机器是否在同一个域上,EBarr。顺便说一句,这个问题的好清单!

我的情况:我需要子域中的服务器能够通过防火墙对父域中的服务器运行分布式事务。这些年来,我已经使用了很多链接服务器,所以我在 SQL 中为链接服务器和 MSDTC 中的所有常用设置提供了 Ian 在上面很好地记录的所有设置。我为 MSDTC 设置了一系列 TCP 端口 (5000-5200) 以在两台服务器上使用,并在端口 1433 和 5000-5200 的框之间设置了防火墙孔。那应该行得通。链接服务器测试正常,我可以很好地通过链接服务器查询远程 SQL 服务器,但我无法让它允许分布式事务。我什至可以从 DEV 服务器上看到 QA 服务器上的连接,但有些东西没有返回。

我可以使用 FQDN 从 QA 对 DEV 服务器进行 PING,例如:PING DEVSQL.dev.domain.com

我不能只用机器名 PING DEV 服务器:PING DEVSQL

DEVSQL 服务器应该是两个域的成员,但该名称未在父域的 DNS 中解析……父域中 DEVSQL 的计算机帐户发生了问题。一旦我们将 DEVSQL 添加到父域的 DNS,并且“PING DEVSQL”从远程 QA 服务器工作,这个问题就为我们解决了。

我希望这有帮助!

于 2013-10-15T08:35:38.000 回答
1

如果您的目标服务器位于另一个云或数据中心,则需要在源服务器中添加MSDTC 服务(目标服务器)的主机条目。

如果问题没有解决,请尝试这个,启用 MSDTC 设置后。

于 2017-04-01T10:26:30.463 回答
0

除了安全设置之外,我还必须在两台服务器上打开一些端口才能运行事务。我必须打开端口 59640 但根据以下建议,端口 135 必须打开。 http://support.microsoft.com/kb/839279

于 2015-03-10T15:48:28.470 回答
0

允许 DTC 勾选私有和公共以及域的防火墙设置起到了作用。仅域是不够的(感觉应该是,但不)。

于 2021-08-11T17:21:41.583 回答
0

我遇到了同样的错误,我设法通过在源服务器上正确配置 MSDTC 以允许出站并允许 DTC 通过 Windows 防火墙来解决它。

允许分布式事务协调器、勾选域、私有和公共选项

于 2019-10-18T12:45:49.283 回答