none
SQLServer2014 DB接続エラー

    質問

  • 以下環境でトレースログを取得しようと思っておりますが、コマンド実行時にエラーがでました。
    エラー原因をお分かりの方いらっしゃれば、教えて頂けますでしょうか。

    ■環境
    ・Windows Server 2012 R2 64bit
    CPU:12core
    メモリ:48GB
    ・SQLServer2014 Enterprise

    ■コマンド(サーバ名はマスクしております)
    >sqlcmd -S xxxxxx\MSSQLSERVER -i C:\temp\SQLtrace.sql

    <エラーメッセージ>
    Sqlcmd: エラー: Microsoft ODBC Driver 11 for SQL Server: SQL Server ネットワーク
     インターフェイス: 接続文字列が有効ではありません [87]. 。
    Sqlcmd: エラー: Microsoft ODBC Driver 11 for SQL Server: ログイン タイムアウトが
    時間切れになりました。
    Sqlcmd: エラー: Microsoft ODBC Driver 11 for SQL Server: SQL Server への接続の確
    立中に、ネットワーク関連のエラーまたはインスタンス固有のエラーが発生しました。サ
    ーバーが見つからないか、アクセスできません。インスタンス名が正しいことと、SQL Se
    rver がリモート接続を許可するように構成されていることを確認してください。詳細に
    ついては、SQL Server オンライン ブックを参照してください。。

    ■補足
     サーバ名は、SQL Management Stadioで接続する際の"サーバ名"を指定しました。
     インスタンス名は、サービス「SQL Server(MSSQLSERVER)」より確認し、指定しました。

    何が問題なのか判らず、ご存知の方、ご教示頂けますと幸いです。
    2018年3月23日 14:24

回答

  • > インスタンス名は、サービス「SQL Server(MSSQLSERVER)」より確認し、指定しました。

    「既定のインスタンス」のインスタンス名は MSSQLSERVER という記述はいたるところで目にしますが、どうもそれはウソっぽいです。

    詳しくは以下の記事を見てください。

    既定のインスタンスの名前は?
    http://surferonwww.info/BlogEngine/post/2012/11/17/what-is-the-name-of-the-default-instance.aspx

    その記事の下の方の書いてありますが、SQL Server 2005 Developer Edition の「既定のインスタンス」にインスタンス名 MSSQLSERVER を指定して接続にトライしたら、"接続文字列が有効ではありません [87]" というエラーメッセージが出て接続に失敗したという実例があります。

    なので、xxxxxx\MSSQLSERVER ではなくて xxxxxx として試してみてください。

    • 回答としてマーク nbosamohan 2018年3月27日 2:38
    2018年3月24日 1:27
  • SQL Serverは1台のコンピューターに複数インストールでき、インストールしたそれぞれがインスタンスとして稼働します。全てのインスタンスには名前が必要です。インストールする際に名前を付けなかった場合、MSSQLSERVERというインスタンス名が使われてインストールされます。それにより、一例ですが、以下のようなフォルダ等が作成されます。
    C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER

    一方で、接続時に指定するインスタンス名は別に考えた方がわかりやすいと思います。既定のインスタンスへの接続はインスタンス名を指定しないことになっています。逆に言えば、インスタンス名を指定した場合、それは必ず名前付きインスタンス名として扱われます。これは仕様です。
    (参考)
    sqlcmd ユーティリティ
    https://technet.microsoft.com/ja-jp/library/ms162773(v=sql.105).aspx

    インスタンス = SQL Serverのサービスと考えても良いので、一例ですが、

    サービス名(インスタンス名)     接続に使用する際のインスタンス名               
    MSSQLSERVER                  なし
    MSSQL$SQLEXPRESS                                  SQLEXPRESS

    と考えれば、わかりやすいのではないでしょうか? 要するに、インスタンス名をサービス側として捉えるのか、接続側から捉えるのかによって、既定のインスタンス名があったり無かったりするわけです。

    (追記)
    想像ですが、システム的には複数のインスタンスを区別するため必ずインスタンス名は必要だけれど、ユーザーから見ればインストール時にインスタンス名を指定しなかったので、使う時もインスタンス名を指定しなくていいよねって方がわかりやすいので、そういう仕様になっているのではないでしょうか?

    (訂正)
    SQLEXPRESSのサービス名を、SQLEXPRESSからMSSQL$SQLEXPRESSへ訂正


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!


    • 編集済み trapemiyaMVP 2018年3月26日 4:44 訂正
    • 回答としてマーク nbosamohan 2018年3月27日 2:38
    2018年3月26日 1:51
  • > サービス名(インスタンス名)  接続に使用する際のインスタンス名              
    > MSSQLSERVER           なし
    > sqlexpress           sqlexpress

    SQL Server Express のサービス名(アカウント名)は SQLEXPRESS ではないはずです。(デフォルトで SQLEXPRESS という名前付きインスタンスとしてインストールした場合でも)

    SQL Server の Express 版をインストールすると、デフォルトでは SQLEXPRESS という名前つきインスタンスとなるものの、Express 版でも、既定のインスタンスまたは SQLEXPRESS 以外の名前つきインスタンスとしてインストールできるはずです。

    サービス名(アカウント名)は一般的には以下のようになるはずです。

    <アカウント名>
    既定のインスタンス: NT SERVICE\MSSQLSERVER
    名前つきインスタンス: NT SERVICE\MSSQL$<instance_name>

    <グループ名>
    既定のインスタンス: SQLServerMSSQLUser$<computer_name>$MSSQLSERVER
    名前つきインスタンス: SQLServerMSSQLUser$<computer_name>$<instance_name>

    詳しい説明は以下の記事に書いてありました。

    Windows サービス アカウントの設定
    https://msdn.microsoft.com/ja-jp/library/ms143504(v=sql.90).aspx

    確認願います。



    • 編集済み SurferOnWww 2018年3月26日 3:17 誤記訂正
    • 回答としてマーク nbosamohan 2018年3月27日 2:38
    2018年3月26日 2:41

