分散トランザクションを開始できません


95

リンクサーバーに対して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.

プロバイダーから2つのエラーが返されます。

エラー#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

マイクロソフトにセキュリティよりも機能を優先させるにはどうすればよいですか?

または、少なくとも、2つの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

    両方のサーバーで。


30
重要な「呪われた」のステップをスキップしなかったことを確認してください。
jwl 2013年

11
@joelarsonねえ、時々人々はあなたがすべてのステップを踏むことに非常に特別です。私は何かをしようとしなかったと誰にも言われたくなかった。
Ian Boyd

5
この投稿が大好きです。これは、MSDTCでこれまでに経験したすべての典型です。
A.マレー

5
私の場合、リンクサーバーで[RPCの分散トランザクションのプロモーションを有効にする]をFalseに設定すると、機能します。多分それを試してください
サルサパリリャ2017年

3
@HaiPhan分散トランザクションの使用をオフにすると、国境を越えた整合性が失われます。ローカルサーバーで変更をロールバックすると、リモートサーバーの変更がそのまま残ります。とても危ない。
Ian Boyd 2017年

回答:


31

それを見つけた、リモートサーバー上のMSDTCはローカルサーバーのクローンでした。

Windowsアプリケーションイベントログから:

イベントの種類:エラー
イベントソース:MSDTC
イベントカテゴリ:CM
イベントID:4101
日付:9/19/2011
時間:1:32:59 PM
ユーザー:N / A
コンピューター:ASITESTSERVER
説明:

ローカルMS DTCは、ASICMSTESTのMS DTCがローカルMS DTCと同じ一意のIDを持っていることを検出しました。これは、2つのMS DTCが互いに通信できないことを意味します。この問題は通常、サポートされていない複製ツールを使用してシステムの1つが複製された場合に発生します。MS DTCでは、SYSPREPなどのサポートされている複製ツールを使用してシステムを複製する必要があります。コマンドプロンプトから「msdtc -uninstall」を実行してから「msdtc -install」を実行すると、問題が解決します。注: 'msdtc -uninstall'を実行すると、システムですべてのMS DTC構成情報が失われます。

詳細については、ヘルプとサポートセンター(http://go.microsoft.com/fwlink/events.asp)を参照して ください

ランニング

msdtc -uninstall
msdtc -install

SQL Serverサービスを停止して再起動すると修正されました。


2
それが正しいかどうか確認してみましょう。私は両方のマシン(メインサーバーとリンクサーバー)でこれをすべて実行しました。
Hamid Sadeghian 2013年

9

「他の人がコメントで述べたように、「RPCの分散トランザクションのプロモーションを有効にする」を無効にする(つまり、に設定するFalse)ことで、この問題を解決できました。

ここに画像の説明を入力してください


1
これでうまくいきました。奇妙なのは、何週間も晴れていて、突然始まったということです。リモートサーバーのDTCサービスが無効になっている可能性があります。とにかくありがとうございました。
Boyd P

6

OK、サービスが開始され、サービス間にイーサネットパスがあり、名前解決が機能し、リンクサーバーが機能し、トランザクション認証を無効にしました。

私の直感はファイアウォールの問題を言っていますが、いくつかのことが頭に浮かびます...

  1. マシンは同じドメインにありますか?(ええ、認証が無効になっていても問題ありません)
  2. ファイアウォールはマシンで実行されていますか?ファイアウォールはポートの範囲を使用するため、DTCは少し面倒な場合があります。http://support.microsoft.com/kb/306843を参照してください 。当面は、問題を特定するためにファイアウォールを無効にします。
  3. DTC pingは何と言っていますか? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. SQLサービスはどのアカウントで実行されていますか?

2

サーバーがクラスター化されており、クラスター化されたDTCがある場合は、ローカルDTCではなくクラスター化されたDTCのセキュリティを無効にする必要があります。


1

移行先サーバーが別のクラウドまたはデータセンターにある場合、移行元サーバーにMSDTCサービス(移行先サーバー)のホストエントリを追加する必要があります。

MSDTC設定を有効にした後、問題が解決しない場合は、これを試してください。


1

私にとっては、ファイアウォールの設定に関係しています。ファイアウォールの設定に移動し、DTCサービスを許可してください。ここに画像の説明を入力してください


0

MSDTCでの最後の冒険とこのエラーは本日、DNSの問題であることが判明しました。マシンが同じドメイン、EBarrにあるかどうかを尋ねるあなたは正しい軌道に乗っています。ちなみに、この問題の素晴らしいリストです!

私の状況:ファイアウォールを介して親ドメインのサーバーに対して分散トランザクションを実行できるようにするには、子ドメインのサーバーが必要でした。私は何年にもわたってリンクサーバーをかなり使用してきたため、リンクサーバーのSQLとMSDTCの通常の設定はすべて、Ianが上でとても上手にドキュメント化していました。両方のサーバーで使用するTCPポートの範囲(5000〜5200)でMSDTCを設定し、ポート1433と5000〜5200のボックス間にファイアウォールホールを配置しました。それでうまくいくはずです。リンクサーバーは正常にテストされ、リンクサーバー経由でリモートSQLサーバーに適切にクエリを実行できましたが、分散トランザクションを許可することができませんでした。QAサーバーでDEVサーバーからの接続を確認することもできましたが、何か問題が発生していませんでした。

次のようなFQDNを使用して、QAからDEVサーバーにPINGできます:PING DEVSQL.dev.domain.com

マシン名だけでDEVサーバーにPINGできませんでした:PING DEVSQL

DEVSQLサーバーは両方のドメインのメンバーであるはずでしたが、名前が親ドメインのDNSで解決されていませんでした...親ドメインのDEVSQLのマシンアカウントで何かが発生しました。親ドメインのDNSにDEVSQLを追加し、リモートQAサーバーから「PING DEVSQL」が機能するようになると、この問題は解決されました。

これが役に立てば幸いです!


0

セキュリティ設定とは別に、トランザクションを実行するには、両方のサーバーでいくつかのポートを開く必要がありました。ポート59640を開く必要がありましたが、次の提案に従って、ポート135を開く必要があります。 http://support.microsoft.com/kb/839279


0

同じエラーが発生しましたが、送信元サーバーでMSDTCを適切に構成して送信を許可し、DTCがWindowsファイアウォールを通過できるようにすることで解決できました。

分散トランザクションコーディネーター、ティックドメイン、プライベートおよびパブリックオプションを許可する

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.