次の方法で共有


Azure SQL Database および Azure SQL Managed Instance の接続に関する問題とその他のエラーのトラブルシューティング

適用対象: Azure SQL データベース Azure SQL Managed Instance

Azure SQL Database または Azure SQL Managed Instance への接続に失敗すると、エラー メッセージが表示されます。

いつも通り、アプリケーションの設計プロセスで、ベスト プラクティスと設計のガイドラインを適用してください。

注意

Azure SQL 接続チェック ツールを使うと、Azure SQL Database、Azure SQL Managed Instance、Azure Synapse Analytics 環境でのさまざまな接続エラーを検出して修正できます。

一般的な接続に関する問題を修正するための手順

  1. アプリケーション サーバーで TCP/IP がクライアント プロトコルとして有効になっていることを確認します。 SQL ツールがインストールされていないアプリケーション サーバーでは、cliconfg.exe (SQL Server クライアント ネットワーク ユーティリティ) を実行して、TCP/IP が有効になっていることを確認します。

  2. アプリケーションの接続文字列を調べ、正しく構成されていることを確認します。 たとえば、接続文字列で正しいポート (1433) と完全修飾サーバー名が指定されていることを確認します。 「SQL Server Management Studio を使用した接続情報の取得」を参照してください。

  3. 接続タイムアウトの値を増やしてみます。 30 秒以上の接続タイムアウトを使用することをお勧めします。

  4. クイック スタート:SSMS を使用して Azure SQL データベースまたは Azure SQL Managed Instance に接続してクエリを実行する、UDL ファイル、ping、または telnet を使用して、アプリケーション サーバーと Azure SQL データベース間の接続をテストします。 詳細については、接続問題のトラブルシューティング接続問題の診断に関するページをご覧ください。

    注意

    トラブルシューティングの手順として、別のクライアント コンピューターでの接続をテストすることもできます。

  5. ベスト プラクティスとして、クラウドに接続されたアプリケーションでは再試行ロジックを使用する必要があります

これらの手順で問題が解決しない場合は、さらにデータを収集してから、サポートに連絡してみてください。 アプリケーションがクラウド サービスの場合は、ログ記録を有効にします。 この手順により、エラーの UTC タイムスタンプが返されます。 ログ記録を有効にする方法の詳細については、「Azure App Service でのアプリの診断ログの有効化」を参照してください。 さらに、SQL Database によりトレース ID が返されます。 Microsoft カスタマー サポート サービスはこの情報を使用できます。

再試行ロジックの実装

クライアント アプリケーションが再試行ロジックを使用することで、一時障害に自動的に修復する時間を確保した後、接続の再確立を試行できるようにすることをお勧めします。 最初に再試行する前に、5 秒間待つことをお勧めします。 5 秒未満で再試行すると、クラウド サービスに過度の負荷がかかるおそれがあります。 再試行するたびに、待ち時間を大幅に長くし、最大 60 秒待つ必要があります。

再試行ロジックのコード例については、以下のページを参照してください。

アプリケーションでの一時的エラーの処理に関する詳細は、「SQL Database と SQL Managed Instance の一時的な接続エラーのトラブルシューティング」を参照してください

ADO.NET を使用するクライアントのブロック期間については、「接続プール (ADO.NET)」をご覧ください。

一時的な障害のエラー メッセージ (40197、40613、その他)

Azure インフラストラクチャには、SQL Database サービス内で負荷の大きいワークロードが生じた場合に、サーバーを動的に再構成する機能があります。 この動的な動作によって、クライアント プログラムがデータベースやインスタンスへの接続を失うことがあります。 この種のエラーは、 「一時的な障害」 と呼ばれます。 データベースの再構成イベントは、計画されたイベント (ソフトウェアのアップグレードなど) または計画されていないイベント (プロセスのクラッシュ、負荷分散など) が原因で発生します。 ほとんどの再構成イベントは一時的であり、長くても 60 秒未満で完了します。 これらのイベントは、大規模なトランザクションによる実行時間の長い復旧など、場合によっては、完了に時間がかかることがあります。 次の表に、Azure SQL Database に接続するときにアプリケーションが受け取る可能性のあるさまざまな一時的エラーの一覧を示します。

一時的な障害のエラー コードの一覧

エラー コード 重大度 説明
926 14 Database 'replicatedmaster' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server error log for more information.

このエラーは、以前のプライマリによってログがシャットダウンされている間に、再構成の最終段階の短期間に SQL Managed Instance のエラー ログに記録されることがあります。
このエラー メッセージを含むその他の一時的ではないシナリオについては、MSSQL エラーのドキュメントを参照してください。
4060 16 Cannot open database "%.*ls" requested by the login. The login failed.

詳細については、エラー 4000 から 4999 を参照してください。
40197 17 The service has encountered an error processing your request. Please try again. Error code %d.

ソフトウェアやハードウェアのアップグレード、ハードウェアの障害、その他フェールオーバーに関する問題によってサービスがダウンしたときに、このエラーが発生します。 障害の種類や発生したフェールオーバーに関する詳細な情報は、エラー 40197 のメッセージに埋め込まれたエラー コード (%d) から得られます。 エラー 40197 のメッセージ内に埋め込まれているエラー コードは、40020、40143、40166、40540 などです。
再接続すると、自動的にデータベースの正常なコピーに接続されます。 アプリケーションでエラー 40197 をキャッチし、メッセージに埋め込まれているエラー コード (%d) をログに記録してトラブルシューティングに備えたうえで、リソースが復旧して接続が再度確立されるまで SQL Database への再接続を試みる必要があります。 詳細については、「一時エラー」を参照してください。
40501 20 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

