次の方法で共有


MSSQLSERVER_7391

適用対象: SQL サーバー

属性 Value
Product SQL Server
イベント ID 7391
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 RMT_TRANS_JOIN_FAIL
メッセージ テキスト リンク サーバー "%ls" の OLE DB プロバイダー "%ls" で分散トランザクションを開始できなかったので、この操作を実行できませんでした。

説明

このエラーは、Microsoft 分散トランザクション コーディネーター (MSDTC) サービスが実行されていないか、ネットワーク アクセスが無効になっているために発生します。

場合によっては、エラー 8522 が発生する場合もあります。

Microsoft Distributed Transaction Coordinator (MS DTC) has stopped this transaction.

7300 ~ 7399 の範囲のエラー番号は、プロバイダーに影響する問題を示します。 各プロバイダーには異なる機能があり、異なる詳細が表示される場合があるため、完全なエラー メッセージが表示されない場合があります。 プロバイダーから完全なエラー メッセージを取得するには、エラーを生成するクエリを実行する前に、次のコマンドを実行します。

DBCC TRACEON (3604, 7300)

SQL Server レプリケーションや SQL Server Integration Services (SSIS) などのプロセスからエラー 7391 が発生した場合は、コードに BEGIN DISTRIBUTED TRAN ステートメントが含まれている場合にもエラー メッセージが表示されることがあります。

ユーザー アクション

Note

リモート サーバーのみに対して行われる分散クエリを含むトランザクション内のコードを制限することをお勧めします。

サポート可能性

  • ドライバーが分散トランザクションをサポートしているかどうかを確認するには、リンク サーバー クエリで使用するドライバーのベンダーに問い合わせてください。

  • 移行先サーバー上のオブジェクトが最初のサーバーを指しているかどうかを確認します。 これはループバック状況と呼ばれます。 ループバック リンク サーバー はテストを目的としており、分散トランザクションなどの多くの操作ではサポートされていません。

サーバー通信

サーバー間の通信が正常に行われるようにするには、次の手順に従います。

  1. ネットワーク名解決が機能するかどうかを確認します。 サーバーが IP アドレスだけでなく、名前によって相互に通信できることを確認します。 双方向 (サーバー A からサーバー B、サーバー B からサーバー A など) を確認します。 分散クエリを実行する前に、ネットワーク上のすべての名前解決の問題を解決します。 これには、WINS、DNS、または LMHost ファイルの更新が含まれる場合があります。

  2. ファイアウォールがある場合は、リモート プロシージャ コール (RPC) ポートが正しく開いていることを確認します。 詳細については、次の記事をご覧ください。

  3. 移行先サーバーでポイントするオブジェクトを確認します。 オブジェクトがビューまたはストアド プロシージャの場合、またはトリガーが実行される場合は、別のサーバーを暗黙的に指しているかどうかを確認します。 その場合は、3 番目のサーバーが問題の原因になります。 3 番目のサーバーでクエリを直接実行します。 これを行えない場合は、リンク サーバー クエリは問題ありません。 最初に、基になる問題を解決します。

  4. リモート アクセス サーバー (RAS) を使用してリモート サーバーにアクセスしているかどうかを確認します。 その場合は、ルーティング RAS (RRAS) が実装されていることを確認します。 RAS では一方向の通信のみが許可されるため、リンク サーバーは RAS では機能しません。

サーバー構成

サーバーを構成するには、次の手順に従います。

  1. 分散トランザクションに関係するすべてのサーバーで分散トランザクション コーディネーター (DTC または MS DTC) を開始します。 ネットワーク DTC アクセスを有効にする方法の詳細については、「OLE DB プロバイダーの エラー メッセージ - SQL Serverを参照してください。

  2. SQL Server を含むほとんどの OLE DB プロバイダーに対する暗黙的または明示的なトランザクションのデータ変更ステートメントに対して、 XACT_ABORT オプションを ON に設定します。 これを行うには、クエリを実行する前に次のコマンドを実行します。

    SET XACT_ABORT ON
    

    Note

    プロバイダーが入れ子になったトランザクションをサポートしている場合、このオプションは必要ありません。

  3. いずれかのサーバーが Windows Server フェールオーバー クラスター上にあるかどうかを確認します。 クラスター上の MSDTC サービスには、独自の IP アドレスが必要です。 DTC サービスの正しい名前解決が各サーバーで行われることを確認します。 DTC の IP アドレスは、名前解決システム (WINS、DNS、LMHosts など) で定義する必要があります。 各サーバーが、IP アドレスだけでなく、名前によって他のサーバー上の MSDTC と通信できることを確認します。 双方向で確認します。 たとえば、サーバー A からサーバー B の MSDTC サービスを確認し、サーバー B からサーバー A の MSDTC に確認します。 分散クエリを実行する前に、ネットワーク上のすべての名前解決の問題を解決する必要があります。 クラスターで MSDTC を構成するには、「SQL フェールオーバー クラスターの MSDTC に関する推奨事項 Microsoft Community Hubを参照してください。

  4. 推奨されるリンク サーバーではなく、古いリモート サーバー テクノロジを使用している場合は、サーバーのOFFremote proc trans 構成オプションを設定するか、分散クエリを実行する前にSET REMOTE_PROC_TRANSACTIONS OFFステートメントを実行します。 この設定が ON に設定されている場合、リモート プロシージャ呼び出しはローカル トランザクションで行われます。 詳細については、「 リモート プロセストランスの構成 (サーバー構成オプション) - SQL Server」を参照してください。

  5. 両方のサーバーで @@SERVERNAME システム関数の戻り値を確認します。 戻り値が各サーバーのコンピューター名と一致するかどうかを確認します。 一致しない場合は、サーバーの名前を変更します。

  6. SQL Server スタートアップ アカウントに、次のレジストリ キーに対するフル コントロールアクセス許可があることを確認します。

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

次のステップ