SQL Server接続の問題をトラブルシューティングするための推奨される前提条件とチェックリスト

適用対象: SQL Server
元の KB 番号: 4009936

接続の問題を効果的にトラブルシューティングするには、次の情報を収集します。

  • エラー メッセージとエラー コードのテキスト。 エラーが断続的 (場合によっては発生のみ) か、一貫性があるか (常に発生する) かどうかを確認します。

  • SQL Serverおよびクライアント システムからのアプリケーションおよびシステム イベント ログ。 これらのログは、SQL Serverでシステム全体の問題が発生した場合のチェックに役立ちます。

  • アプリケーションからの接続が失敗している場合は、アプリケーションから接続文字列を収集します。 これらの文字列は、通常、ASP.NET アプリケーションの Web.config ファイルにあります。

  • その他のエラー メッセージと例外SQL Serverエラー ログを収集して確認します。

  • SQL Server コンピューターへの管理者アクセス権がある場合は、次の手順に従って、現在のコンピューター設定とサービス アカウントを収集して確認します。

    1. 最新バージョンの SQLCHECK をダウンロードします。

    2. ダウンロードしたファイルをフォルダー ( C:\Temp など) に解凍します。

    3. 管理者としてコマンド プロンプトを実行してデータを収集し、ファイルに保存します。 例: SQLCHECK > C:\Temp\server01.SQLCHECK.TXT

    注:

    リモート クライアントからの接続の問題のトラブルシューティングやリンク サーバー クエリのトラブルシューティングを行う場合は、関係するすべてのシステムで SQLCHECK ツールを実行します。

接続の問題をトラブルシューティングするためのクイック チェックリスト

注:

次のセクションは、接続の問題をすばやくチェックするのに役立ちます。 詳細なトラブルシューティング手順については、個々のトピックを確認してください。

オプション 1

推奨される前提条件」セクションで説明されている SQLCHECK ツールの出力にアクセスし、出力ファイルのさまざまなセクション (コンピューター、クライアント セキュリティ、およびSQL Server) の情報を確認できる場合は、情報を使用して問題の原因となる問題に対処します。 次の例を参照してください。

ファイル内のセクション 検索するテキスト 潜在的なアクション トラブルシューティングに役立ちます (例)
コンピューター情報 警告: ネットワーク ドライバーが古くなっている可能性があります オンラインで新しいドライバーを確認します。 さまざまな接続エラー
クライアント セキュリティとドライバー情報 Diffie-Hellman 暗号スイートが有効になっています。 アルゴリズムのバージョンがクライアントとサーバー間で異なる場合に、断続的な TLS エラーが発生する可能性があります 断続的な接続の問題が発生している場合は、「 Windows で SQL Server に接続するときに、アプリケーションで TLS 接続エラーが強制的に閉じられる」を参照してください。 既存の接続はリモート ホストに強制的に切断されました
クライアント セキュリティとドライバー情報 SQL エイリアス 存在する場合は、エイリアスが正しく構成され、正しいサーバーと IP アドレスを指していることを確認します。 SQL Server への接続を確立している間に、ネットワーク関連またはインスタンス固有のエラーが発生しました
SQL Server情報 関心のあるサービス SQL サービスが開始されていない場合は、開始します。 名前付きインスタンスへの接続に問題がある場合は、ブラウザー サービスSQL Server開始されていることを確認するか、ブラウザー サービスを再起動してみてください。 SQL Server への接続を確立している間に、ネットワーク関連またはインスタンス固有のエラーが発生しました
SQL Server情報 ドメイン サービス アカウントのプロパティ SQL Serverからリンク サーバーを構成し、[Del の信頼] の値が false に設定されている場合、リンク サーバー クエリで認証の問題が発生する可能性があります。 "ユーザーのログインに失敗しました" エラーのトラブルシューティング
SQL Server情報 SPN が存在しない この表を確認して、SQL Serverの SPN が適切に構成されているかどうかを確認し、特定された問題を修正します。 SSPI コンテキストを生成できません
SQL Server情報 SQL Server インスタンスの詳細 TCP Enabled、TCP ポートなどの値を確認します。 サーバー側で TCP/IP が有効になっているかどうか、および SQL の既定のインスタンスが 1433 または別のポートでリッスンしているかどうかを確認します。 さまざまな接続エラー

オプション 2

