none
TCP動的ポートのポート番号が変わる? RRS feed

  • 質問

  • 皆様、お疲れ様です。SQLServerのネットワーク待ち受けポート(listen)について何かご存じの方がいらっしゃれば教えてください。

    質問事項
    意図的に設定を変更する以外で動的ポートのリッスンポート番号の設定が変わる可能性についてご存じないでしょうか。
    (パッチ適用、他のアプリとの関係、SQLServerの何らかの設定変更が影響など)

    環境について
    OS:Windows2003Server(Intel X86)
    バージョン:SQL Server2005 Standerd Edtion(9.00.3042.00)

    現象
    アプリケーションから動的ポート1048に接続しておりましたが、ある日サーバ(OS)を再起動するとそのポート設定が1049に変わって起動しており、クライアントから接続できない状態となっていました。(人的変更の可能性は可能な限り消去しました)

    補足
    SQLServerの稼働しているサーバは週に1回定期的に再起動しています。前回の再起動時のリッスンポートは1048でSQLServerが起動して いることをOSのイベントログから確認できています。いくつか試した中で、ポート番号を変更後、SQLServerの再起動をすることで待ち受けポートが 変わることから前回の再起動から今回の再起動の1週間のうちに変化していると思われます。
    2009年4月3日 5:43

回答

  • こんにちは、naginoです。

    ポートは動的になっているのですよね?
    http://msdn.microsoft.com/ja-jp/library/ms181087(SQL.90).aspx

    上記の「SQL Server Browser のしくみ」にも以下の記載がありますように、再起動すると変わります。
    (もちろん、偶然同じポート番号が確保された場合は、変わらなかったように見えます。)

    ● SQL Server の起動時に使用可能なポートが割り当てられます。
    ● ポートが動的に割り当てられる場合は、SQL Server が再起動されるたびにポート番号が変わる可能性があるので、クライアントは正しいポート番号を特定できません。

    ですので、ポート番号が変わったのは仕様どおりということになるかと思います。
    ご参考になれば幸いです。


    MCITP(Database Developer/Database Administrator)
    • 回答としてマーク sk7474 2009年4月24日 7:47
    2009年4月3日 5:54
  • 動的ポートの場合は、SQL Server の再起動のタイミングにて、リッスン ポートが変更される場合があります。
    尚、レジストリ上に、前回 起動時のポート番号情報を持っているので、該当のSQL Server 起動時に、前回使用していたポートが空いていれば、そのポートが再度使用され、空いていなければ、他のポートが使われていたような気がします。

    • 回答としてマーク sk7474 2009年4月24日 7:47
    2009年4月3日 7:47
  • そうだと思います。

    ただ、SQL Server のリッスンポートを変更したくないのであれば、Static ポートに変更したほうが良いと思います。

    特定の TCP ポートで受信待ちするようにサーバーを構成する方法 (SQL Server Configuration Manager)
    http://msdn.microsoft.com/ja-jp/library/ms177440.aspx

    • 回答としてマーク sk7474 2009年4月24日 7:46
    2009年4月9日 0:59
  • こんにちは、naginoです。

    要約すると以下になります。
     ● 動的 = Dynamic = 可変
     ● 静的 = Static = 固定

    また、「TCP動的ポート」にはレジストリに記録されているポート番号が表示されるようです。
    サービス稼働中であれば現在使用しているポート番号を、サービス停止中であれば前回稼動時に使用していたポート番号を表示しているようです。

    ポート番号を動的にするか、静的にするかは、TCP / UDP (いわゆるトランスポート層)に対する要件によります。
    ご利用の FireWall がポートによる制限にしか対応していないために静的ポートを選択するですとか、他のサービスも実行しているために動的ポートを選択するですとか、ケースバイケースです。

    なお、動的にした場合であっても、SQL Server Browser サービスを利用することでクライアントがポート番号を知ることができます。
    http://msdn.microsoft.com/ja-jp/library/ms181087.aspx
    クライアントから接続する際にポート番号を指定しているようですが、必ずしも「動的 = クライアントからの接続ができなくなる」ということではありませんので、その点ご留意ください。


    MCITP(Database Developer/Database Administrator)
    2009年4月16日 0:03
  • 返信が遅れてしまいました。

    TCP動的ポートの値は、可変な値となっていますので、現在 該当のポートが表示されていたとしても、該当のポートが他のアプリケーションにて使用されている際に、SQL Server を起動すると、ポートが変わって表示されると思います。

    もし必ず特定のポートにて、該当のSQL Server インスタンスをリッスンした場合は、TCP 動的ポート欄を 空白にして、TCP ポートに ポート番号を入力することにより、今後 該当のインスタンスを起動時、かならず入力したポートにてリッスンすることになります。

    注意点としては、上記の設定にて、指定したポートが他のアプリケーションにて使用されている状態であった場合、該当のインスタンスの起動に失敗します。

    F/Wに無駄なポートを空けたくないと考えているのであれば、TCP動的ポートでは無く、Static ポートに設定したほうが良いと思います。

    • 回答としてマーク sk7474 2009年4月24日 7:46
    2009年4月20日 11:22

