none
SQL Server インスタンスへの接続に時間がかかる RRS feed

  • 質問

  • お世話になります。

    【構成】
    SERVER1.example.local : Windows Server 2008 R2 / SQL Server 2008 R2
    CLIENT1.example.local : Windows 7 SP1

    SQL Server インスタンス:
    SERVER1\Instance1 (32bitモード)
    SERVER1\Instance2 (64bitモード)← 今回,新規で導入作業をしており,問題となっています。

    【症状】
    CLIENT1 から SERVER1\Instance2 に接続するのに42秒程度の時間が常時にかかり原因がつかめずにいます。

    たとえば,CLIENT1上のSQL Server Management Studioを起動して「サーバへの接続」ダイアログで「接続ボタン」を押してから,このダイアログが消えるまで42秒かかります。
    Microsoft Query 等でも,「データソースに接続しています...」の状態で42秒かかります。

    ・この42秒間,CLIENT1 の netstat は SYN_SENTな状態です。

    ・クライアント側で接続操作をしてから,42秒後にSQL Server Profilerに「Audit Login」が記録されるまで,SQl Server Profilerには何も記録されません。

    ・接続を張った後のパフォーマンスは極めて良好でクエリの結果等はミリ秒単位で返ってきます。

    ・全てのクライアントマシン/アプリケーションで同じ症状が出ています。ただし SERVER1上のクライアントツールからInstance2へローカル接続する場合は,数ミリ秒で接続します。

    ・SERVER1\Instance2だけの症状で,SERVER1\Instance1には すべてのクライアントから瞬間的に接続できます。

    ・Windows認証/SQL Server認証を問わず,両方で42秒待たされます。

    ・SQL Server 構成マネージャでInstance1とInstance2の違いを見比べましたが相違は見受けられません。


    お手上げな状態ですので「ここを確認しろ」とのポインタだけでも結構ですので,ご教示いただけませんでしょうか。
    何卒よろしくお願いいたします。

     

    2012年8月13日 1:42

回答

  • 症状からして、SQL Server Browser による名前解決に時間がかかっているっぽいですね。(Server1 上からなら素早くつながることからも、それっぽいです)

    試しに、Instance2 に対して名前ではなくポート番号やパイプ名等を明記して接続してみてはどうでしょう?

    • 回答としてマーク Sedvicious 2012年8月13日 7:30
    2012年8月13日 3:01
  • TCP/IPでのポート指定は、カンマ+ポート番号であっています。

    Browser による名前解決が遅いことが確定したので、UDP の通信まわりがあやしいかもしれませんが、ネットワークの問題かブラウザの問題か確認するのが難しいかもしれませんね。

    SQL Browser のログをとるには、サービスとして動いている SQL Browser を停止して、コマンドラインから sqlbrowser -C です。

    • 回答としてマーク Sedvicious 2012年8月13日 7:30
    2012年8月13日 4:42
  • TCP/IP で接続できないのは、Windows Firewall の例外設定が漏れているとかないですか? (x86 側だけ登録されているとか)

    SQL Browser はレジストリに格納された SQL Server のインスタンス一覧を元に名前解決をすると思いますが、x86 と x64 では参照されるレジストリが異なります。もしかすると、このあたりに問題があるかもしれませんね。

    • 回答としてマーク Sedvicious 2012年8月13日 7:30
    2012年8月13日 6:13