SQL Server コンピューターで SQLCHECK を実行できない場合は、詳細なトラブルシューティングを行う前に、次の項目をチェックできます。

  1. SQL Serverが開始され、SQL Serverエラー ログに次のメッセージが表示されていることを確認します。

    SQL Serverクライアント接続の準備ができました。 これは情報メッセージです。ユーザーアクションは必要ありません。

    PowerShell で次のコマンドを使用して、システム上のSQL Server サービスの状態をチェックします。

    Get-Service | Where {$_.status -eq 'running' -and $_.DisplayName -match "sql server*"}
    

    次のコマンドを使用して、エラー ログ ファイルで特定の文字列 "SQL Server がクライアント接続の準備ができました。 This is an informational message; no user action is required." (SQL Server はクライアント接続の準備ができました。これは情報メッセージです。ユーザー 操作は必要ありません。) という文字列を検索します。

    Get-ChildItem -Path "c:\program files\microsoft sql server\mssql*" -Recurse -Include Errorlog |select-string "SQL Server is now ready for client connections."
    
  2. IP アドレスとチェックに対する基本的な接続で異常が発生したかどうかを確認します。 ping -a <SQL Server machine>, ping -a <SQL Server IP address> 問題が発生した場合は、ネットワーク管理者と協力してください。 または、PowerShell でを使用 Test-NetConnection することもできます。

    $servername = "DestinationServer"
    Test-NetConnection -ComputerName $servername
    
  3. エラー ログを確認して、SQL Serverが適切なプロトコルでリッスンしているかどうかを確認します。

     Get-ChildItem -Path "c:\program files\microsoft sql server\mssql*" -Recurse -Include Errorlog |select-string "Server is listening on" , "ready to accept connection on" -AllMatches
    
  4. UDL ファイルを使用してSQL Serverに接続できるかどうかを確認します。 動作する場合は、接続文字列に問題がある可能性があります。 UDL テスト手順の手順については、「UDL ファイルを使用して OLE DB 接続をテストしてSQL Serverする」を参照してください。 または、次のスクリプトを使用して 、UDL-Test.udl ファイル ( %TEMP% フォルダーに格納) を作成して起動できます。

    clear
    
    $ServerName = "(local)"
    $UDL_String = "[oledb]`r`n; Everything after this line is an OLE DB initstring`r`nProvider=MSOLEDBSQL.1;Integrated Security=SSPI;Persist Security Info=False;User ID=`"`";Initial Catalog=`"`";Data Source=" + $ServerName + ";Initial File Name=`"`";Server SPN=`"`";Authentication=`"`";Access Token=`"`""
    
    Set-Content -Path ($env:temp + "\UDL-Test.udl") -Value $UDL_String -Encoding Unicode
    
    #open the UDL
    Invoke-Expression ($env:temp + "\UDL-Test.udl")
    
  5. 他のクライアント システムと異なるユーザー ログインからSQL Serverに接続できるかどうかを確認します。 可能であれば、問題が発生しているクライアントまたはログインに固有の問題である可能性があります。 問題のあるクライアントの Windows イベント ログで、より多くのポインターを確認します。 また、ネットワーク ドライバーが最新であるかどうかをチェックします。

  6. ログインエラーが発生している場合は、ログイン (サーバー プリンシパル) が存在し、CONNECT SQLログイン (サーバー プリンシパル) にSQL Serverアクセス許可があることを確認します。 さらに、ログインに割り当てられている既定のデータベースが正しいことを確認し、マップされたデータベース プリンシパル CONNECT にデータベースへのアクセス許可があることを確認します。 データベース プリンシパルにアクセス許可を付与 CONNECT する方法の詳細については、「 GRANT Database Permissions」を参照してください。 サーバー プリンシパルにアクセス許可を付与 CONNECT SQL する方法の詳細については、「 GRANT Server Permissions」を参照してください。 これらのアクセス許可を特定するには、次のスクリプトを使用します。

    clear
    ## replace these variables with the login, user, database and server 
    $server_principal = "CONTOSO\JaneK"  
    $database_principal = "JaneK"
    $database_name = "mydb"
    $server_name = "myserver"
    
    Write-Host "`n******* Server Principal (login) permissions *******`n`n"
    sqlcmd -E -S $server_name -Q ("set nocount on; SELECT convert(varchar(32),pr.type_desc) as login_type, convert(varchar(32), pr.name) as login_name, is_disabled,
      convert(varchar(32), isnull (pe.state_desc, 'No permission statements')) AS state_desc, 
      convert(varchar(32), isnull (pe.permission_name, 'No permission statements')) AS permission_name,
      convert(varchar(32), default_database_name) as default_db_name
      FROM sys.server_principals AS pr
      LEFT OUTER JOIN sys.server_permissions AS pe
        ON pr.principal_id = pe.grantee_principal_id
      WHERE is_fixed_role = 0 -- Remove for SQL Server 2008
      and name = '" + $server_principal + "'")
    
    Write-Host "`n******* Database Principal (user) permissions *******`n`n"
    sqlcmd -E -S $server_name -d $database_name -Q ("set nocount on; SELECT convert(varchar(32),pr.type_desc) as user_type, convert(varchar(32),pr.name) as user_name, 
      convert(varchar(32), isnull (pe.state_desc, 'No permission statements')) AS state_desc, 
      convert(varchar(32), isnull (pe.permission_name, 'No permission statements')) AS permission_name 
      FROM sys.database_principals AS pr
      LEFT OUTER JOIN sys.database_permissions AS pe
        ON pr.principal_id = pe.grantee_principal_id
      WHERE pr.is_fixed_role = 0
      and name = '" + $database_principal + "'")
    
    Write-Host "`n******* Server to Database Principal mapping ********`n"
    sqlcmd -E -S $server_name -d $database_name -Q ("exec sp_helplogins '" + $server_principal + "'")
    
  7. Kerberos 関連の問題のトラブルシューティングを行う場合は、「Kerberos 認証を使用してSQL Serverに接続しているかどうかを判断する」のスクリプトを使用して、SQL Server で Kerberos が適切に構成されているかどうかを判断できます。

一般的な接続の問題

前提条件とチェックリストを確認したら、 一般的な接続の問題 に関するページを参照し、対応するエラー メッセージを選択して、トラブルシューティングの詳細な手順を確認してください。