web-dev-qa-db-ja.com

ODBC DSNをデフォルトポートのデフォルト以外のSQL Serverインスタンスに接続する方法は?

あるサーバー上のSQL Server 2000データベースを別のサーバー上のSQL Server 2008 R2に移行しています。クライアントアプリケーションは、ユーザーDSNを使用してインターネット上のSQL Serverに直接接続します。

古いサーバーにデータベースをバックアップし、新しいサーバーに復元しました。SQLManagement Studioを使用してログインしたり、クエリを実行したりできます。

新しいサーバーのSQL Serverは既定のインスタンスではありませんが、SQL構成マネージャーを使用して、そのインスタンスの既定のポートを1433に変更しました。SQLManagement Studioは、サーバーIPまたはドメイン名を指定するだけで正しいインスタンスに接続できます(したがってファイアウォールの問題はない、またはそう思います)。

ここまでは順調ですね。

クライアントアプリケーションでサーバーに接続しようとすると、問題が発生します。接続エラー/無効なインスタンスエラーが発生します。クライアントアプリは50か所の異なる場所にある約100台のコンピューターで実行されるため、1日でそれぞれを再構成することはできず、ダウンタイムが発生します。

コンピュータでDSNを作成して、接続をテストしてみました。ポート番号(123.123.123.123,1433)でIPアドレスを指定すると機能しますが、IPアドレス(123.123.123.123)のみを使用すると、上記と同じエラーが発生します。


接続に失敗しました:
SQLState: '01000'
SQLサーバーエラー:14
[Microsoft] [ODBC SQL Serverドライバー] [TCP/IPソケット] ConnectionOpen(無効なInstance())。
接続に失敗しました:
SQLState: '08001'
SQLサーバーエラー:14
[Microsoft] [ODBC SQL Server Driver] [TCP/IP Sockets]無効な接続。


SQL Serverのバージョンを除いて、新しいサーバーと古いサーバーの間で私が考えられる唯一の違いは、古いサーバーはデフォルトのインスタンスであり、新しいサーバーは名前付きインスタンスであることです。

次に試してみたいアイデアはありますか?

編集:

私が試した他のいくつかのこと:

  • SQL Serverを使用していますODBCドライバー。SQLServer Native Clientドライバーを使用すると、すべて期待どおりに動作します。
  • 同じサーバーでサーバーのパブリックIPアドレスを使用してDSN接続を作成すると、同じ動作が見られます。
  • デフォルト以外のインスタンスを停止し、デフォルトのインスタンスを1433ポートで実行すると、(ポートを指定しなくても)期待どおりに動作します。デフォルト以外のインスタンスをポート1433でリッスンするように設定した場合、接続するポートを明示的に指定する必要があります。

編集を終了

ありがとう!

ルイスアロンソラモス

3

あなたが達成したいことはそのクライアントを使用して不可能であるようです。

この問題は、古いSQLクライアント(特にMDAC sqlsvr32.dllドライバーを使用)がSQL Serverに接続するときに「InstanceValidity」チェックを実行した結果です。ドライバーはインスタンスとして「MSSQLServer」を渡し、InstanceValidityチェックを検証します。この場合、デフォルトポート(1433)でリッスンするインスタンス名は「Instance01」および「Instance02」という名前であるため、インスタンス名がInstanceValidityチェックと一致しないため、失敗します。

この場合に最も便利な方法によると、クライアントのポートを指定するか、クライアントを変更するか、名前付きインスタンスをデフォルトのインスタンスに変更する必要があります。

ソース: http://social.msdn.Microsoft.com/Forums/sqlserver/en-US/7f353b59-7e7f-4ec3-adcb-e69ca2629b21/named-sql-2008-r2-server-listening-on- default-port-1433-with-dedicated-ip-address-requires-port?forum = sqldataaccess

1
Ed. Urrutia

最初に、SQL ServerのインスタンスでTCP/IPプロトコルが有効になっていることを確認します。次に、SQL Serverのインスタンスが "リッスンしている" TCP/IPポートを調べます。

次に、このマシンにファイアウォールがある場合は、SQL Server Management Studioプログラムのルール(受信)に例外があるかどうかを確認します。例外がある場合は、ファイアウォールを通過できますが、ODBCしないでしょう。

