web-dev-qa-db-ja.com

OLEリンクサーバーのDBプロバイダー "SQLNCLI11"が分散トランザクションを開始できなかったため、操作を実行できませんでした

マシン(SQL Server 2012)からクライアントサーバー(SQL Server 2008)への分散トランザクションを実行しようとしています。

私は実行しようとしています:

begin distributed transaction
select * from [172.01.01.01].master.dbo.sysprocesses
Commit Transaction

そして私は得る:

OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 2
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "172.01.01.01" was unable to begin a distributed transaction.

そのサーバーに対してSELECTを実行して、データが戻ってくるので、少なくともサーバーがお互いを見ることができ、リンクサーバーが存在し、動作していることがわかります。

現在、このためのウェブ上の複数の投稿がありますが、私はそれを動作させることができません。これは私がこれまでに試したことです。1. DTCプロパティを次のように設定します(両方のサーバーで) enter image description here

  1. [コントロールパネル]-> [サービス](両方のサーバー)から分散トランザクションコーディネーター(MSDTC)を再起動しました。

  2. アンインストールおよびインストールされたDTC(両方のサーバー上)。

  3. リモートサーバーを再起動しました。

  4. 両方のサーバーでファイアウォールをオフにしました。

  5. Sp_configure 'Ad Hoc Distributed Queries'、1(両方のサーバーで)を有効にしました。

  6. DTCPingを実行しましたが、pingは成功しました。

  7. リンクサーバーのプロパティは次のように変更されました。 enter image description here

他に何が試せますか?

更新:別のサーバーから172.01.01.01へのトランザクションの実行は機能します。したがって、問題は宛先サーバーではなく、ソースであるマシンにあります。

10

OPの元の投稿に従って2つのSQLサーバーでMS分散トランザクションコーディネーター(MSDTC)を構成した後、「トランザクションがアクティブでない」というメッセージが表示される場合、各ホストがIP経由で到達可能であることを確認する必要があります使用)リンクサーバーに登録。

例えば;最近のセットアップでは、2つのSQLサーバーが192.168.200.xの範囲(同じサブネット)のネットワークを介して到達可能でしたが、各サーバーは10.x.x.xの範囲のIPを介して間接的に接続されました。あるSQL Serverでは、リンクサーバーエントリがターゲットサーバーの192.168.200.xのIPを使用していても、使用するDNSサーバーはターゲットSQLサーバーを10.x.x.x IP(ファイアウォールで保護された)に解決し続けました。

MSDTCはサーバーのホスト名を使用するように見えますが、SQLサーバーはリンクサーバーエントリで定義されたIPまたはホスト名を使用してリンク接続を介して接続するため、SQL Management Studio内のターゲットリンクサーバーを確認する際に、この紛らわしい接続の動作につながります。ただし、ターゲットでリモートプロシージャを実行することはできません。

解決策は、ホストファイル(%windir%\ system32\drivers\etc\hosts)にエントリを追加して、各SQLサーバーが192.168.200.xネットワーク上のIPアドレスに解決するように明示的に強制することでした。

ホスト1(IP 192.168.200.15):

# TARGET SERVER
192.168.200.20    targetserverhostname.and.any.domain.suffix  targetserverhostname

ホスト2(IP 192.168.200.2

# SOURCE SERVER
192.168.200.15    sourceserverhostname.and.any.domain.suffix sourceserverhostname

上記のOPのスクリーンショットに従ってMSDTCがネットワークアクセスと(必要な場合)認証なしを許可するように構成されていることを忘れないでください。

4
Yumbelie

同様の問題に直面し、次のように解決しました。 SQL Serverのオブジェクトエクスプローラーのツリー構造にノードがあります。そこには、Serverobjects→LinkedServers→その下に、分散サーバーのIPアドレスのリストがあります。

それを右クリックしてプロパティを選択すると、ウィンドウがポップアップします。左ペインでサーバーオプションを選択します。プロパティのリストを取得します。フラグ値falseをプロパティ「分散トランザクションのプロモーションを有効にする」に設定します。

10
Srinu

「リンクされたサーバーのプロパティウィンドウで」「分散トランザクションのプロモーションを有効にする」フラグをfalseに設定すると、同様の問題が解決しました。

8
A.K.

同様の問題がありました。リストされたすべてのものが役に立たなかった。クラスター環境があり、メインサーバーではなくクラスターでサービスをDBAが実行していたことがわかりました。他のすべてが失敗した場合、それを念頭に置いておく価値があります:-)

0

分散トランザクションの開始時にこのSQLを試してください

set XACT_ABORT on
0
AZ Chad