トップ回答者
TCP動的ポートのポート番号が変わる?

質問
-
皆様、お疲れ様です。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週間のうちに変化していると思われます。
回答
-
こんにちは、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
-
こんにちは、naginoです。
要約すると以下になります。
● 動的 = Dynamic = 可変
● 静的 = Static = 固定
また、「TCP動的ポート」にはレジストリに記録されているポート番号が表示されるようです。
サービス稼働中であれば現在使用しているポート番号を、サービス停止中であれば前回稼動時に使用していたポート番号を表示しているようです。
ポート番号を動的にするか、静的にするかは、TCP / UDP (いわゆるトランスポート層)に対する要件によります。
ご利用の FireWall がポートによる制限にしか対応していないために静的ポートを選択するですとか、他のサービスも実行しているために動的ポートを選択するですとか、ケースバイケースです。
なお、動的にした場合であっても、SQL Server Browser サービスを利用することでクライアントがポート番号を知ることができます。
http://msdn.microsoft.com/ja-jp/library/ms181087.aspx
クライアントから接続する際にポート番号を指定しているようですが、必ずしも「動的 = クライアントからの接続ができなくなる」ということではありませんので、その点ご留意ください。
MCITP(Database Developer/Database Administrator)- 編集済み nagino - 引退エンジニア 2009年4月16日 0:06 TCP動的ポートの表示について情報追加
- 回答としてマーク sk7474 2009年4月24日 7:46
-
返信が遅れてしまいました。
TCP動的ポートの値は、可変な値となっていますので、現在 該当のポートが表示されていたとしても、該当のポートが他のアプリケーションにて使用されている際に、SQL Server を起動すると、ポートが変わって表示されると思います。
もし必ず特定のポートにて、該当のSQL Server インスタンスをリッスンした場合は、TCP 動的ポート欄を 空白にして、TCP ポートに ポート番号を入力することにより、今後 該当のインスタンスを起動時、かならず入力したポートにてリッスンすることになります。
注意点としては、上記の設定にて、指定したポートが他のアプリケーションにて使用されている状態であった場合、該当のインスタンスの起動に失敗します。
F/Wに無駄なポートを空けたくないと考えているのであれば、TCP動的ポートでは無く、Static ポートに設定したほうが良いと思います。- 回答としてマーク sk7474 2009年4月24日 7:46
すべての返信
-
こんにちは、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
-
naginoさん
返信おくれまして申し訳ありません。動的ポートの設定が原則的には毎回ことなるということでしょうか。(仕様?)ということは、動的ポートのリッスン番号を指定する意味はあまりないということでしょうか。たしかにリンク先を参照すると下記のような記載があります。クライアントからサーバに向けた接続でサーバのポートリッスンするポート番号が変わるようです。動的ポートの概念自体を私が把握していないような感じがしますが、正直そんなところでしょうか。
===
SQL Server の起動時に使用可能なポートが割り当てられます。必要であれば、SQL Server のインスタンスに特定のポートを割り当てることができます。クライアントは接続時に特定のポートを指定できますが、ポートが動的に割り当てられる場合は、 SQL Server が再起動されるたびにポート番号が変わる可能性があるので、クライアントは正しいポート番号を特定できません。
===
半年以上、運用してポート番号が変わることがなかったのは偶然ということになるのですね... -
-
こんにちは、naginoです。
要約すると以下になります。
● 動的 = Dynamic = 可変
● 静的 = Static = 固定
また、「TCP動的ポート」にはレジストリに記録されているポート番号が表示されるようです。
サービス稼働中であれば現在使用しているポート番号を、サービス停止中であれば前回稼動時に使用していたポート番号を表示しているようです。
ポート番号を動的にするか、静的にするかは、TCP / UDP (いわゆるトランスポート層)に対する要件によります。
ご利用の FireWall がポートによる制限にしか対応していないために静的ポートを選択するですとか、他のサービスも実行しているために動的ポートを選択するですとか、ケースバイケースです。
なお、動的にした場合であっても、SQL Server Browser サービスを利用することでクライアントがポート番号を知ることができます。
http://msdn.microsoft.com/ja-jp/library/ms181087.aspx
クライアントから接続する際にポート番号を指定しているようですが、必ずしも「動的 = クライアントからの接続ができなくなる」ということではありませんので、その点ご留意ください。
MCITP(Database Developer/Database Administrator)- 編集済み nagino - 引退エンジニア 2009年4月16日 0:06 TCP動的ポートの表示について情報追加
- 回答としてマーク sk7474 2009年4月24日 7:46
-
返信が遅れてしまいました。
TCP動的ポートの値は、可変な値となっていますので、現在 該当のポートが表示されていたとしても、該当のポートが他のアプリケーションにて使用されている際に、SQL Server を起動すると、ポートが変わって表示されると思います。
もし必ず特定のポートにて、該当のSQL Server インスタンスをリッスンした場合は、TCP 動的ポート欄を 空白にして、TCP ポートに ポート番号を入力することにより、今後 該当のインスタンスを起動時、かならず入力したポートにてリッスンすることになります。
注意点としては、上記の設定にて、指定したポートが他のアプリケーションにて使用されている状態であった場合、該当のインスタンスの起動に失敗します。
F/Wに無駄なポートを空けたくないと考えているのであれば、TCP動的ポートでは無く、Static ポートに設定したほうが良いと思います。- 回答としてマーク sk7474 2009年4月24日 7:46