サーバー参照については、「サーバー名\インスタンス名」としてサーバーを参照するか、ポート番号を使用して、サーバーアドレスとして「サーバー名1433」または「サーバー名\インスタンス名1433」を試してください。

TCPポートが空白の場合、サーバーはどのポートに応答するかを知る必要もあります。デフォルトのポートを使用するわけではありません。達成したいことによっては、実行または確認が必要になる場合があります。これらのいずれかが正しく行われた場合:

サーバーでのポート割り当ての設定方法 https://dba.stackexchange.com/questions/47651/when-is-a-dynamic-port-dynamic

特定のTCPポートでリッスンするようにサーバーを構成する(SQL Server構成マネージャー) http://msdn.Microsoft.com/en-us/library/ms177440.aspx =

静的ポートをSQL Serverの名前付きインスタンスに割り当てます-そして、一般的な落とし穴を回避します http://blogs.msdn.com/b/arvindsh/archive/2012/09/08/how-to-assign-a- static-port-to-a-sql-server-named-instance-and-avoid-a-common-pitfall.aspx

リモートSQL Serverに接続するには、IPとポート(どちらが安全か)を使用するか、名前付きインスタンスを明示的に指定してUDPポート1434を開き、SQL Server Browserを有効にするという2つのオプションがあります。

その理由は、SQL Serverの名前付きインスタンスのみが動的ポート割り当てプロセスを使用できるためです。動的ポート割り当てプロセスでは、SQL Serverのインスタンスを初めて起動すると、ポートがゼロ(0)に設定されます。したがって、SQL Serverはオペレーティングシステムに空いているポート番号を要求します。 SQL Serverにポート番号が割り当てられるとすぐに、SQL Serverは割り当てられたポートでリッスンを開始します。

SQL Serverのインスタンスが動的ポート割り当てを使用する場合、SQL Serverクライアントで構築される接続文字列は、ユーザーまたはプログラマーが明示的にポートを指定しない限り、宛先TCP/IPポートを指定しません。したがって、SQL Serverクライアントライブラリは、UDPポート1434でサーバーにクエリを送信し、SQL Serverの宛先インスタンスに関する情報を収集します。 SQL Serverが情報を返すと、SQL ServerクライアントライブラリはSQL Serverの適切なインスタンスにデータを送信します。

UDPポート1434が無効になっている場合、SQL ServerクライアントはSQL Serverの名前付きインスタンスのポートを動的に決定できません。したがって、SQL ServerクライアントがSQL Serverの名前付きインスタンスに接続できない場合があります。この状況では、SQL Serverクライアントは、SQL Server 2008の名前付きインスタンスがある動的に割り当てられたポートを指定する必要があります。

さらに、必要に応じて、ユーザーODBCではなくシステムODBCを使用することもできます。違いは、ユーザーODBCがマシン上の1つのユーザーアカウントに関連付けられていることです。

1
Random Citizen

私はまったく同じ問題を抱えており、なんとか解決しました!これは私が学んだことです。

  • 名前付きインスタンスをインストールした場合。名前をデフォルトに変更することはできません。ただし、次のことはできます。名前付きインスタンスにデフォルトのポートを待機させます。インスタンス名を指定せずにManagement Studioから接続するのに役立ちますが、ODBCには役立ちません。

  • (トリックとして、MSSQLServerまたはIPアドレスのような名前で)エイリアスを作成して、クライアントを機能させることができます。一部のアプリケーションで機能する場合があります。

  • この回避策が役に立たない場合は、SQLを完全にアンインストールしてから再インストールするのが最善の策ですが、「デフォルトのインスタンス」を選択した場合でも、新しいインストールで名前付きインスタンスの名前が再度使用される可能性があります。 SQLサービスでこれを確認して、古い名前がまだ使用されているかどうかを確認できます。この場合、(私にとってはうまくいった)最良の方法は、デフォルトのインスタンス名であることがわかっているMSSQLServerの明示的な名前で新しいインスタンスをインストールすることです。 これにより、ODBCで機能します。

別の注記:SQLはコンピュータ名を受け取り、エイリアスとして使用します。

0
Moe Eqbal