詳しくは、以下をご覧ください。
リソース管理
DTU 購入モデルを使用したエラスティック プールのリソース制限
単一データベースに関する仮想コアベースの制限
エラスティック プールに関する仮想コアベースの制限
Azure SQL Managed Instance のリソースの制限
40613 17 Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'.

このエラーは、データベースに対して専用管理者接続 (DAC) が既に確立されている場合に発生する可能性があります。 詳細については、「一時エラー」を参照してください。
49918 16 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later.

詳しくは、以下をご覧ください。
リソース管理
DTU 購入モデルを使用したエラスティック プールのリソース制限
単一データベースに関する仮想コアベースの制限
エラスティック プールに関する仮想コアベースの制限
Azure SQL Managed Instance のリソースの制限
49919 16 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".

サービスが、サブスクリプションまたはサーバーに対する複数の作成または更新要求の処理でビジ―状態です。 現在、要求はリソースの最適化のためにブロックされています。 クエリ sys.dm_operation_status を実行して保留中の操作を確認します。 保留中の作成要求または更新要求が完了するまで待つか、いずれかの保留中の要求を削除して後で要求を再試行します。 操作が停止し、反応しなくなったように見える場合、他の進行中の操作が完了するまで待つか、可能な場合は取り消します。 たとえば、作成中のデータベースまたはレプリカを削除することでデータベース コピーまたは geo レプリカをキャンセルできることがあります。 明らかに動かなくなった操作をキャンセルできない場合、Microsoft のサポート チケットを使用してください
49920 16 Cannot process request. Too many operations in progress for subscription "%ld".

サービスが、このサブスクリプションに対する複数の要求の処理でビジー状態です。 現在、要求はリソースの最適化のためにブロックされています。 クエリ sys.dm_operation_status を実行して操作の状態を確認します。 保留中の要求が完了するまで待つか、いずれかの保留中の要求を削除して後で要求を再試行します。 操作が停止し、反応しなくなったように見える場合、他の進行中の操作が完了するまで待つか、可能な場合は取り消します。 たとえば、作成中のデータベースまたはレプリカを削除することでデータベース コピーまたは geo レプリカをキャンセルできることがあります。 明らかに動かなくなった操作をキャンセルできない場合、Microsoft のサポート チケットを使用してください
4221 16 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.

レプリカのリサイクル時に実行中だったトランザクションに行のバージョンがないため、レプリカはログインに使用できません。 この問題を解決するには、プライマリ レプリカのアクティブ トランザクションをロール バックするか、コミットします。 プライマリ上の長い書き込みトランザクションを避けることでこの状態が発生することを最小限に抑えられます。
615 21 Could not find database ID %d, name '%.*ls'

つまり、メモリ内キャッシュは SQL サーバー インスタンスと同期せず、古いデータベース ID が取得されます。

SQL ログインでは、メモリ内キャッシュを使用して、ID マッピングへのデータベース名を取得します。 キャッシュはバックエンド データベースと同期し、SQL サーバー インスタンスに対してデータベースのアタッチとデタッチが行われるたびに更新する必要があります。
このエラーは、デタッチ ワークフローが時間内にメモリ内キャッシュのクリーンアップに失敗し、データベースへの後続の参照が古いデータベース ID を指す場合に発生します。
リソースが使用可能になり接続が再確立されるまで、SQL データベースへの再接続を試してください。 詳細については、「一時エラー」を参照してください。

一時的な接続の問題を解決する手順

  1. アプリケーションがエラーを報告する時間帯に発生した既知の障害については、Microsoft Azure サービス ダッシュボードのページを参照してください。
  2. Azure SQL Database など、クラウド サービスに接続するアプリケーションは、定期的な再構成イベントを想定し、アプリケーション エラーをユーザーに示すのではなく、再試行ロジックを実装してこれらのエラーを処理します。
  3. データベースがリソースの制限に近づくと、一時的な接続の問題に見える場合があります。 リソース制限に関するページを参照してください。
  4. 接続の問題が解消されない場合、アプリケーションでのエラーの継続時間が 60 秒を超えた場合、または 1 日にエラーが複数回発生した場合は、 Azure サポート サイトの [サポートの要求] を選択して、サポート要求を送信してください。

この問題は、アプリケーションでサーバーに接続できない場合に発生します。

この問題を解決するには、「一般的な接続に関する問題を修正するための手順」セクションの手順を (示されている順に) 試してください。

サーバー/インスタンスが見つからなかったか、アクセスできませんでした (エラー 26、40、10053)

エラー 26:指定されたサーバーの位置を特定しているときにエラーが発生しました

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.(provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)

エラー 40:サーバーへの接続を開けませんでした

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

エラー 10053:サーバーから結果を受信しているときに、トランスポート レベルのエラーが発生しました

10053: A transport-level error has occurred when receiving results from the server. (Provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine)

これらの問題は、アプリケーションでサーバーに接続できない場合に発生します。

これらの問題を解決するには、「一般的な接続に関する問題を修正するための手順」セクションの手順を (示されている順に) 試してください。

ファイアウォールの問題のため、サーバーに接続できません

エラー 40615: < servername > に接続できません

この問題を解決するには、Azure portal 経由で SQL Database のファイアウォール設定を構成します

エラー 5: < servername > に接続できません

この問題を解決するには、クライアントとインターネット間のすべてのファイアウォールで、送信接続用にポート 1433 が開いていることを確認します。

サーバーにログインできません (エラー 18456、40531)