すべての返信

  • こんにちは、naginoです。

    ポートは動的になっているのですよね?
    http://msdn.microsoft.com/ja-jp/library/ms181087(SQL.90).aspx

    上記の「SQL Server Browser のしくみ」にも以下の記載がありますように、再起動すると変わります。
    (もちろん、偶然同じポート番号が確保された場合は、変わらなかったように見えます。)

    ● SQL Server の起動時に使用可能なポートが割り当てられます。
    ● ポートが動的に割り当てられる場合は、SQL Server が再起動されるたびにポート番号が変わる可能性があるので、クライアントは正しいポート番号を特定できません。

    ですので、ポート番号が変わったのは仕様どおりということになるかと思います。
    ご参考になれば幸いです。


    MCITP(Database Developer/Database Administrator)
    • 回答としてマーク sk7474 2009年4月24日 7:47
    2009年4月3日 5:54
  • 動的ポートの場合は、SQL Server の再起動のタイミングにて、リッスン ポートが変更される場合があります。
    尚、レジストリ上に、前回 起動時のポート番号情報を持っているので、該当のSQL Server 起動時に、前回使用していたポートが空いていれば、そのポートが再度使用され、空いていなければ、他のポートが使われていたような気がします。

    • 回答としてマーク sk7474 2009年4月24日 7:47
    2009年4月3日 7:47
  • NOBTAさん
    返信おくれまして申し訳ありません。運用開始から半年程度(ずっと週1再起動)ですが、今回たまたま再起動時に1048が何らかのアプリで利用されていたため1049で起動したのではないか?ということでしょうか。
    2009年4月8日 12:04
  • naginoさん
    返信おくれまして申し訳ありません。動的ポートの設定が原則的には毎回ことなるということでしょうか。(仕様?)ということは、動的ポートのリッスン番号を指定する意味はあまりないということでしょうか。たしかにリンク先を参照すると下記のような記載があります。クライアントからサーバに向けた接続でサーバのポートリッスンするポート番号が変わるようです。動的ポートの概念自体を私が把握していないような感じがしますが、正直そんなところでしょうか。

    ===
    SQL Server の起動時に使用可能なポートが割り当てられます。必要であれば、SQL Server のインスタンスに特定のポートを割り当てることができます。クライアントは接続時に特定のポートを指定できますが、ポートが動的に割り当てられる場合は、 SQL Server が再起動されるたびにポート番号が変わる可能性があるので、クライアントは正しいポート番号を特定できません。
    ===

    半年以上、運用してポート番号が変わることがなかったのは偶然ということになるのですね...
    2009年4月8日 12:14
  • そうだと思います。

    ただ、SQL Server のリッスンポートを変更したくないのであれば、Static ポートに変更したほうが良いと思います。

    特定の TCP ポートで受信待ちするようにサーバーを構成する方法 (SQL Server Configuration Manager)
    http://msdn.microsoft.com/ja-jp/library/ms177440.aspx

    • 回答としてマーク sk7474 2009年4月24日 7:46
    2009年4月9日 0:59
  • NOBTAさん
    お疲れ様です。
    「TCP/IPのプロパティ」の「IPALL」の「動的IP」に設定している値が今回変わったのですが、Staticポートとは「TCPポート」の項目を利用した接続の方がよいのではないかということでしょうか。
    規定値で「1433」となっているポートを利用するか「TCPポート」で待ち受けポートを追加するかといったところでしょうか。

    IPALLで
    「TCPポート」と「TCP動的ポート」という項目があり、「TCP動的ポート」は、アプリケーションから接続に使用しているポートが定義済みです。

    何度も、申し訳ありません。
    2009年4月9日 12:05
  • こんにちは、naginoです。

    要約すると以下になります。
     ● 動的 = Dynamic = 可変
     ● 静的 = Static = 固定

    また、「TCP動的ポート」にはレジストリに記録されているポート番号が表示されるようです。
    サービス稼働中であれば現在使用しているポート番号を、サービス停止中であれば前回稼動時に使用していたポート番号を表示しているようです。

    ポート番号を動的にするか、静的にするかは、TCP / UDP (いわゆるトランスポート層)に対する要件によります。
    ご利用の FireWall がポートによる制限にしか対応していないために静的ポートを選択するですとか、他のサービスも実行しているために動的ポートを選択するですとか、ケースバイケースです。

    なお、動的にした場合であっても、SQL Server Browser サービスを利用することでクライアントがポート番号を知ることができます。
    http://msdn.microsoft.com/ja-jp/library/ms181087.aspx
    クライアントから接続する際にポート番号を指定しているようですが、必ずしも「動的 = クライアントからの接続ができなくなる」ということではありませんので、その点ご留意ください。


    MCITP(Database Developer/Database Administrator)
    2009年4月16日 0:03
  • 返信が遅れてしまいました。

    TCP動的ポートの値は、可変な値となっていますので、現在 該当のポートが表示されていたとしても、該当のポートが他のアプリケーションにて使用されている際に、SQL Server を起動すると、ポートが変わって表示されると思います。

    もし必ず特定のポートにて、該当のSQL Server インスタンスをリッスンした場合は、TCP 動的ポート欄を 空白にして、TCP ポートに ポート番号を入力することにより、今後 該当のインスタンスを起動時、かならず入力したポートにてリッスンすることになります。

    注意点としては、上記の設定にて、指定したポートが他のアプリケーションにて使用されている状態であった場合、該当のインスタンスの起動に失敗します。

    F/Wに無駄なポートを空けたくないと考えているのであれば、TCP動的ポートでは無く、Static ポートに設定したほうが良いと思います。

    • 回答としてマーク sk7474 2009年4月24日 7:46
    2009年4月20日 11:22
  • こんにちは。中川俊輔です。

    naginoさん、NOBTAさん、回答ありがとうございます。

    嶋さん、フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?疑問は解決しましたか?
    また質問がありましたら、ぜひ投稿してみてください。
    有用な情報と思われたため、勝手ながらnaginoさん、NOBTAさんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年4月24日 7:53