it-swarm.cn

无法开始分布式事务

我正在尝试对链接服务器运行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

我如何让微软支持功能而不是安全性?

或者,至少,我如何让两个SQL Severs相互通信?

相关问题


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

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

    enter image description here

    enter image description here

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

    enter image description here 

    enter image description here

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

enter image description here 

  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. EveryoneFull Control授予

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

    在两台服务器上。

87
Ian Boyd

发现它,远程服务器上的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服务修复它。

28
Ian Boyd

好的,所以服务启动,它们之间有一个以太网路径,名称解析工作,链接服务器工作,你禁用了事务验证。

我的直觉说防火墙问题,但有些事情会浮现在脑海中......

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

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

2
David Wolfinger

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

如果问题未解决,请尝试此操作,启用MSDTC设置后。

1
JERRY

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

0
Trepach

我与MSDTC的最后一次冒险和今天的错误结果证明是一个DNS问题。你是在正确的轨道询问机器是否在同一个域,EBarr。顺便说一句,这个问题很棒!

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

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

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

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

我希望这有帮助!

0
Marck