すべての返信

  • 症状からして、SQL Server Browser による名前解決に時間がかかっているっぽいですね。(Server1 上からなら素早くつながることからも、それっぽいです)

    試しに、Instance2 に対して名前ではなくポート番号やパイプ名等を明記して接続してみてはどうでしょう?

    • 回答としてマーク Sedvicious 2012年8月13日 7:30
    2012年8月13日 3:01
  • K.Takaokaさま,大変貴重なご助言ありがとうございます。
    初めてながら「パイプ名を明記して接続」の方法を調べて試してみたところ,良好でした。

    C:\> sqlcmd /E /SSERVER1\INSTANCE2

     → (NG) 20秒かかる。

    C:\>sqlcmd /E /S\\SERVER1\pipe\MSSQL%INSTANCE2\sql\query

     →(OK) 瞬時に接続。

    # ポート番号のやり方は判りませんでした。動的ポート番号を56789と仮定して;
    # C:\>sqlcmd /E /SSERVER1,56789
    # C:\>sqlcmd /E /Stcp:192.168.1.1,56789 などというのは誤解してますでしょうか。


    恥ずかしながらSQL Browserサービスの仕組みと役割をよく判っていなかった(サーバ一覧の参照をするためだけのものだと思っていた)ので,ご推察のようにインスタンスの名前解決に時間がかかっている要因と対応策を,もう少し調べてみます。
    ご助言ありがとうございす。

    2012年8月13日 4:31
  • TCP/IPでのポート指定は、カンマ+ポート番号であっています。

    Browser による名前解決が遅いことが確定したので、UDP の通信まわりがあやしいかもしれませんが、ネットワークの問題かブラウザの問題か確認するのが難しいかもしれませんね。

    SQL Browser のログをとるには、サービスとして動いている SQL Browser を停止して、コマンドラインから sqlbrowser -C です。

    • 回答としてマーク Sedvicious 2012年8月13日 7:30
    2012年8月13日 4:42
  • K.Takaokaさま,引き続きご助言いただきありがとうございます。sqlbrowser -C も存じ上げなかったので勉強になりました。
    それ以降,試行錯誤で悪戦苦闘しているのですが…どうも SQL Browserでは無いような雰囲気もしています。

    sqlborwser -C を試行してみたところ,

    C:\>sqlcmd /E /S\\SERVER1\pipe\MSSQL%INSTANCE2\sql\query
      ↓ (正常)瞬間後にsqlbrowserの反応
    CLNT_UCAST_INST w/refresh from 192.168.1.***[56789]
    CLNT_UCAST_INST from 192.168.1.***[56789]
    [5356]: Waiting for next request...
      ↓ (異常)20秒遅延して
    SQL Server Profilerに「Audit Login」

    という状況です。
    --------------------------------------------
    正常なInstance1(動的ポート番号:55555)と,問題のInstance2(動的ポート番号:56789)にTCP接続を試行したところ;

    sqlcmd -l100 -E /Stcp:192.168.1.1:55555
     →(OK)一瞬後に接続

    sqlcmd -l100 -E /Stcp:192.168.1.4:54774
     →(NG) HResult 0x274C、レベル16、状態 1
          TCP Provider: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。

    と,後者だけTCP/IP接続にも問題があることが判明しました。

    整理するとInstance2について,
    ・サーバ名/インスタンス名での接続 → × 20秒遅延して接続。
    ・パイプ名で接続 → ◎瞬間的に接続。
    ・IPアドレス+ポート番号で接続 → ×タイムアウトを長めにとっても接続不能。

    なお,構成マネージャでは正常なInstance1・問題あるInstance2ともに
    共有メモリ[有効] 名前付きパイプ[有効] TCP/IP[有効] VIA[無効] で,各プロパティに特に異なる点などはありません。

    --------------------------------------------
    詳細を書き漏れていたのですが,Server1には
    Instance1 : Express Edition 10.3.5500,0 c:\Program Files (x86)\Microsoft SQL Server\MSSQL10.INSTANCE1\MSSQL
    が従前よりインストールされており,

    Instance2 : Workgroup Edition 10.3.5500,0  c:\Program Files\Microsoft SQL Server\MSSQL10.INSTANCE2\MSSQL
    を今回導入しようとしています。

    SQL Server Browser のパスは C:\Program Files (x86)\Microsoft SQL Server\90\Shared\sqlbrowser.exe です。

    念のためブラウザサービスのアンインストール → Workgroup Edition の共有ファイル修復インストールをしてみたのですが,芳しくありません。

    • 回答としてマーク Sedvicious 2012年8月13日 7:30
    • 回答としてマークされていない Sedvicious 2012年8月13日 7:30
    2012年8月13日 5:50
  • TCP/IP で接続できないのは、Windows Firewall の例外設定が漏れているとかないですか? (x86 側だけ登録されているとか)

    SQL Browser はレジストリに格納された SQL Server のインスタンス一覧を元に名前解決をすると思いますが、x86 と x64 では参照されるレジストリが異なります。もしかすると、このあたりに問題があるかもしれませんね。

    • 回答としてマーク Sedvicious 2012年8月13日 7:30
    2012年8月13日 6:13
  • T.Takaokaさま,できました!問題解決しました!

    > TCP/IP で接続できないのは、Windows Firewall の例外設定が漏れているとかないですか? (x86 側だけ登録されているとか)

    これがビンゴでした。
    接続が遅いだけで,接続後は問題なくクエリが出来ていたのでFirewallはハナから疑っていませんでした。
    c:\Program Files\Microsoft SQL Server\MSSQL10.INSTANCE2\MSSQLC\Binn\sqlservr.exe に対して,TCP/*の受信を許可したところ,名前付きインスタンスの接続も含めて,大変良好に接続できるようになりました。

    丸2日ほど悩んだことが,お陰さまで問題解決できました。
    判りにくい&長々としたご説明にも関わらず,根気よく可能性を示して頂き,有用かつ適切なご助言を頂いたことに心より感謝申し上げます。

    本当にありがとうございました。

    2012年8月13日 7:30