web-dev-qa-db-ja.com

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

リンクサーバーに対して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サーバーを相互に通信させるにはどうすればよいですか?

関連する質問


私がhaveしたことは無関係ですが、とにかくそれを投稿します。

  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. SELECTlinkedサーバーを使用できることを確認しました

       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 to

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
    

    両方のサーバーで。

89
Ian Boyd

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

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

イベントの種類:エラー
イベントソース:MSDTC
イベントカテゴリ:CM
イベントID:4101
日付:2011年9月19日
時間:午後1:32:59
ユーザー: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サービスを停止して再起動すると修正されました。

31
Ian Boyd

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

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

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

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

enter image description here

2
Steve Bauman

サーバーがクラスター化されており、クラスター化された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が上で非常にうまく文書化しています。両方のサーバーで使用するTCPポートの範囲(5000-5200)でMSDTCをセットアップし、ポート1433と5000-5200のボックス間のファイアウォールホールを配置しました。うまくいったはずです。リンクサーバーは正常にテストされ、リンクサーバー経由でリモートSQLサーバーに適切にクエリできましたが、分散トランザクションを許可することができませんでした。 DEVサーバーからQAサーバー上の接続を見ることさえできましたが、何かが戻ってこなかったのです。

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

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

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

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

0
Marck