リンクサーバーに対して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サーバーを相互に通信させるにはどうすればよいですか?
(null)
)私がhaveしたことは無関係ですが、とにかくそれを投稿します。
Distributed Transaction Coordinator
サービスが両方のマシンで実行されていることを確認します。
両方のマシンですべてのMSDTCセキュリティを無効にします。
リンクサーバーでランダムオプションを有効にします。
呪われ、誓った。
物を壊した。
SELECT
がlinkedサーバーを使用できることを確認しました:
SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
....
(763 row(s) affected)
クライアントサーバーが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
リモートサーバーが名前で開始サーバーに通信できることを確認しました。
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
@@SERVERNAME
が両方のサーバーのサーバー名と一致することを確認 :
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
------------- -------------
ASITESTSERVER ASITESTSERVER
そして
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
---------- ----------
ASIGROBTEST ASIGROBTEST
叫んだ
クエリを発行する前にSET XACT_ABORT ON
を発行した :
SET XACT_ABORT ON
GO
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions
付与されたEveryone
Full Control
to :
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
両方のサーバーで。
それが見つかりました、リモートサーバー上の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サービスを停止して再起動すると修正されました。
OK、サービスが開始され、それらの間にイーサネットパスがあり、名前解決が機能し、リンクサーバーが機能し、トランザクション認証を無効にしました。
私の腸はファイアウォールの問題を言っていますが、いくつかのことが思い浮かびます...
サーバーがクラスター化されており、クラスター化されたDTCがある場合、ローカルDTCではなくクラスター化されたDTCのセキュリティを無効にする必要があります。
宛先サーバーが別のクラウドまたはデータセンターにある場合、ソースサーバーにMSDTCサービス(宛先サーバー)のホストエントリを追加する必要があります。
MSDTC設定を有効にした後、問題が解決しない場合は、これを試してください。
セキュリティ設定とは別に、トランザクションを実行するには両方のサーバーでいくつかのポートを開く必要がありました。ポート59640を開く必要がありましたが、次の提案に従って、ポート135を開く必要があります。 http://support.Microsoft.com/kb/839279
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」が機能すると、この問題は解決されました。
これがお役に立てば幸いです!