none
SQLServer2008Expressにリモート接続できない RRS feed

  • 質問

  • 初めて投稿します。余り詳しくないのですが・・・よろしくお願いいたします。
    環境は以下の通りです。

    (サーバ)
    ・WindowsServer2008R2
    ・SQLServer2008EXPRESS
     →SQLServerの設定でTCPIPは有効済み
    ・開放しているポートは1433(それ以外はHttp/Httpsのみ)
     →規定のインスタンスを設定
    ・同じLANにある別のPCからはUDLでアクセス可能を確認
     →SQLServer認証、sa/パスワード

    (クライアント)
    ・Windows7
    ・telnet (サーバ名) 1433 で接続は確認済み
    ・その他のポートチェックツールでも1433でのサーバへの接続は確認済み
    ・UDLでアクセス確認したが接続できず・・・
     ・接続文字列は、(サーバ名)\SQLEXPRESS,1433、SQLServer認証で、sa/パスワード
     ・エラーメッセージは、[DBNETLIB][ConnectionOpen(InvalidConnection()).]接続が正しくありません。
     ・ちなみに接続文字列を、サーバ名\SQLEXPRESSとしたところ(ポート指定を除外)
     ・エラーメッセージは、[DBNETLIB][ConnectionOpen(Connect()).]SQLServerが存在しないか、アクセスが拒否されました。

    1433ポートは通っているようなのですが、SQLServerへのアクセス・認証?が乗り越えられないようです。
    どなたかお知恵を拝借できないでしょうか・・・。


    2014年2月10日 11:57

回答

  • SQLEXPRESS のインスタンスを固定ポートでご利用されているということですが、SQL Server 構成マネージャーの設定は以下のようになっているという認識でよろしいでしょうか??


    TCP 1433 でポートを設定している場合、名前付きインスタンスを使用していてもサーバー名のみで接続が可能なはずです。
    # 接続に使用するプロバイダーにもよりますが、一般的にはサーバー名のみの指定で接続をした場合は 1433 に接続に行き、サーバー名\インスタンス名で接続をした場合には、UDP 1434 (SQL Browser サービス) に接続して、指定したインスタンス名のポート番号を取得し、その後対象ポートに接続をする動作になったはずです。

    SQL Server をインストールしているサーバーのWindows ファイアウォールで TCP 1433 を許可した状態で UDL ファイルを使用した接続を試したところ以下のようになりました。

    サーバー名 : WIN-1JLPU9CV01N
    OS : Windows Server 2008 R2 SP1
    SQL Server : SQL Server 2008 Express Edition (SQLEXPRESS の名前付きインスタンスでインストール (デフォルト))
    接続に使用する SQL Server のユーザー : sa (SQL Server 認証は有効化済み)

    ■UDL のプロバイダーが Microsoft OLE DB Provider for SQL Server の場合

    サーバー名に WIN-1JLPU9CV01N を指定 : [DBNETLIB][ConnectionOpen (Invalid Instance()).]接続が無効です。 でエラー
    サーバー名に WIN-1JLPU9CV01N,1433 を指定 : OK
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS を指定 : [DBNETLIB][ConnectionOpen (Connect()).]SQL Server が存在しないか、アクセスが拒否されました。 でエラー
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS,1433 を指定 : OK

    ■UDL のプロバイダーが SQL Server Native Client 11.0 の場合

    サーバー名に WIN-1JLPU9CV01N を指定 : OK
    サーバー名に WIN-1JLPU9CV01N,1433 を指定 : OK
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS を指定 :[Microsoft SQL Server Native Client 11.0]: Login timeout expired でエラー
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS,1433 を指定 : OK

    外部への公開サーバー名として、
    - SQLEX.test.local (IP アドレスは WIN-1JLPU9CV01N のものを指定)
    を DNS に登録して上記の名称をサーバー名として使用した場合についてもサーバー名のみを指定した場合と同等の結果となりましたので、別名で接続を使用とした場合もサーバー名で接続ができていれば問題はないかと思います。
    # SQL Server 認証で試しています。Windows 認証の場合は挙動が変わる可能性があります。

    問題の切り分けのために以下の設定/接続を確認されてはいかがでしょうか?

    • SQL Server をインストールしているサーバーの SQL Server 構成マネージャーで TCP 1433 が設定されている
      # netstat -abno で sqlservr.exe が TCP 1433 でリスニングされているかを確認してもよいかと思います。
    • SQL Server をインストールしているサーバーの Windows ファイアウォールで TCP 1433 の受信が許可されている
    • UDL ファイルを使用するクライアントから SQL Server をインストールしているサーバーに 1433 で telnet 接続できる
    • UDL ファイルを使用するクライアントから SQL Server をインストールしているサーバーに UDL のテスト接続でサーバー名,1433 で接続できる
    • UDL ファイルを使用するクライアントから SQL Server をインストールしているサーバーに UDL のテスト接続でサーバーの IP アドレス,1433 で接続できる

    ご参考になれば幸いです。

    • 回答の候補に設定 星 睦美 2014年2月17日 8:03
    • 回答としてマーク 星 睦美 2014年3月3日 2:09
    2014年2月12日 3:32
    モデレータ

