none
SQL Serverのプロトコル(TCP/IPと名前付きパイプ)について RRS feed

  • 質問

  • お世話になります。

    SQL ServerのODBCドライバ(システムDNS)を用いて、SQL Serverに接続しているアプリケーションがあるのですが、

    以下のようなエラーが発生してSQL Serverへ接続できないことが度々あります。

    [Microsoft][ODBC SQL Server Driver]時間切れになりました。 (SQL-HYT00)(DBD: db_login/SQLConnect err=-1)

    ※アプリケーションとSQL Serverは別マシンにインストールされています。

    ※アプリケーションは毎分のようにSQL Serverへアクセスしていますが、エラーが発生するのは数日に1回程度です。

    SQL Server構成マネージャにて「MSSQLSERVERのプロトコル」を確認したところ、「TCP/IP」のみ有効でした。

    よって、試しに、「名前付きパイプ」も有効にしたところ、エラーが発生しなくなりました。

    「TCP/IP」での接続で障害が発生した際には代わりに「名前付きパイプ」で接続するなどの機能があるのでしょうか。

    なお、アプリケーションサーバのデータソースの設定画面にて、当ODBCドライバの「構成」>「次へ」>「クライアントの設定」の

    「ネットワークライブラリ」は「TCP/IP」にチェックが入っています。

    何卒、ご教示の程よろしくお願い致します。

    2014年3月5日 9:59

回答

  • >TCP/IPでの接続失敗の原因についてですが、例えばSQL Server接続の
    >TCPポートをあるアプリケーションが使用しているときに
    >別のアプリケーションが同TCPポートで接続できない、というようなことが
    >ありますでしょうか。
    ネットワークでは通信が行われるので通信主体が複数いますが、ここでいうポートはどういう状況のどちら側のことでしょうか?
    単一のクライアントでの話(
    サーバーSに対してクライアントC上でアプリケーションA1、A2の複数が動作)であれば、クライアント側はポートの仕様から別のアプリケーションが使用できないのは明らかです。
    複数のクライアントでの話(サーバーSに対してクライアントC1上でアプリケーションA1、クライアントC2上でアプリケーションA2が動作)であれば、支障ありません。
    ただしこの場合でもサーバー側のソフトウェアの仕様次第では制限があることがあります。
    実際問題、メモリなどの有限なリソースがある以上は無制限ということはあり得ません。
    いずれにせよ接続数に制限があるかという話では、一般論として無制限はあり得ないという答えになるかと思われます。

    例えば SQL Server 2012 の場合は設定項目があり、最大接続数を定義することができますが、最大は確か 32767 だったと記憶しています。

    >名前付きパイプを有効にしてからはエラーが発生しておりませんので、
    >物理的な障害でなくプロトコルレベルの障害なのではないかという考えがよぎりました。
    プロトコルレベルでの障害が起きているのは明らかですし、それを否定するつもりもありません。
    プロトコルレベルでの障害が原因で先のエラーメッセージが発生していますが、ではそのプロトコルレベルの障害は何が原因で発生しているのか、というお話のつもりでした。
    いずれにせよプロトコルの追加で良しとするという決定がされているのであれば、外野がとやかく言うものではありませんので、それはそれで良いかと思います。
    ただ、複数プロトコルの設定は本来はそのような用途のためにある機能ではなく、また先の質問では具体的な事例のことを記載されている割に質問自体は一般論の話でしたので、聞かれたいことの意図をはかりかねたので蛇足として付けたまでです。
    必要のない事項については読み流して頂ければと思います。


    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク k-k2 2014年3月11日 2:14
    2014年3月10日 0:25