ユーザー '< User name >' はログインできませんでした

Login failed for user '<User name>'.This session has been assigned a tracing ID of '<Tracing ID>'. Provide this tracing ID to customer support when you need assistance. (Microsoft SQL Server, Error: 18456)

この問題を解決するには、サービス管理者に連絡し、有効なユーザー名とパスワードを提供するよう依頼してください。

通常、サービス管理者は、次の手順を使用してログイン資格情報を追加します。

  1. SQL Server Management Studio (SSMS) を使用して、サーバーにログインします。

  2. ログイン名が無効になっているかどうかを確認するには、master データベースで次の SQL クエリを実行します。

    SELECT name, is_disabled FROM sys.sql_logins;
    
  3. 対応する名前が無効になっている場合は、次のステートメントを使用して有効にすることができます。

    ALTER LOGIN <User name> ENABLE;
    
  4. SQL ログイン ユーザー名が存在しない場合は、次の SQL クエリを編集して実行し、新しい SQL ログインを作成します。

    CREATE LOGIN <SQL_login_name, sysname, login_name>
    WITH PASSWORD = '<password, sysname, Change_Password>';
    GO
    
  5. SSMS オブジェクト エクスプローラーで、 [データベース] を展開します。

  6. ユーザーにアクセス許可を付与するデータベースを選択します。

  7. [セキュリティ] を右クリックし、 [New](新規)[ユーザー] を選択します。

  8. プレースホルダーを含むスクリプトで、手順に従い、SSMS テンプレート パラメーターを置き換え、実行します。例を次に示します。

    CREATE USER [<user_name, sysname, user_name>]
    FOR LOGIN [<login_name, sysname, login_name>]
    WITH DEFAULT_SCHEMA = [<default_schema, sysname, dbo>];
    GO
    
    -- Add user to the database owner role
    EXEC sp_addrolemember N'db_owner', N'<user_name, sysname, user_name>';
    GO
    

    sp_addrolemember を使用して、特定のユーザーを特定のデータベース ロールにマップすることもできます。

    注意

    Azure SQL Database では、データベース ロールのメンバーシップを管理するために、より新しい ALTER ROLE 構文を検討してください。

詳細については、「データベースへのアクセスを承認する」を参照してください。

接続のタイムアウト エラー

System.Data.SqlClient.SqlException (0x80131904):接続がタイムアウトしました

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=3; handshake=29995;

System.Data.SqlClient.SqlException (0x80131904):タイムアウトに達しました

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

System.Data.Entity.Core.EntityException:基になるプロバイダーがオープンで失敗しました

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. -> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. -> System.ComponentModel.Win32Exception: The wait operation timed out

< server name > に接続できません

Cannot connect to <server name>.ADDITIONAL INFORMATION:Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=231; handshake=983; [Login] initialization=0; authentication=0; [Post-Login] complete=13000; (Microsoft SQL Server, Error: -2) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=-2&LinkId=20476 The wait operation timed out

これらの例外は、接続またはクエリの問題が原因で発生する可能性があります。 このエラーが接続の問題によって発生したことを確認するには、「エラーの原因が接続の問題かどうかを確認する」を参照してください。

接続のタイムアウトは、アプリケーションでサーバーに接続できないために発生します。 この問題を解決するには、「一般的な接続に関する問題を修正するための手順」セクションの手順を (示されている順に) 試してください。

ネットワーク接続終了エラー

SQL クライアント ライブラリは、TCP ネットワーク プロトコルを使用して、Azure SQL Database と Azure SQL Managed Instance に接続されます。 クライアント ライブラリでは、TCP プロバイダーと呼ばれる下位レベルのコンポーネントを使用して、TCP 接続を管理します。 リモート ホストで既存の TCP 接続が予期せず終了したことが TCP プロバイダーで検出されると、クライアント ライブラリでエラーが発生します。 そのエラーはクライアントのエラーであり、SQL サーバーのエラーではないため、SQL エラー番号は含まれません。 代わりに、エラー番号は 0 で、TCP プロバイダーからのエラー メッセージが使用されます。

例として、次のようなネットワーク接続終了エラーが挙げられます。

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) An existing connection was forcibly closed by the remote host

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following: the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

データベースまたはエラスティック プールが一時的に使用できないことが原因で、接続終了エラーが発生することがあります。 また、ファイアウォール、ネットワーク アプライアンスなど、データベース サーバーとクライアント アプリケーションの間のネットワーク インフラストラクチャのさまざまな問題が原因で発生することもあります。これらの問題は、一時的である場合もあれば、永続的である場合もあります。 一般的なガイダンスとして、アプリケーションでは、それらを永続的なエラーと見なす前に、そのようなエラーに対して固定された数の再試行回数を使用することをお勧めします。

リソース ガバナンス エラー

Azure SQL Database では、Resource Governor に基づくリソース ガバナンスの実装を使用して、リソース制限を適用します。 Azure SQL Database でのリソース管理について詳細を確認してください。

最初に、最も一般的なリソース ガバナンスのエラーを、詳細と共に列挙します。それに続いて、リソース ガバナンスのエラー メッセージの表を示します。

エラー 10928 と 10936: リソース ID : 1。 [データベースまたはエラスティック プール] の要求制限 %d に達しました

データベース レベルの制限に達すると、この場合の詳細なエラー メッセージは次のようになります。Resource ID : 1. The request limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

エラスティック プールの制限に達すると、この場合の詳細なエラー メッセージは次のようになります。Resource ID : 1. The request limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. エラスティック プールの制限はデータベースの制限より高くなっています。詳しくは、「リソース制限」を参照してください。 プール内の複数のデータベースでリソース (ワーカーなど) が同時に使用される場合、制限が適用される場合があります。