すべての返信

  • SQL Server の Express 版をインストールすると、デフォルトでは「名前つきインスタンス」となり、接続には SQL Server Browser が必要になります。

    そのあたりは問題ないですか?

    「既定のインスタンス」が存在しなければ、固定ポート (TCP 1433) を使うように設定を変更すれば SQL Server Browser を使用せずに接続することができます。

    詳しくは以下のページを見てください。

    SQLEXPRESS は「名前つきインスタンス」名
    http://surferonwww.info/BlogEngine/post/2012/11/12/express-edition-uses-named-instance-by-defualt.aspx

    ハズレでしたら失礼しました。

    2014年2月10日 12:11
  • 早速回答いただきありがとうございます。またご指摘ありがとうございます。

    状況は、名前つきインスタンス「SQLEXPRESS」を用意し、固定ポート(1433)を使うように設定している、でした。

    さて新たにわかったことなのですが、実サーバ名と、公開サーバ名が異なりました。

    つまり、クライアントで設定しているサーバ名は公開サーバ名を指定しており、サーバ側では、

    公開サーバ名を把握していないため、SQLServer接続ができない(SQLサーバを特定でき

    ない)のでは?と考えました。ネットワーク経路的には、実サーバにはたどり着いているのですが・・・。

    このようなケースですが、SQLServer接続文字列として指定した公開サーバ名は実サーバ名に変換される

    ものなのでしょうか?ただの文字列として流れてしまうのでしょうか?サーバ側にHost登録(公開サーバ名 サーバ名)

    すれば回避できるようなものでしょうか?

    2014年2月10日 14:04
  • > 実サーバ名と、公開サーバ名が異なりました。
    > つまり、クライアントで設定しているサーバ名は公開サーバ名を指定しており、
    ・・・中略・・・
    > ネットワーク経路的には、実サーバにはたどり着いているのですが・・・。

    意味が分かりません。

    「実サーバ名」「公開サーバ名」とは具体的になんなのですか?

    「クライアントで設定しているサーバ名」というのは接続文字列の Server(または Data Source または Address または Addr または Network Address)に設定しているサーバー名のことですか?

    「実サーバにはたどり着いている」とは具体的にどういうことで、何を根拠にそう判断しているのですか?


    ・・・と、いろいろ分からないことだらけですが、何にせよ、名前付きインスタンスに TCP/IP でリモート接続するには、接続文字列で以下の構文を使用し、

    Server=<server name>\<instance name>

    当然、<server name> で名前解決(詳しくは下記のページ参照)できなければなりません。現在接続文字列に設定している <server name> で名前解決できるのか確認してください。

    また、先のレスで紹介したページに書いてあるように、Express 版をデフォルトでインストールすると、SQLEXPRESS という名前の「名前つきインスタンス」になります。なので、<instance name> は、SQLEXPRESS としなければなりません。省略する(Server=<server name> とする)と「既定のインスタンス」に接続に行きます。


    名前解決
    http://surferonwww.info/BlogEngine/post/2012/05/23/Address-resolution.aspx


    • 編集済み SurferOnWww 2014年2月11日 10:04 誤字訂正
    2014年2月11日 3:37
  • SQLEXPRESS のインスタンスを固定ポートでご利用されているということですが、SQL Server 構成マネージャーの設定は以下のようになっているという認識でよろしいでしょうか??


    TCP 1433 でポートを設定している場合、名前付きインスタンスを使用していてもサーバー名のみで接続が可能なはずです。
    # 接続に使用するプロバイダーにもよりますが、一般的にはサーバー名のみの指定で接続をした場合は 1433 に接続に行き、サーバー名\インスタンス名で接続をした場合には、UDP 1434 (SQL Browser サービス) に接続して、指定したインスタンス名のポート番号を取得し、その後対象ポートに接続をする動作になったはずです。

    SQL Server をインストールしているサーバーのWindows ファイアウォールで TCP 1433 を許可した状態で UDL ファイルを使用した接続を試したところ以下のようになりました。

    サーバー名 : WIN-1JLPU9CV01N
    OS : Windows Server 2008 R2 SP1
    SQL Server : SQL Server 2008 Express Edition (SQLEXPRESS の名前付きインスタンスでインストール (デフォルト))
    接続に使用する SQL Server のユーザー : sa (SQL Server 認証は有効化済み)

    ■UDL のプロバイダーが Microsoft OLE DB Provider for SQL Server の場合

    サーバー名に WIN-1JLPU9CV01N を指定 : [DBNETLIB][ConnectionOpen (Invalid Instance()).]接続が無効です。 でエラー
    サーバー名に WIN-1JLPU9CV01N,1433 を指定 : OK
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS を指定 : [DBNETLIB][ConnectionOpen (Connect()).]SQL Server が存在しないか、アクセスが拒否されました。 でエラー
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS,1433 を指定 : OK

    ■UDL のプロバイダーが SQL Server Native Client 11.0 の場合

    サーバー名に WIN-1JLPU9CV01N を指定 : OK
    サーバー名に WIN-1JLPU9CV01N,1433 を指定 : OK
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS を指定 :[Microsoft SQL Server Native Client 11.0]: Login timeout expired でエラー
    サーバー名に WIN-1JLPU9CV01N\SQLEXPRESS,1433 を指定 : OK

    外部への公開サーバー名として、
    - SQLEX.test.local (IP アドレスは WIN-1JLPU9CV01N のものを指定)
    を DNS に登録して上記の名称をサーバー名として使用した場合についてもサーバー名のみを指定した場合と同等の結果となりましたので、別名で接続を使用とした場合もサーバー名で接続ができていれば問題はないかと思います。
    # SQL Server 認証で試しています。Windows 認証の場合は挙動が変わる可能性があります。

    問題の切り分けのために以下の設定/接続を確認されてはいかがでしょうか?

    • SQL Server をインストールしているサーバーの SQL Server 構成マネージャーで TCP 1433 が設定されている
      # netstat -abno で sqlservr.exe が TCP 1433 でリスニングされているかを確認してもよいかと思います。
    • SQL Server をインストールしているサーバーの Windows ファイアウォールで TCP 1433 の受信が許可されている
    • UDL ファイルを使用するクライアントから SQL Server をインストールしているサーバーに 1433 で telnet 接続できる
    • UDL ファイルを使用するクライアントから SQL Server をインストールしているサーバーに UDL のテスト接続でサーバー名,1433 で接続できる
    • UDL ファイルを使用するクライアントから SQL Server をインストールしているサーバーに UDL のテスト接続でサーバーの IP アドレス,1433 で接続できる

    ご参考になれば幸いです。

    • 回答の候補に設定 星 睦美 2014年2月17日 8:03
    • 回答としてマーク 星 睦美 2014年3月3日 2:09
    2014年2月12日 3:32
    モデレータ
  • > サーバー名\インスタンス名で接続をした場合には、UDP 1434 (SQL Browser サービス)
    > に接続して、指定したインスタンス名のポート番号を取得し、その後対象ポートに接続
    > をする動作になったはずです。

    それは知らなかったです。フォロー有難うございました。

    自分でも、Visual Studio 2010 のサーバーエクスプローラーから、固定ポート 1433 を利用して TCP/IP 接続できるように設定したローカルの SQL Server 2008 Express に、プロバイダ SqlClient で、Windows 認証にて接続してみました。

    接続文字列を、

    Data Source=xxx;Initial Catalog=PUBS;Integrated Security=True

    のようにして、上記の xxx の部分を変えて試した見た結果、以下のように Masayuki.Ozawa さんが書かれたとおりでした。

    tcp:<server name> ------------------------> OK
    tcp:<server name>,1433 -------------------> OK
    tcp:<server name>\SQLEXPRESS,1433 --------> OK
    tcp:<server name>\SQLEXPRESS -------------> エラー

    ちなみに、上の最後のケースでのエラーメッセージは以下の通りでした。

    "SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(provider: SQL Network Instances, error: 26 - 指定されたサーバーまたはインスタンスの位置を特定している時にエラーが発生しました)"

    ということで、先の自分のレス、

    > 省略する(Server=<server name> とする)と「既定のインスタンス」に接続に行きます。

    は、少なくとも TCP/IP で固定ポートを利用した「名前つきインスタンス」に接続する場合は間違いでした。すみません。




    • 編集済み SurferOnWww 2014年2月12日 6:49 誤記訂正
    2014年2月12日 6:31
  • フォーラム オペレーターの星 睦美です。
    miryotaku さん、こんにちは。

    Masayuki.Ozawa さんからの返信が参考になるのではないかと思いますので、私のほうで[回答の候補に設定] させていただきました。ユーザー同士の情報交換がより活発になりますように、役立つ回答には投稿者から[回答としてマーク] いただければ幸いです。

    回答の内容に引き続き質問がありましたら返信をお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年2月21日 8:24