web-dev-qa-db-ja.com

エラー26のトラブルシューティング方法:「指定されたサーバー/インスタンスの検索エラー」

TCP SQL2012という名前のインスタンス(SQL2012という名前)へのアクセスを構成しようとしています。ManagementStudioを使用してデータベースエンジンに接続しています。サーバー名を入力します: "tcp:localhost\SQL2012」と私はこのエラーメッセージを受け取ります:

(プロバイダー:SQLネットワークインターフェイス、エラー:26-指定されたサーバー/インスタンスの検索エラー)

この投稿 SQL Serverチームは、PortQryを使用してSqlBrowserサービスをテストすることを推奨しているため、本当に役立つようです。私がそうするとき、私はこの情報を得ます:

Querying target system called:

 localhost

Attempting to resolve name to IP address...


Name resolved to 127.0.0.1

querying...

UDP port 1434 (ms-sql-m service): LISTENING or FILTERED

Sending SQL Server query to UDP port 1434...

Server's response:

ServerName MSWART7
InstanceName SQL2012
IsClustered No
Version 11.0.5058.0
tcp 52329

   ♥K   K P☺K 5 - 2 1 qK 1 4  rK 8 7 0☺    1 qK

==== End of SQL Server query response ====

そして確かに、サーバー名「tcp:localhost、52329」を指定すると、データベースに接続できます。

何が欠けているのかわかりません。 SQLブラウザーが機能しているようで、ポートとファイアウォールが開いているか無関係であるようです(私はlocalhostに接続しようとしています)。

次にどこを見ればいいですか?

6
Michael J Swart

ローカルインスタンスに接続しようとすると、SQL Serverは常に共有メモリを使用しようとします。この接続は正常に機能します。

localhost\SQL2012

これは私のシナリオで機能し、接続は実際にはこの場合共有メモリを使用しています。

SELECT session_id,net_transport,local_net_address,local_tcp_port
FROM sys.dm_exec_connections;

結果:

session_id  net_transport   local_net_address   local_tcp_port
----------  -------------   -----------------   --------------
53          Shared memory   <local machine>     NULL

共有メモリ(なぜかわからない、ローカルマシン上)をオーバーライドして、代わりにTCP/IPを強制したい場合は、名前付きインスタンスを明示的に指定することと、少なくとも私が試したすべてのインスタンスでそれを混在させることはできません(意図的なしゃれはありません) )。名前付きインスタンスは、SQL Serverブラウザーを使用してSQL Serverにインスタンス名をポート番号にマップするように強制しますが、最初にTCP/IPを強制する場合、これは明らかに実行できません(TCP/IPを使用する全体のポイントはそうです)あなたはポートに直接行き、ブラウザを気にしません)。名前付きインスタンスが独自のIPアドレスで実行されていて、ポート1433に強制されている場合、これを機能させることができる場合があります。クライアントネットワークエイリアスを使用している場合も機能する可能性があります(ただし できませんでした )。

そのインスタンスに割り当てられている現在の動的ポートをConfiguration Managerで検索した場合(私の場合は49538)、次にtcp:localhost,49538を使用して接続すると接続できました。

Object Explorer with two connections, one shared memory and one TCP/IP

だから今:

SELECT session_id,net_transport,local_net_address,local_tcp_port
FROM sys.dm_exec_connections;

結果:

session_id  net_transport   local_net_address   local_tcp_port
----------  -------------   -----------------   --------------
53          Shared memory   <local machine>     NULL
54          TCP             10.211.55.10        49538 

名前付きインスタンスをオーバーライドする共有メモリと組み合わせて代わりにTCP/IPを使用しようとした複数のマシンとバージョンで試したすべてのバリエーションで、同じエラーが発生しました。これは、サーバー/インスタンス名の前にtcp:を付けた場合と、接続プロパティダイアログでネットワークプロトコルにTCP/IPを指定した場合の両方です。

要するに、ローカル接続にTCP/IPを強制する必要がある場合は、そのインスタンスに固定ポートを使用し、ポートを指定する必要があります。または1433を使用します(デフォルトのインスタンスがない場合、またはそのインスタンスに専用IPアドレスがある場合にのみ機能します)。ポートを指定する必要はありませんが、tcp:プレフィックスを指定するか、接続ダイアログのそのオプション。

共有メモリを無効にすることはお勧めしません。 FWIW。

4
Aaron Bertrand