このエラー メッセージは、データベースまたはエラスティック プールのワーカーの制限に達したことを示しています。 プレースホルダー %d の代わりに、データベースまたはエラスティック プールのサービス目標の最大同時実行ワーカー数の値が示されます。

注意

初期の Azure SQL Database では、シングル スレッド クエリのみがサポートされていました。 そのときは、要求の数は常にワーカーの数と同じでした。 Azure SQL Database のエラー メッセージ 10928 と 10936 には、下位互換性のために "要求制限 [...] が N に達しました" という文言が含まれています。 制限に達したのは、実際にはワーカーの数です。 並列処理の最大度 (MAXDOP) の設定値が 0 または 1 より大きい場合、ワーカーの数は要求の数よりもはるかに多くなる可能性があり、MAXDOP が 1 の場合よりもはるかに早く制限に達することがあります。

セッション、ワーカー、要求の詳細を確認してください。

必要な場合は専用管理者接続 (DAC) で接続する

ワーカーの制限に近づいているか、到達したライブ インシデントが進行中の場合は、SQL Server Management Studio (SSMS) または Azure Data Studio を使用して接続するときにエラー 10928 が表示される可能性があります。 ワーカーの最大しきい値に達した場合でも、データベース管理者用の診断接続 (DAC) を使用して 1 つのセッションで接続できます。

SSMS から DAC との接続を確立するには:

  • メニューから [ファイル] > [新規] > [データベース エンジン クエリ] の順に選択します
  • [サーバー名] フィールドの [接続] ダイアログ ボックスで、admin:<fully_qualified_server_name> を入力します (admin:servername.database.windows.net など)。
  • [オプション >>] を選択します
  • [接続プロパティ] タブを選択します
  • [データベースへの接続:] ボックスに、データベースの名前を入力します
  • [接続] を選択します。

エラー 40613、Database '%.&#x2a;ls' on server '%.&#x2a;ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '%.&#x2a;ls'、が表示される場合、これは、既に別のセッションが DAC に接続されていることを示している可能性があります。 1 つのデータベースまたはエラスティック プールのための DAC に一度に接続できるセッションは 1 つだけです。

[接続] の選択後に "サーバーに接続できませんでした" というエラーが発生したとしても、バージョンが 18.9 より前のバージョンの SSMS を使用している場合は、DAC セッションが正常に確立されている可能性があります。 初期バージョンの SSMS では、DAC への接続に Intellisense を提供しようとしていました。 DAC でサポートしているのは 1 つのワーカーのみで、Intellisense には別のワーカーが必要なため、これは失敗しました。

SSMS では、オブジェクト エクスプローラーで DAC 接続を使用することはできません。

max_worker_percent の使用状況を確認する

データベースのリソース消費量統計を 14 日間分見つけるには、sys.resource_stats システム カタログ ビューに対してクエリを実行します。 max_worker_percent 列には、データベースのワーカーの制限に関連して、使用されているワーカーの割合が示されます。 論理サーバー上の master データベースに接続し、sys.resource_stats に対してクエリを実行します。

SELECT start_time, end_time, database_name, sku, avg_cpu_percent, max_worker_percent, max_session_percent 
FROM sys.resource_stats;

sys.dm_db_resource_stats 動的管理ビューから、過去 1 時間のリソース消費量統計のクエリを実行することもできます。 データベースに直接アクセスして sys.dm_db_resource_stats のクエリを実行します。

SELECT end_time, avg_cpu_percent, max_worker_percent, max_session_percent
FROM sys.dm_db_resource_stats;

可能な場合はワーカーの使用量を削減する

ブロッキング チェーンにより、データベース内のワーカーの数が急激に増加する場合があります。 同時並列クエリが大量にあると、多数のワーカーを発生させる可能性があります。 並列処理の最大限度 (MAXDOP) を増やしたり、MAXDOP を 0 に設定したりすると、アクティブなワーカーの数が増加する可能性があります。

以下の手順に従って、ワーカー数が不十分であることによるインシデントをトリアージします。

  1. ブロッキングが発生しているか、大量の同時実行ワーカーを識別できるかを調査します。 次のクエリを実行して現在の要求を調べ、データベースがエラー 10928 を返しているときにブロッキングがないか調べます。 クエリを実行するには、専用管理者接続 (DAC) に接続する必要がある場合があります。

    SELECT
        r.session_id, r.request_id, r.blocking_session_id, r.start_time, 
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        (SELECT COUNT(*) 
            FROM sys.dm_os_tasks AS t 
            WHERE t.session_id=r.session_id and t.request_id=r.request_id) AS worker_count,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1;
    GO
    
    1. ブロックされているセッションを識別するため、blocking_session_id が含まれる行を探します。 一覧でそれぞれの blocking_session_id を探し、そのセッションもブロックされているかどうかを判断します。 blocking_session_id および session_id 値の後、ヘッド ブロッカー (ブロックされておらず、ブロックの要因となるセッション) が発生します。 ヘッド ブロッカー クエリを調整します。

      ヒント

      実行時間の長いまたはブロックしているクエリのトラブルシューティングの詳細については、「Azure SQL Database のブロックの問題の概要と解決策」を参照してください。

    2. 大量の同時実行ワーカーを識別するには、要求全体の数と、各要求の worker_count 列を確認します。 Worker_count はサンプリングされた時点でのワーカーの数であり、要求が実行されるにつれて時間の経過とともに変化する可能性があります。 ワーカー増加の原因が、最適な程度の並列処理で実行されている同時実行クエリである場合は、リソースの使用率を下げるためにクエリを調整します。 詳しくは、「クエリの調整とヒント」をご覧ください。

  2. データベースの並列処理の最大限度 (MAXDOP) 設定を評価します。