すべての返信

  • > インスタンス名は、サービス「SQL Server(MSSQLSERVER)」より確認し、指定しました。

    「既定のインスタンス」のインスタンス名は MSSQLSERVER という記述はいたるところで目にしますが、どうもそれはウソっぽいです。

    詳しくは以下の記事を見てください。

    既定のインスタンスの名前は?
    http://surferonwww.info/BlogEngine/post/2012/11/17/what-is-the-name-of-the-default-instance.aspx

    その記事の下の方の書いてありますが、SQL Server 2005 Developer Edition の「既定のインスタンス」にインスタンス名 MSSQLSERVER を指定して接続にトライしたら、"接続文字列が有効ではありません [87]" というエラーメッセージが出て接続に失敗したという実例があります。

    なので、xxxxxx\MSSQLSERVER ではなくて xxxxxx として試してみてください。

    • 回答としてマーク nbosamohan 2018年3月27日 2:38
    2018年3月24日 1:27
  • SQL Serverは1台のコンピューターに複数インストールでき、インストールしたそれぞれがインスタンスとして稼働します。全てのインスタンスには名前が必要です。インストールする際に名前を付けなかった場合、MSSQLSERVERというインスタンス名が使われてインストールされます。それにより、一例ですが、以下のようなフォルダ等が作成されます。
    C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER

    一方で、接続時に指定するインスタンス名は別に考えた方がわかりやすいと思います。既定のインスタンスへの接続はインスタンス名を指定しないことになっています。逆に言えば、インスタンス名を指定した場合、それは必ず名前付きインスタンス名として扱われます。これは仕様です。
    (参考)
    sqlcmd ユーティリティ
    https://technet.microsoft.com/ja-jp/library/ms162773(v=sql.105).aspx

    インスタンス = SQL Serverのサービスと考えても良いので、一例ですが、

    サービス名(インスタンス名)     接続に使用する際のインスタンス名               
    MSSQLSERVER                  なし
    MSSQL$SQLEXPRESS                                  SQLEXPRESS

    と考えれば、わかりやすいのではないでしょうか? 要するに、インスタンス名をサービス側として捉えるのか、接続側から捉えるのかによって、既定のインスタンス名があったり無かったりするわけです。

    (追記)
    想像ですが、システム的には複数のインスタンスを区別するため必ずインスタンス名は必要だけれど、ユーザーから見ればインストール時にインスタンス名を指定しなかったので、使う時もインスタンス名を指定しなくていいよねって方がわかりやすいので、そういう仕様になっているのではないでしょうか?

    (訂正)
    SQLEXPRESSのサービス名を、SQLEXPRESSからMSSQL$SQLEXPRESSへ訂正


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!


    • 編集済み trapemiyaMVP 2018年3月26日 4:44 訂正
    • 回答としてマーク nbosamohan 2018年3月27日 2:38
    2018年3月26日 1:51
  • > サービス名(インスタンス名)  接続に使用する際のインスタンス名              
    > MSSQLSERVER           なし
    > sqlexpress           sqlexpress

    SQL Server Express のサービス名(アカウント名)は SQLEXPRESS ではないはずです。(デフォルトで SQLEXPRESS という名前付きインスタンスとしてインストールした場合でも)

    SQL Server の Express 版をインストールすると、デフォルトでは SQLEXPRESS という名前つきインスタンスとなるものの、Express 版でも、既定のインスタンスまたは SQLEXPRESS 以外の名前つきインスタンスとしてインストールできるはずです。

    サービス名(アカウント名)は一般的には以下のようになるはずです。

    <アカウント名>
    既定のインスタンス: NT SERVICE\MSSQLSERVER
    名前つきインスタンス: NT SERVICE\MSSQL$<instance_name>

    <グループ名>
    既定のインスタンス: SQLServerMSSQLUser$<computer_name>$MSSQLSERVER
    名前つきインスタンス: SQLServerMSSQLUser$<computer_name>$<instance_name>

    詳しい説明は以下の記事に書いてありました。

    Windows サービス アカウントの設定
    https://msdn.microsoft.com/ja-jp/library/ms143504(v=sql.90).aspx

    確認願います。



    • 編集済み SurferOnWww 2018年3月26日 3:17 誤記訂正
    • 回答としてマーク nbosamohan 2018年3月27日 2:38
    2018年3月26日 2:41
  • SurferOnWwwさま

    SurferOnWwwさんがおっしゃる通りだと思います。インスタンス名にフォーカスを当てたので、サービス名の記述が不正確になってしまったのはご指摘の通りです。訂正しておきました。
    ご指摘、ありがとうございました。

     


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年3月26日 4:45
  • 皆様、ご回答ありがとうございました。

    >sqlcmd -S xxxxxx -i C:\temp\SQLtrace.sql

    で実行できました。

    2018年3月27日 2:38