すべての返信

  • >「TCP/IP」での接続で障害が発生した際には代わりに「名前付きパイプ」で接続するなどの機能があるのでしょうか。
    あります。
    使用するプロトコルの設定は、接続のクライアント側(ここではアプリケーションをインストールしたマシン)とサーバー側両方にありますが、クライアント側で有効に設定されているプロトコルについて、クライアント側で設定した優先順で、サーバー側へ順に接続を試みます。
    サーバー側は、サーバー側で有効に設定されているプロトコルでの接続要求があった場合に、接続を開きます。

    で、蛇足にはなりますが、そもそもこのエラーが発生する原因については今回は特に問題とされていないようですが、把握済みでしょうか?
    パッと見では接続の試行自体が失敗しているようですので、ネットワーク機器やケーブル類の劣化や熱ダレの可能性も除外できない印象ですので、試行するようになったので動いているように見えるようになった、という当座の対応だけで終わらせるのはあまりお勧めできないかな、という印象です。
    インフラ周りはスレ違いなような気もしますが、そちらも確認された方が良いのではないかな、と思いましたのでご参考まで、補足しておきます。


    MCITP(Database Developer/Database Administrator)

    • 回答の候補に設定 星 睦美 2014年3月7日 4:43
    2014年3月5日 12:40
  • 以前のスレッドが放置状態ですが、それと何か関係が有るのでしょうか?

    http://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/9f221f20-67ce-4b9a-8311-1f9af09eb60e/ieweb?forum=internetexplorerja

    前のスレッドにきちんと対応してから次にスレッドを立てていただくというようにはできませんか?


    • 編集済み SurferOnWww 2014年3月5日 13:48 訂正&追記
    2014年3月5日 13:44
  • SurferOnWwwさん、
    申し訳ございません。
    以前のスレッドも対応させていただきます。


    naginoさん、
    大変丁寧なご回答誠にありがとうございます。

    TCP/IPでの接続失敗の原因についてですが、例えばSQL Server接続の
    TCPポートをあるアプリケーションが使用しているときに
    別のアプリケーションが同TCPポートで接続できない、というようなことが
    ありますでしょうか。

    当SQL Serverは複数のアプリケーションが利用しておりますため
    お伺いしております。
    知識不足で申し訳ございません。

    また、ネットワーク機器やケーブルの劣化であれば、TCP/IPでの接続だけでなく
    名前付きパイプでの接続も失敗するような気がするのですが、見当違いでしょうか。

    名前付きパイプを有効にしてからはエラーが発生しておりませんので、
    物理的な障害でなくプロトコルレベルの障害なのではないかという考えがよぎりました。

    少しでもご意見、アドバイスございましたらお教えいただけますと助かります。

    何卒、よろしくお願い致します。

    2014年3月7日 9:24
  • SurferOnWwwさん、
    申し訳ございません。
    以前のスレッドも対応させていただきます。


    naginoさん、
    大変丁寧なご回答誠にありがとうございます。

    TCP/IPでの接続失敗の原因についてですが、例えばSQL Server接続の
    TCPポートをあるアプリケーションが使用しているときに
    別のアプリケーションが同TCPポートで接続できない、というようなことが
    ありますでしょうか。

    当SQL Serverは複数のアプリケーションが利用しておりますため
    お伺いしております。
    知識不足で申し訳ございません。

    また、ネットワーク機器やケーブルの劣化であれば、TCP/IPでの接続だけでなく
    名前付きパイプでの接続も失敗するような気がするのですが、見当違いでしょうか。

    名前付きパイプを有効にしてからはエラーが発生しておりませんので、
    物理的な障害でなくプロトコルレベルの障害なのではないかという考えがよぎりました。

    少しでもご意見、アドバイスございましたらお教えいただけますと助かります。

    何卒、よろしくお願い致します。

    2014年3月7日 9:24
  • >TCP/IPでの接続失敗の原因についてですが、例えばSQL Server接続の
    >TCPポートをあるアプリケーションが使用しているときに
    >別のアプリケーションが同TCPポートで接続できない、というようなことが
    >ありますでしょうか。
    ネットワークでは通信が行われるので通信主体が複数いますが、ここでいうポートはどういう状況のどちら側のことでしょうか?
    単一のクライアントでの話(
    サーバーSに対してクライアントC上でアプリケーションA1、A2の複数が動作)であれば、クライアント側はポートの仕様から別のアプリケーションが使用できないのは明らかです。
    複数のクライアントでの話(サーバーSに対してクライアントC1上でアプリケーションA1、クライアントC2上でアプリケーションA2が動作)であれば、支障ありません。
    ただしこの場合でもサーバー側のソフトウェアの仕様次第では制限があることがあります。
    実際問題、メモリなどの有限なリソースがある以上は無制限ということはあり得ません。
    いずれにせよ接続数に制限があるかという話では、一般論として無制限はあり得ないという答えになるかと思われます。

    例えば SQL Server 2012 の場合は設定項目があり、最大接続数を定義することができますが、最大は確か 32767 だったと記憶しています。

    >名前付きパイプを有効にしてからはエラーが発生しておりませんので、
    >物理的な障害でなくプロトコルレベルの障害なのではないかという考えがよぎりました。
    プロトコルレベルでの障害が起きているのは明らかですし、それを否定するつもりもありません。
    プロトコルレベルでの障害が原因で先のエラーメッセージが発生していますが、ではそのプロトコルレベルの障害は何が原因で発生しているのか、というお話のつもりでした。
    いずれにせよプロトコルの追加で良しとするという決定がされているのであれば、外野がとやかく言うものではありませんので、それはそれで良いかと思います。
    ただ、複数プロトコルの設定は本来はそのような用途のためにある機能ではなく、また先の質問では具体的な事例のことを記載されている割に質問自体は一般論の話でしたので、聞かれたいことの意図をはかりかねたので蛇足として付けたまでです。
    必要のない事項については読み流して頂ければと思います。


    MCITP(Database Developer/Database Administrator)

    • 回答としてマーク k-k2 2014年3月11日 2:14
    2014年3月10日 0:25
  • 丁寧なご回答ありがとうございました。

    大変助かりました。

    2014年3月11日 2:14