ワーカーの最大数を増やす

ブロッキングへの対処、クエリの最適化、MAXDOP 設定の検証を行っているにもかかわらず、データベースまたはエラスティック プールのワーカー数が絶えず制限に達する場合は、データベースまたはエラスティック プールをスケールアップし、ワーカーの最大数を増やすことを検討してください。

サービス レベルとコンピューティング サイズごとに、Azure SQL Database のリソース制限を確認してください。

Azure SQL Database でのワーカーのリソース ガバナンスに関する詳細を確認してください。

エラー 10929:リソース ID:1

10929: Resource ID: 1. The %s minimum guarantee is %d, maximum limit is %d and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. See http://go.microsoft.com/fwlink/?LinkId=267637 for assistance. Otherwise, please try again later.

エラー 40501:サービスは現在ビジー状態です

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

エラー 40501 は、リソースの制限を超えていることを示すエンジン調整エラーです。

リソース制限の詳細については、「Azure SQL データベースのリソース管理」を参照してください。

エラー 40544:データベースのサイズ クォータに達しました

40544: The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Incident ID: <ID>. Code: <code>.

このエラーは、データベースのサイズ クォータに達したときに発生します。

以下の手順は、問題を回避したり、より多くのオプションを提供したりするのに役立つ場合があります。

  1. Azure portal のダッシュボードを使用して、データベースの現在のサイズを確認します。

    注意

    最も多くの領域を消費しているため、クリーンアップの候補となるテーブルを特定するには、次の SQL クエリを実行します。

    SELECT o.name,
     SUM(p.row_count) AS 'Row Count',
     SUM(p.reserved_page_count) * 8.0 / 1024 AS 'Table Size (MB)'
    FROM sys.objects o
    JOIN sys.dm_db_partition_stats p on p.object_id = o.object_id
    GROUP BY o.name
    ORDER BY [Table Size (MB)] DESC;
    GO
    
  2. 現在のサイズが、使用しているエディションでサポートされている最大サイズを超えていない場合は、ALTER DATABASE を使用して MAXSIZE の設定を増やすことができます。

  3. データベースが、使用しているエディションでサポートされている最大サイズを既に超えている場合は、次の 1 つまたは複数の手順を試してください。

    • 通常のデータベース クリーンアップ アクティビティを実行します。 たとえば、truncate/delete を使用して不要なデータをクリーンアップしたり、SQL Server Integration Services (SSIS) または一括コピー プログラム (bcp) ユーティリティを使用してデータを移動したりします。
    • データをパーティション分割するか、データを削除するか、インデックスを削除してください。その他の解決方法についてはドキュメントを参照してください。
    • データベースのスケーリングについては、単一データベースのリソースのスケーリングに関する記事と、エラスティック プールのリソースのスケーリングに関する記事を参照してください。

エラー 40549:トランザクションが長時間実行されているため、セッションを終了しました

40549: Session is terminated because you have a long-running transaction. Try shortening your transaction.

このエラー メッセージが繰り返し表示される場合は、これらの手順に従って問題を解決してみてください。

  1. 次のクエリを実行して、開いているセッションのうち、duration_ms 列の値が高いものをすべて表示します。

    SELECT
        r.start_time, DATEDIFF(ms,start_time, SYSDATETIME()) as duration_ms, 
        r.session_id, r.request_id, r.blocking_session_id,  
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1
    ORDER BY start_time ASC;
    GO
    

    input_buffer 列に sys.fn_MSxe_read_event_stream から読み取るクエリが表示される行は、無視することもできます。これらの要求は、拡張イベント セッションに関連しています。

  2. blocking_session_id 列を調べて、ブロッキングが実行時間の長いトランザクションの原因となっているかどうかを確認します。

    注意

    Azure SQL Database におけるブロッキングのトラブルシューティングの詳細については、「Azure SQL Database のブロックの問題の概要と解決策」を参照してください。

  3. クエリをバッチ処理することを検討してください。 バッチ処理に関する詳細は、「バッチ処理を使用して Azure SQL データベースと Azure SQL Managed Instance アプリケーションのパフォーマンスを強化する方法」を参照してください。

エラー 40551: tempdb の使用量が多すぎるため、セッションを終了しました

40551: The session has been terminated because of excessive TEMPDB usage. Try modifying your query to reduce the temporary table space usage.

この問題を回避するには、次の手順に従ってください。

  1. クエリを変更して、一時テーブル領域の使用量を減らします。
  2. 不要になった一時オブジェクトを削除します。
  3. テーブルを切り捨てるか、使用されていないテーブルを削除します。

エラー 40552:トランザクション ログの使用領域が多すぎるため、セッションを終了しました

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

この問題を解決するには、次の方法を試してください。

  • この問題は、挿入、更新、または削除の各操作が原因で発生する可能性があります。 バッチ処理を実装したり、複数の小さなトランザクションに分割したりして、すぐに操作される行の数を減らしてみてください。
  • この問題は、インデックスの再構築操作によって発生する可能性があります。 この問題を回避するには、テーブルで影響を受ける行の数 * (更新されるフィールドの平均サイズ (バイト単位) + 80) < 2 ギガバイト (GB) であることを確認します。
  • インデックスの再構築の場合は、更新されるフィールドの平均サイズを、平均インデックス サイズに置き換える必要があります。
  • 詳細については、「 Azure SQL Database でのフル トランザクション ログのトラブルシューティング」と「Azure SQL Managed Instance でのフル トランザクション ログのトラブルシューティング」を参照してください。

