MSSQLSERVER_7391

適用対象:SQL Server

属性
製品 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 場合もエラー メッセージが表示されることがあります。

ユーザー アクション

注意

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

サポート

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

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

サーバー通信

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

  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
    

    注意

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

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

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

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

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

次のステップ