エラー 40553:メモリの使用量が多すぎるため、セッションを終了しました

40553: The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

この問題を回避するには、クエリを最適化してみてください。

詳細なトラブルシューティング手順については、「クラウドでクエリが正常に実行されているか」を参照してください。

他のメモリ不足エラーおよびサンプル クエリについて詳しくは、「Azure SQL Database によるメモリ不足エラーのトラブルシューティング」を参照してください。

リソース ガバナンスのエラー メッセージの表

エラー コード 重大度 説明
10928 20 Resource ID: %d. The %s limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

リソース ID は、制限に達したリソースを示します。 リソース ID = 1 の場合、これはワーカーの制限に達したことを示しています。 「エラー 10928: リソース ID: 1。データベースの要求制限 %d に達しました」で詳細を確認してください。リソース ID = 2 の場合、これはセッションの制限に達したことを示しています。
リソース制限のその他については、次を参照してください。
Azure SQL データベースでのリソース管理
DTU 購入モデルのリソース制限
単一データベースに関する仮想コアベースの制限
Azure SQL Managed Instance のリソースの制限
10936 20 Resource ID: %d. The %s limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

リソース ID は、制限に達したリソースを示します。 リソース ID = 1 の場合、これはワーカーの制限に達したことを示しています。 「エラー 10936: リソース ID: 1。エラスティック プールの要求制限 %d に達しました」で詳細を確認してください。 リソース ID = 2 の場合、これはセッションの制限に達したことを示しています。
リソース制限のその他については、次を参照してください。
Azure SQL データベースでのリソース管理
DTU 購入モデルを使用したエラスティック プールのリソース制限
エラスティック プールに関する仮想コアベースの制限
Azure SQL Managed Instance のリソースの制限
10929 20 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

リソース ID は、制限に達したリソースを示します。 ワーカー スレッドの場合、リソース ID = 1 となります。 セッションの場合、リソース ID = 2 です。 詳しくは、以下をご覧ください。
Azure SQL データベースでのリソース管理
DTU 購入モデルを使用したエラスティック プールのリソース制限
単一データベースに関する仮想コアベースの制限
エラスティック プールに関する仮想コアベースの制限
Azure SQL Managed Instance のリソースの制限
その他の場合は、後でもう一度やり直してください。
40544 20 The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.

データベースのスケーリングについては、単一データベースのリソースのスケーリングに関する記事と、エラスティック プールのリソースのスケーリングに関する記事を参照してください。
40549 16 Session is terminated because you have a long-running transaction. Try shortening your transaction.

バッチ処理に関する詳細は、「バッチ処理を使用して Azure SQL データベースと Azure SQL Managed Instance アプリケーションのパフォーマンスを強化する方法」を参照してください。
40550 16 The session has been terminated because it has acquired too many locks. Try reading or modifying fewer rows in a single transaction.

バッチ処理に関する詳細は、「バッチ処理を使用して Azure SQL データベースと Azure SQL Managed Instance アプリケーションのパフォーマンスを強化する方法」を参照してください。
40551 16 The session has been terminated because of excessive tempdb usage. Try modifying your query to reduce the temporary table space usage.

一時オブジェクトを使用している場合は、セッションで不要となった一時オブジェクトを削除して tempdb データベースの領域を節約してください。 SQL Database での tempdb の制限について詳しくは、「SQL Database の Tempdb データベース」を参照してください。
40552 16 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

バッチ処理に関する詳細は、「バッチ処理を使用して Azure SQL データベースと Azure SQL Managed Instance アプリケーションのパフォーマンスを強化する方法」を参照してください。
bcp.exe ユーティリティまたは System.Data.SqlClient.SqlBulkCopy クラスを使用して一括挿入を実行する場合は、1 回のトランザクションでサーバーにコピーされる行数を -b batchsize オプションまたは BatchSize オプションで制限してください。 ALTER INDEX ステートメントでインデックスを再構築する場合は、REBUILD WITH ONLINE = ON オプションの使用を検討してください。 仮想コア購入モデルのトランザクションログサイズの情報については、次を参照してください。
単一データベースに関する仮想コアベースの制限
エラスティック プールに関する仮想コアベースの制限
Azure SQL Managed Instance のリソースの制限
40553 16 The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Transact-SQL コード内の ORDER BY 操作と GROUP BY 操作の数を減らすことで、クエリのメモリ要件を抑えられます。 データベースのスケーリングについては、単一データベースのリソースのスケーリングに関する記事と、エラスティック プールのリソースのスケーリングに関する記事を参照してください。 メモリ不足エラーおよびサンプル クエリについて詳しくは、「Azure SQL Database によるメモリ不足エラーのトラブルシューティング」を参照してください。

エラスティック プールのエラー

次のエラーは、エラスティック プールの作成と使用に関連しています。

エラー コード 重大度 説明 是正措置
1132 17 The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (%d) MBs.

エラスティック プールの記憶域が上限に達したときに、データベースにデータを書き込もうとしています。 リソース制限の情報については、次を参照してください。
DTU 購入モデルを使用したエラスティック プールのリソース制限
エラスティック プールに関する仮想コアベースの制限
可能であれば、エラスティック プールの DTU を増やすかストレージを追加して、その記憶域の上限を上げることを検討するか、エラスティック プール内の個々のデータベースで使用される記憶域を減らすか、あるいはエラスティック プールからデータベースを削除してください。 エラスティック プールのスケーリングについては、エラスティック プールのリソースのスケーリングに関する記事を参照してください。 データベースから未使用領域を削除する方法の詳細については、「Azure SQL Database でデータベースのファイル領域を管理する」を参照してください。
10929 16 The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

リソース制限の情報については、次を参照してください。
エラスティック プールの DTU リソース制限
エラスティック プールに関する仮想コアベースの制限
その他の場合は、後でもう一度やり直してください。 データベースあたりの DTU/仮想コア最小値、データベースあたりの DTU/仮想コア最大値。 エラスティック プール内のすべてのデータベースにわたる同時実行ワーカーの合計数が、プールの制限を超えようとしました。
可能であれば、エラスティック プールの DTU または仮想コアを増やしてワーカーの上限を上げることを検討するか、エラスティック プールからデータベースを削除してください。
40844 16 Database '%ls' on Server '%ls' is a '%ls' edition database in an elastic pool and cannot have a continuous copy relationship. 該当なし
40857 16 Elastic pool not found for server: '%ls', elastic pool name: '%ls'. Specified elastic pool does not exist in the specified server. 有効なエラスティック プール名を指定してください。
40858 16 Elastic pool '%ls' already exists in server: '%ls'. Specified elastic pool already exists in the specified server. 新しいエラスティック プール名を指定してください。
40859 16 Elastic pool does not support service tier '%ls'. Specified service tier is not supported for elastic pool provisioning. 正しいエディションを指定するか、既定のサービス階層を使用する場合はサービス階層を空のままにしてください。
40860 16 Elastic pool '%ls' and service objective '%ls' combination is invalid. Elastic pool and service tier can be specified together only if resource type is specified as 'ElasticPool'. エラスティック プールとサービス レベルの適切な組み合わせを指定してください。
40861 16 The database edition '%.*ls' cannot be different than the elastic pool service tier which is '%.*ls'. The database edition is different than the elastic pool service tier. エラスティック プールのサービス階層と異なるデータベース エディションを指定しないでください。 データベースのエディションを指定する必要はありません。
40862 16 Elastic pool name must be specified if the elastic pool service objective is specified. Elastic pool service objective does not uniquely identify an elastic pool. エラスティック プールのサービス目標を使用する場合は、エラスティック プール名を指定してください。
40864 16 The DTUs for the elastic pool must be at least (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool below the minimum limit. エラスティック プールの DTU を最小値以上に設定し直してください。
40865 16 The DTUs for the elastic pool cannot exceed (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool above the maximum limit. エラスティック プールの DTU を最大値を超えないように設定し直してください。
40867 16 The DTU max per database must be at least (%d) for service tier '%.*ls'. Attempting to set the DTU max per database below the supported limit. 目的の設定をサポートするエラスティック プールのサービス階層を使用することをご検討ください。
40868 16 The DTU max per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU max per database beyond the supported limit. 目的の設定をサポートするエラスティック プールのサービス階層を使用することをご検討ください。
40870 16 The DTU min per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU min per database beyond the supported limit. 目的の設定をサポートするエラスティック プールのサービス階層を使用することをご検討ください。
40873 16 The number of databases (%d) and DTU min per database (%d) cannot exceed the DTUs of the elastic pool (%d). Attempting to specify DTU min for databases in the elastic pool that exceeds the DTUs of the elastic pool. エラスティック プールの DTU を増やすか、データベースあたりの DTU 最小値を減らす、またはエラスティック プール内のデータベース数を減らすことをご検討ください。
40877 16 An elastic pool cannot be deleted unless it does not contain any databases. The elastic pool contains one or more databases and therefore cannot be deleted. エラスティック プールからデータベースを削除して、エラスティック プールを削除してください。
40881 16 The elastic pool '%.*ls' has reached its database count limit. The database count limit for the elastic pool cannot exceed (%d) for an elastic pool with (%d) DTUs. Attempting to create or add database to elastic pool when the database count limit of the elastic pool has been reached. 可能であれば、エラスティック プールの DTU を増やして、データベースの上限を上げることを検討するか、エラスティック プールからデータベースを削除してください。
40889 16 The DTUs or storage limit for the elastic pool '%.*ls' cannot be decreased since that would not provide sufficient storage space for its databases. Attempting to decrease the storage limit of the elastic pool below its storage usage. エラスティック プール内の個々のデータベースの記憶域使用率を減らすことを検討するか、その DTU または記憶域の上限を下げるためにプールからデータベースを削除してください。
40891 16 The DTU min per database (%d) cannot exceed the DTU max per database (%d). Attempting to set the DTU min per database higher than the DTU max per database. データベースあたりの DTU の最小値がデータベースあたりの DTU 最大値を超えていないことをご確認ください。
TBD 16 The storage size for an individual database in an elastic pool cannot exceed the max size allowed by '%.*ls' service tier elastic pool. The max size for the database exceeds the max size allowed by the elastic pool service tier. データベースの最大サイズを、エラスティック プールのサービス階層によって許可されている最大サイズの制限内に設定してください。

このログインで要求されたデータベース "master" を開けません。 ログインに失敗しました

この問題は、アカウントに master データベースにアクセスするアクセス許可がないために発生します。 しかし、既定では、SQL Server Management Studio (SSMS) で master データベースへの接続が試行されます。

この問題を解決するには、次の手順に従ってください。

  1. SSMS のログイン画面で [オプション] を選択してから、 [接続プロパティ] を選択します。

  2. [データベースに接続] フィールドで、既定のログイン データベースとしてユーザーの既定のデータベース名を入力し、 [接続] を選択します。

    SSMS の [接続] ダイアログで、[接続プロパティ] タブを示すスクリーンショット。

読み取り専用エラー

読み取り専用のデータベースに書き込もうとすると、エラーが発生します。 状況によっては、データベースが読み取り専用状態になっている原因が、すぐにわからないことがあります。

エラー 3906: データベース 'databaseName' を更新できませんでした。データベースが読み取り専用です。

読み取り専用データベースを変更しようとすると、次のエラーが発生します。

Msg 3906, Level 16, State 2, Line 1
Failed to update database "%d" because the database is read-only.

データベースが読み取り専用である理由については、複数の要因が考えられます。

手動フェールオーバー後も、アプリケーションは引き続き古いレプリカに接続しています

Azure SQL Database では、別のレプリカへのフェールオーバー後も、DNS が原因でアプリケーションが以前のプライマリ レプリカに接続している可能性があります。 フェールオーバー グループの接続ルーティングは、DNS を使用して実装されます。

考えられる根本原因

  1. フェールオーバー中、フェールオーバー グループ エンドポイントは、適切な DNS エントリのターゲットを変更することで、適切な新しいプライマリ サーバーと新しいセカンダリ サーバーを指すよう更新されます。 既定では、DNS エントリは TTL が 30 秒で作成されます。つまり、DNS クライアントはこれらのエントリを 30 秒間キャッシュします。 その結果、DNS レコードの更新はすぐに反映されません。エントリは、すべてのクライアントと中間ノードがキャッシュを更新するまで以前の状態のままです。 そのため、フェールオーバー後、フェールオーバー グループ エンドポイントへのログインが新しいターゲットにルーティングされるまでの時間は、(ネットワーク トポロジに応じて) 0 から約 10 分となります。 DNS 要求に応答する中間ネットワーク ノードも DNS の結果を一定期間キャッシュするため、DNS キャッシュのフラッシュは問題解決に役立つ場合もあれば、役に立たない場合もあります。

    この問題の推奨される回避策は、クライアントで DNS エントリが更新されるまで待機することです。 現時点では、この回避策により、問題は 10 分以内に自己解決されます。

  2. 一部の SQL クライアント ライブラリでは、"接続プール" と呼ばれる機能を使用します。この機能は、接続を閉じて再度開くのではなく、新しいデータベース接続が必要になったときに同じデータ ソースへの接続を再利用します。 特に、ADO.NET では、既定で接続プールが有効になります。 1) で説明した問題と組み合わせると、接続プーリングにより新しく開いた接続が古いデータベースへの接続を再利用するため、アプリケーションが新しいプライマリ データベースにずっと接続できなくなる場合があります。

ソリューション

フェールオーバー グループのフェールオーバー後に、この DNS 問題に対して考えられる回避策は 3 つあります。

  1. "読み取り専用" エラー発生時に SQLConnection.ClearAllPools または SQLConnection.ClearPool(conn) を呼び出すアプリケーションを変更します。
  2. アプリケーション 接続文字列で、Pooling=False を接続プールを無効にするように指定します。 アプリケーションが頻繁に接続を開いて閉じるとパフォーマンスに大きな影響を与える可能性があるため、これをテストする必要があります。
  3. DNS レプリケーション/キャッシュの遅延を回避するもう 1 つのオプションは、3906 が発生した後の一定期間、Azure SQL Database の論理サーバー名 (以前のセカンダリ サーバー、現在は新しいプライマリ) を使用して直接接続することです。

読み取り専用レプリカに接続されている可能性がある

Azure SQL Database と Azure SQL Managed Instance のどちらの場合も、読み取り専用レプリカのデータベースに接続されている可能性があります。 この場合、DATABASEPROPERTYEX() 関数を使って次のクエリを行うと、READ_ONLY が返されます。

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');
GO

SQL Server Management Studio を使用して接続している場合、接続オプションの [追加の接続パラメーター] タブで ApplicationIntent=ReadOnly を指定しているかどうかを確認します。

接続文字列を使ってアプリケーションまたはクライアントから接続している場合は、接続文字列で ApplicationIntent=ReadOnly が指定されているかどうかを確認します。 詳しくは、「読み取り専用レプリカに接続する」をご覧ください。

データベースが読み取り専用に設定されている可能性がある

Azure SQL Database を使っている場合は、データベース自体が読み取り専用に設定されている可能性があります。 データベースの状態は、次のクエリを使って確認できます。

SELECT name, is_read_only
FROM sys.databases
WHERE database_id = DB_ID();

Azure SQL Database のデータベースの読み取り専用状態は、ALTER DATABASE Transact-SQL を使って変更できます。 現在、マネージド インスタンスのデータベースを読み取り専用に設定することはできません。

エラーの原因が接続の問題かどうかを確認する

接続の問題が原因でエラーが発生しているかどうかを確認するには、次のような接続を開くための呼び出しを示すフレームのスタック トレースを確認します (SqlConnection クラスへの参照に注意)。

System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at AzureConnectionTest.Program.Main(String[] args)
ClientConnectionId:<Client connection ID>

クエリの問題によって例外がトリガーされた場合、次のような呼び出し履歴が表示されます (SqlCommand クラスへの参照に注意)。 このような場合は、クエリを調整します。

  at System.Data.SqlClient.SqlCommand.ExecuteReader()
  at AzureConnectionTest.Program.Main(String[] args)
  ClientConnectionId:<Client ID>

パフォーマンスの微調整に関して詳しくは、以下のリソースを参照してください。