SQL Database の接続に関する問題と一時的なエラーに対応するWorking with SQL Database connection issues and transient errors

この記事では、クライアント アプリケーションが Azure SQL Database とやり取りする際に発生する接続エラーと一時エラーを防止、トラブルシューティング、診断、軽減する方法について説明します。This article describes how to prevent, troubleshoot, diagnose, and mitigate connection errors and transient errors that your client application encounters when it interacts with Azure SQL Database. 再試行ロジックの構成方法、接続文字列の作成方法、およびその他の接続設定の調整方法について説明します。Learn how to configure retry logic, build the connection string, and adjust other connection settings.

一時エラー (一過性の障害)Transient errors (transient faults)

一時エラーは、一過性の障害とも呼ばれ、基になる原因はすぐ自動的に解決されます。A transient error, also known as a transient fault, has an underlying cause that soon resolves itself. 一時エラーを起こす偶発的原因として、Azure システムが、各種ワークロードの負荷分散を行うために行うハードウェア リソースの瞬間的切り替えがあります。An occasional cause of transient errors is when the Azure system quickly shifts hardware resources to better load-balance various workloads. この再構成イベントのほとんどは 60 秒以内に完了します。Most of these reconfiguration events finish in less than 60 seconds. この再構成の進行中、SQL Database への接続の問題が発生する場合があります。During this reconfiguration time span, you might have connectivity issues to SQL Database. SQL Database に接続するアプリケーションは、これらの一時エラーを想定して構築する必要があります。Applications that connect to SQL Database should be built to expect these transient errors. これに対処するには、アプリケーション エラーとしてユーザーに表示するのではなく、コードに再試行ロジックを実装します。To handle them, implement retry logic in their code instead of surfacing them to users as application errors.

クライアント プログラムで ADO.NET を使用している場合、SqlException のスローによって一時エラーが報告されます。If your client program uses ADO.NET, your program is told about the transient error by the throw of SqlException. SQL Database クライアント アプリケーションの SQL エラー コードに関するの記事の冒頭付近に一時エラーの一覧があります。この表のエラー番号と Number プロパティを比較してください。Compare the Number property against the list of transient errors that are found near the top of the article SQL error codes for SQL Database client applications.

接続とコマンドConnection vs. command

以下の条件に応じて、SQL 接続を再試行するか、再度確立します。Retry the SQL connection or establish it again, depending on the following:

  • 接続試行中に一時エラーが発生するA transient error occurs during a connection try

数秒間の時間を置いて、接続を再試行します。After a delay of several seconds, retry the connection.

  • SQL クエリ コマンド中に一時エラーが発生するA transient error occurs during a SQL query command

コマンドをすぐに再試行しないでください。Do not immediately retry the command. 少し時間を置いて、新たに接続を確立します。Instead, after a delay, freshly establish the connection. その後、コマンドを再試行します。Then retry the command.

一時エラーの再試行ロジックRetry logic for transient errors

一時エラーが多少なりとも生じるクライアント プログラムは、再試行ロジックを組み込むことで堅牢性を高めることができます。Client programs that occasionally encounter a transient error are more robust when they contain retry logic. ご使用のプログラムがサード パーティのミドルウェアを介して SQL Database と通信する場合、一時エラーに対応した再試行ロジックがそのミドルウェアに備わっているかどうかをベンダーに確認してください。When your program communicates with SQL Database through third-party middleware, ask the vendor whether the middleware contains retry logic for transient errors.

再試行の原則Principles for retry

  • 一時的なエラーである場合は、再試行して接続を開いてください。If the error is transient, retry to open a connection.
  • 一時エラーで失敗した SQL SELECT ステートメントは、そのまま再試行しないでください。Do not directly retry a SQL SELECT statement that failed with a transient error. 新しい接続を確立してから、SELECT を再試行してください。Instead, establish a fresh connection, and then retry the SELECT.
  • SQL UPDATE ステートメントが一時エラーで失敗した場合、新たに接続を確立したうえで UPDATE を再試行してください。When a SQL UPDATE statement fails with a transient error, establish a fresh connection before you retry the UPDATE. データベース トランザクション全体が完了したのか、トランザクション全体がロールバックされたのかを再試行ロジックで確認する必要があります。The retry logic must ensure that either the entire database transaction finished or that the entire transaction is rolled back.

再試行に関するその他の注意点Other considerations for retry

  • 業務終了時刻に自動的に起動され翌朝までに完了するバッチ プログラムは、再試行間隔をある程度長めにしても問題ありません。A batch program that automatically starts after work hours and finishes before morning can afford to be very patient with long time intervals between its retry attempts.
  • 人間の心理として、待ち時間があまり長いと途中でキャンセルされる可能性があります。ユーザー インターフェイス プログラムはその点を考慮するようにしてください。A user interface program should account for the human tendency to give up after too long a wait. 数秒おきに再試行するようなやり方は避けてください。そのような方法を用いると、大量の要求でシステムが処理しきれなくなる可能性があります。The solution must not retry every few seconds, because that policy can flood the system with requests.

再試行の間隔を長くするInterval increase between retries

最初に再試行する前に、5 秒間待つことをお勧めします。We recommend that you wait for 5 seconds before your first retry. 5 秒未満で再試行すると、クラウド サービスに過度の負荷がかかるおそれがあります。Retrying after a delay shorter than 5 seconds risks overwhelming the cloud service. 再試行するたびに、待ち時間を大幅に長くし、最大 60 秒待つ必要があります。For each subsequent retry, the delay should grow exponentially, up to a maximum of 60 seconds.

ADO.NET を使用するクライアントのブロック期間については、「SQL Server の接続プール (ADO.NET)」を参照してください。For a discussion of the blocking period for clients that use ADO.NET, see SQL Server connection pooling (ADO.NET).

加えて、最大再試行回数を設定し、プログラムが自動的に終了するように配慮する必要があります。You also might want to set a maximum number of retries before the program self-terminates.

再試行ロジックを含んだコード サンプルCode samples with retry logic

再試行ロジックを含むコード サンプルについては次の記事をご覧ください。Code examples with retry logic are available at:

再試行ロジックのテストTest your retry logic

再試行ロジックをテストするには、プログラムの実行中に修復可能なエラーをシミュレートする (人為的に発生させる) 必要があります。To test your retry logic, you must simulate or cause an error that can be corrected while your program is still running.

ネットワークから切断することによるテストTest by disconnecting from the network

再試行ロジックをテストする手段として、プログラムの実行中にクライアント コンピューターをネットワークから切断する方法が挙げられます。One way you can test your retry logic is to disconnect your client computer from the network while the program is running. エラーは次のとおりです。The error is:

  • SqlException.Number = 11001SqlException.Number = 11001
  • メッセージ:"そのようなホストは不明です"Message: "No such host is known"

最初の再試行の一環として、クライアント コンピューターをネットワークに再接続してから接続を試行することができます。As part of the first retry attempt, you can reconnect your client computer to the network and then attempt to connect.

このテストを実践するには、コンピューターをネットワークから切断した後でプログラムを起動します。To make this test practical, unplug your computer from the network before you start your program. その後プログラムは、ランタイム パラメーターを通じて次の処理を行います。Then your program recognizes a runtime parameter that causes the program to:

  • エラーのリストに対して一時的に 11001 を追加し、一過性と見なします。Temporarily add 11001 to its list of errors to consider as transient.
  • 通常と同様に初回接続を試みます。Attempt its first connection as usual.
  • エラーが捕捉された後、11001 をリストから削除します。After the error is caught, remove 11001 from the list.
  • コンピューターをネットワークに接続するようにユーザーに通知するメッセージが表示されます。Display a message that tells the user to plug the computer into the network.
  • Console.ReadLine メソッドか、[OK] ボタンを含むダイアログのいずれかを使用して、以降の実行を一時停止します。Pause further execution by using either the Console.ReadLine method or a dialog with an OK button. コンピューターがネットワークに接続された後に、ユーザーが Enter キーを押します。The user presses the Enter key after the computer is plugged into the network.
  • 再度接続を試みます。Attempt again to connect, expecting success.

接続時に間違った綴りのデータベース名を使用することによるテストTest by misspelling the database name when connecting

意図的に間違ったユーザー名を使って初回接続を試みます。Your program can purposely misspell the user name before the first connection attempt. エラーは次のとおりです。The error is:

  • SqlException.Number = 18456SqlException.Number = 18456
  • メッセージ:"ユーザー WRONG_MyUserName はログインできませんでした"Message: "Login failed for user 'WRONG_MyUserName'."

最初の再試行のときに、プログラムでスペルミスを修正してから接続を試みてください。As part of the first retry attempt, your program can correct the misspelling and then attempt to connect.

このテストを実践するには、プログラムでランタイムパラメーターを通じて次の処理を行います。To make this test practical, your program recognizes a runtime parameter that causes the program to:

  • エラーのリストに対して一時的に 18456 を追加し、一過性と見なします。Temporarily add 18456 to its list of errors to consider as transient.
  • 意図的に 'WRONG_' をユーザー名に追加します。Purposely add 'WRONG_' to the user name.
  • エラーが捕捉された後、18456 をリストから削除します。After the error is caught, remove 18456 from the list.
  • ユーザー名から 'WRONG_' を削除します。Remove 'WRONG_' from the user name.
  • 再度接続を試みます。Attempt again to connect, expecting success.

接続再試行用の .NET SqlConnection パラメーター.NET SqlConnection parameters for connection retry

.NET Framework クラスの System.Data.SqlClient.SqlConnection を使用してクライアント プログラムから SQL Database に接続する場合は、接続再試行機能を活用できるように .NET 4.6.1 以降 (または .NET Core) を使用してください。If your client program connects to SQL Database by using the .NET Framework class System.Data.SqlClient.SqlConnection, use .NET 4.6.1 or later (or .NET Core) so that you can use its connection retry feature. 機能の詳細については、この Web ページを参照してください。For more information on the feature, see this webpage.

接続文字列SqlConnection オブジェクト用に作成するときは、次のパラメーター間で値を調整します。When you build the connection string for your SqlConnection object, coordinate the values among the following parameters:

  • ConnectRetryCount:  既定値は 1 です。ConnectRetryCount:  Default is 1. 範囲は 0 ~ 255 です。Range is 0 through 255.
  • ConnectRetryInterval:  既定値は 10 秒です。ConnectRetryInterval:  Default is 10 seconds. 範囲は 1 ~ 60 です。Range is 1 through 60.
  • Connection Timeout:  既定値は 15 秒です。Connection Timeout:  Default is 15 seconds. 範囲は 0 ~ 2147483647 です。Range is 0 through 2147483647.

具体的には、選択した値で次の等式が成り立つ必要があります。Connection Timeout = ConnectRetryCount * ConnectionRetryIntervalSpecifically, your chosen values should make the following equality true: Connection Timeout = ConnectRetryCount * ConnectionRetryInterval

たとえば、回数が 3、間隔が 10 秒、タイムアウトが 29 秒のみの場合、29 < 3 * 10 となり、3 回目の最後の接続の試行には十分な時間が与えらません。For example, if the count equals 3 and the interval equals 10 seconds, a timeout of only 29 seconds doesn't give the system enough time for its third and final retry to connect: 29 < 3 * 10.

接続とコマンドConnection vs. command

ConnectRetryCount パラメーターと ConnectRetryInterval パラメーターを使用すると、プログラムに制御を返すなど、プログラムへの通知や介入なしに、SqlConnection オブジェクトで接続操作を再試行できます。The ConnectRetryCount and ConnectRetryInterval parameters let your SqlConnection object retry the connect operation without telling or bothering your program, such as returning control to your program. 再試行は次の状況で発生することがあります。The retries can occur in the following situations:

  • mySqlConnection.Open メソッドの呼び出しmySqlConnection.Open method call
  • mySqlConnection.Execute メソッドの呼び出しmySqlConnection.Execute method call

これには注意が必要です。There is a subtlety. "クエリ" の実行中に一時エラーが発生した場合、SqlConnection オブジェクトで接続操作が再試行されません。If a transient error occurs while your query is being executed, your SqlConnection object doesn't retry the connect operation. 間違いなくクエリは再試行されません。It certainly doesn't retry your query. ただし、実行するクエリを送信する前に、 SqlConnection ですばやく接続が確認されます。However, SqlConnection very quickly checks the connection before sending your query for execution. 簡単なチェックで接続の問題が検出された場合、 SqlConnection で接続操作が再試行されます。If the quick check detects a connection problem, SqlConnection retries the connect operation. 再試行に成功すると、実行するクエリが送信されます。If the retry succeeds, your query is sent for execution.

ConnectRetryCount をアプリケーションの再試行ロジックと組み合わせて使用する必要があるかどうかShould ConnectRetryCount be combined with application retry logic

アプリケーションにカスタムの堅牢な再試行ロジックが組み込まれていると仮定します。Suppose your application has robust custom retry logic. このロジックでは、接続操作が 4 回再試行されます。It might retry the connect operation four times. ConnectRetryIntervalConnectRetryCount = 3 を接続文字列に追加すると、再試行回数が 4 * 3 = 12 に増加します。If you add ConnectRetryInterval and ConnectRetryCount =3 to your connection string, you will increase the retry count to 4 * 3 = 12 retries. このように何回も再試行するのは、適切ではない可能性があります。You might not intend such a high number of retries.

SQL Database への接続Connections to SQL Database

接続:接続文字列Connection: Connection string

SQL Database に接続するために必要な接続文字列は、SQL Server への接続に使用される文字列とは若干異なります。The connection string that's necessary to connect to SQL Database is slightly different from the string used to connect to SQL Server. データベースの接続文字列は Azure ポータルからコピーすることができます。You can copy the connection string for your database from the Azure portal.

Azure ポータルから接続文字列を取得するObtain the connection string from the Azure portal

Azure Portal を使って、クライアント プログラムが Azure SQL Database と対話するために必要な接続文字列を取得します。Use the Azure portal to obtain the connection string that's necessary for your client program to interact with Azure SQL Database.

  1. [すべてのサービス] > [SQL データベース] の順にクリックします。Select All services > SQL databases.

  2. [SQL データベース] ブレードの左上近辺にあるフィルター テキスト ボックスにデータベースの名前を入力します。Enter the name of your database into the filter text box near the upper left of the SQL databases blade.

  3. お使いのデータベースの行を選びます。Select the row for your database.

  4. お使いのデータベースのブレードが表示されたら、画面を見やすくするために、 [最小化] ボタンを選んで、参照とデータベースのフィルター処理に使ったブレードを折りたたみます。After the blade appears for your database, for visual convenience select the Minimize buttons to collapse the blades you used for browsing and database filtering.

  5. お使いのデータベースのブレードで、 [データベース接続文字列の表示] を選びます。On the blade for your database, select Show database connection strings.

  6. 適切な接続文字列をコピーします。Copy the appropriate connection string. つまり、ADO.NET 接続ライブラリを使用する場合は、 [ADO.NET] タブから適切な文字列をコピーします。i.e. If you intend to use the ADO.NET connection library, copy the appropriate string from the ADO.NET tab.

    データベース用の ADO 接続文字列をコピーする

  7. 必要に応じて、接続文字列を編集します。Edit the connection string as needed. つまり、接続文字列にパスワードを挿入したり、ユーザー名またはサーバー名が長すぎる場合はユーザー名から "@<servername>" を削除します。i.e. Insert your password into the connection string, or remove "@<servername>" from the username if the username or server name are too long.

  8. 特定の形式の接続文字列情報を、クライアント プログラム コードに貼り付けます。In one format or another, paste the connection string information into your client program code.

詳しくは、「接続文字列と構成ファイル」をご覧ください。For more information, see Connection strings and configuration files.

接続:IP アドレスConnection: IP address

SQL Database サーバーは、クライアント プログラムのホストとなるコンピューターの IP アドレスからの通信を許可するように構成する必要があります。You must configure the SQL Database server to accept communication from the IP address of the computer that hosts your client program. この構成を設定するには、Azure Portal を通じてファイアウォール設定を編集します。To set up this configuration, edit the firewall settings through the Azure portal.

IP アドレスの構成を怠った場合、必要な IP アドレスを示した役立つエラー メッセージが表示され、プログラムが失敗します。If you forget to configure the IP address, your program fails with a handy error message that states the necessary IP address.

  1. Azure Portal にサインインします。Sign in to the Azure portal.

  2. 左側の一覧で、 [すべてのサービス] を選びます。In the list on the left, select All services.

  3. スクロールして、 [SQL Server] を選びます。Scroll and select SQL servers.

    ポータルで Azure SQL Database サーバーを見つける

  4. フィルター テキスト ボックスで、サーバーの名前の入力を開始します。In the filter text box, start typing the name of your server. 行が表示されます。Your row is displayed.

  5. お使いのサーバーの行を選びます。Select the row for your server. サーバー用のブレードが表示されます。A blade for your server is displayed.

  6. お使いのサーバーのブレードで、 [設定] を選びます。On your server blade, select Settings.

  7. [ファイアウォール] を選びます。Select Firewall.

    [設定] > [ファイアウォール] を選ぶ

  8. [クライアント IP の追加] を選びます。Select Add Client IP. 最初のテキスト ボックスに、新しい規則の名前を入力します。Type a name for your new rule in the first text box.

  9. 有効にする範囲の IP アドレスの値を入力します。Type in the low and high IP address values for the range you want to enable.

    • 低い方の値の最後を .0、高い方の値の最後を .255 にしておくと便利です。It can be handy to have the low value end with .0 and the high value end with .255.
  10. [保存] を選択します。Select Save.

詳細については、SQL Database のファイアウォール設定の構成に関するページを参照してください。For more information, see Configure firewall settings on SQL Database.

接続:PortConnection: Ports

通常、必要な設定は、クライアント プログラムのホストとなるコンピューターのポート 1433 の送信方向を開放するだけです。Typically, you need to ensure that only port 1433 is open for outbound communication on the computer that hosts your client program.

たとえば、クライアント プログラムが Windows コンピューターでホストされている場合、そのホストの Windows ファイアウォールを使用してポート 1433 を開放することができます。For example, when your client program is hosted on a Windows computer, you can use Windows Firewall on the host to open port 1433.

  1. [コントロール パネル] を開きます。Open Control Panel.
  2. [すべてのコントロール パネル項目] > [Windows ファイアウォール] > [詳細設定] > [送信の規則] > [アクション] > [新しい規則] の順に選択します。Select All Control Panel Items > Windows Firewall > Advanced Settings > Outbound Rules > Actions > New Rule.

クライアント プログラムが Azure の仮想マシン (VM) でホストされている場合は、ADO.NET 4.5 用の 1433 以外のポートと SQL Database に関するページを参照してください。If your client program is hosted on an Azure virtual machine (VM), read Ports beyond 1433 for ADO.NET 4.5 and SQL Database.

ポートと IP アドレスの構成に関する背景情報については、Azure SQL Database のファイアウォールに関するページを参照してください。For background information about configuration of ports and IP addresses, see Azure SQL Database firewall.

接続:ADO.NET 4.6.2 以降Connection: ADO.NET 4.6.2 or later

プログラムで System.Data.SqlClient.SqlConnection などの ADO.NET クラスを使用して SQL Database に接続する場合は、.NET Framework バージョン 4.6.2 以降を使用することをお勧めします。If your program uses ADO.NET classes like System.Data.SqlClient.SqlConnection to connect to SQL Database, we recommend that you use .NET Framework version 4.6.2 or later.

ADO.NET 4.6.2 で開始する場合Starting with ADO.NET 4.6.2

  • Azure SQL データベースに対して接続を開く試みが直ちに再試行されます。そのため、クラウド対応アプリのパフォーマンスが向上します。The connection open attempt to be retried immediately for Azure SQL databases, thereby improving the performance of cloud-enabled apps.

ADO.NET 4.6.1 で開始する場合Starting with ADO.NET 4.6.1

  • SQL Database では、SqlConnection.Open メソッドを使用して接続を開くと信頼性が向上します。For SQL Database, reliability is improved when you open a connection by using the SqlConnection.Open method. Open メソッドには、接続タイムアウト期間内の特定のエラーを対象に、一過性の障害に対応するベスト エフォート再試行メカニズムが組み込まれました。The Open method now incorporates best-effort retry mechanisms in response to transient faults for certain errors within the connection timeout period.
  • 接続プールがサポートされているため、プログラムに割り当てた接続オブジェクトが正常に動作しているかどうかを効率的に検証することが可能です。Connection pooling is supported, which includes an efficient verification that the connection object it gives your program is functioning.

接続プールから取得した接続オブジェクトを使用するとき、すぐに使用しないのであれば、プログラムで一時的に接続を閉じることをお勧めします。When you use a connection object from a connection pool, we recommend that your program temporarily closes the connection when it's not immediately in use. 接続を再度開く処理負荷はわずかですが、新しい接続を作成する負荷は大きくなります。It's not expensive to reopen a connection, but it is to create a new connection.

ADO.NET 4.0 以前のバージョンを使用する場合、最新の ADO.NET. にアップグレードすることをお勧めします。If you use ADO.NET 4.0 or earlier, we recommend that you upgrade to the latest ADO.NET. 2018 年 8 月の時点で、ADO.NET 4.6.2 のダウンロードが可能になりました。As of August 2018, you can download ADO.NET 4.6.2.

診断Diagnostics

診断:ユーティリティから接続できるかどうかをテストするDiagnostics: Test whether utilities can connect

プログラムから SQL Database に接続できないときの診断方法として 1 つ考えられるのは、ユーティリティ プログラムを使用して接続する方法です。If your program fails to connect to SQL Database, one diagnostic option is to try to connect with a utility program. プログラムで使用しているのと同じライブラリを使用して接続するユーティリティがあれば理想的です。Ideally, the utility connects by using the same library that your program uses.

任意の Windows コンピューターで、次のユーティリティを試すことができます。On any Windows computer, you can try these utilities:

  • SQL Server Management Studio (ssms.exe)。ADO.NET を使用して接続します。SQL Server Management Studio (ssms.exe), which connects by using ADO.NET
  • sqlcmd.exeODBC を使用して接続します。sqlcmd.exe, which connects by using ODBC

プログラムが接続された後に、短い SQL SELECT クエリが正しく動作するかどうかをテストしてください。After your program is connected, test whether a short SQL SELECT query works.

診断:開放ポートを確認するDiagnostics: Check the open ports

ポートの問題が原因で接続に失敗している可能性がある場合は、ポートの構成に関するレポート作成に対応したユーティリティをご使用のコンピューターで実行してください。If you suspect that connection attempts fail due to port issues, you can run a utility on your computer that reports on the port configurations.

Linux では、次のユーティリティが役に立つ場合があります。On Linux, the following utilities might be helpful:

  • netstat -nap
  • nmap -sS -O 127.0.0.1:例の値を実際の IP アドレスに変更してください。nmap -sS -O 127.0.0.1: Change the example value to be your IP address.

Windows では PortQry.exe ユーティリティが利用できます。On Windows, the PortQry.exe utility might be helpful. 以下は、SQL Database サーバーのポートの状況の照会をノート PC 上で実行する例を示しています。Here's an example execution that queried the port situation on a SQL Database server and that was run on a laptop computer:

[C:\Users\johndoe\]
>> portqry.exe -n johndoesvr9.database.windows.net -p tcp -e 1433

Querying target system called: johndoesvr9.database.windows.net

Attempting to resolve name to IP address...
Name resolved to 23.100.117.95

querying...
TCP port 1433 (ms-sql-s service): LISTENING

[C:\Users\johndoe\]
>>

診断:エラーのログを記録するDiagnostics: Log your errors

断続的な問題は、過去数日から数週間にわたる一般的なパターンを検出することによって診断できる場合が多々あります。An intermittent problem is sometimes best diagnosed by detection of a general pattern over days or weeks.

診断には、クライアントで発生したエラーのログが役立ちます。Your client can assist in a diagnosis by logging all errors it encounters. SQL Database が内部的に記録するエラー データとそれらのログ エントリを相互に関連付けることも可能です。You might be able to correlate the log entries with error data that SQL Database logs itself internally.

Enterprise Library 6 (EntLib60) には、ログ記録をサポートする .NET マネージド クラスがあります。Enterprise Library 6 (EntLib60) offers .NET managed classes to assist with logging. 詳細については、「5 - As easy as falling off a log: Use the Logging Application Block (5 - きわめて簡単: Logging アプリケーション ブロックの使用)」を参照してください。For more information, see 5 - As easy as falling off a log: Use the Logging Application Block.

診断:エラーの発生をシステム ログで調べるDiagnostics: Examine system logs for errors

以下に示したのは、エラー ログや各種情報を照会する Transact-SQL SELECT ステートメントの例です。Here are some Transact-SQL SELECT statements that query error logs and other information.

ログのクエリQuery of log 説明Description
SELECT e.*
FROM sys.event_log AS e
WHERE e.database_name = 'myDbName'
AND e.event_category = 'connectivity'
AND 2 >= DateDiff
  (hour, e.end_time, GetUtcDate())
ORDER BY e.event_category,
  e.event_type, e.end_time;
sys.event_log ビューには、一時エラーや接続障害を引き起こす可能性のあるものを含む、個々のイベントに関する情報が表示されます。The sys.event_log view offers information about individual events, which includes some that can cause transient errors or connectivity failures.

理想的には、start_timeend_time の値を、クライアント プログラムに問題が発生した時間の情報に関連付けます。Ideally, you can correlate the start_time or end_time values with information about when your client program experienced problems.

このクエリを実行するには、"マスター" データベースに接続する必要があります。You must connect to the master database to run this query.
SELECT c.*
FROM sys.database_connection_stats AS c
WHERE c.database_name = 'myDbName'
AND 24 >= DateDiff
  (hour, c.end_time, GetUtcDate())
ORDER BY c.end_time;
sys.database_connection_stats ビューには、イベントの種類ごとに集計されたカウントが表示され、詳しい診断を行うことができます。The sys.database_connection_stats view offers aggregated counts of event types for additional diagnostics.

このクエリを実行するには、"マスター" データベースに接続する必要があります。You must connect to the master database to run this query.

診断:SQL Database のログから問題のイベントを検索するDiagnostics: Search for problem events in the SQL Database log

SQL Database のログで問題のイベントに関するエントリを検索することができます。You can search for entries about problem events in the SQL Database log. master データベースで次の Transact-SQL SELECT ステートメントを試してみてください。Try the following Transact-SQL SELECT statement in the master database:

SELECT
   object_name
  ,CAST(f.event_data as XML).value
      ('(/event/@timestamp)[1]', 'datetime2')                      AS [timestamp]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="error"]/value)[1]', 'int')             AS [error]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="state"]/value)[1]', 'int')             AS [state]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="is_success"]/value)[1]', 'bit')        AS [is_success]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="database_name"]/value)[1]', 'sysname') AS [database_name]
FROM
  sys.fn_xe_telemetry_blob_target_read_file('el', null, null, null) AS f
WHERE
  object_name != 'login_event'  -- Login events are numerous.
  and
  '2015-06-21' < CAST(f.event_data as XML).value
        ('(/event/@timestamp)[1]', 'datetime2')
ORDER BY
  [timestamp] DESC
;

sys.fn_xe_telemetry_blob_target_read_file から返される行の例A few returned rows from sys.fn_xe_telemetry_blob_target_read_file

次の例は、どのような行が返されるかを示しています。The following example shows what a returned row might look like. ここに示した行では null 値が表示されていますが、null 以外の場合も多くあります。The null values shown are often not null in other rows.

object_name                   timestamp                    error  state  is_success  database_name

database_xml_deadlock_report  2015-10-16 20:28:01.0090000  NULL   NULL   NULL        AdventureWorks

Enterprise Library 6Enterprise Library 6

Enterprise Library 6 (EntLib60) は、.NET クラスのフレームワークです。クラウド サービス (SQL Database サービスもその 1 つ) に対する堅牢なクライアントをこのフレームワークを使って実装することができます。Enterprise Library 6 (EntLib60) is a framework of .NET classes that helps you implement robust clients of cloud services, one of which is the SQL Database service. EntLib60 の利便性が発揮される個々の領域の説明については、「Enterprise Library 6 - April 2013 (Enterprise Library 6 – 2013 年 4 月)」を参照してください。To locate topics dedicated to each area in which EntLib60 can assist, see Enterprise Library 6 - April 2013.

一時エラーを処理するための再試行ロジックは、EntLib60 を利用できる 1 つの領域です。Retry logic for handling transient errors is one area in which EntLib60 can assist. 詳細については、「4 - Perseverance, Secret of All Triumphs:Use the Transient Fault Handling Application Block」をご覧ください。For more information, see 4 - Perseverance, secret of all triumphs: Use the Transient Fault Handling Application Block.

注意

EntLib60 のソース コードは、ダウンロード センターから入手できます。The source code for EntLib60 is available for public download from the Download Center. EntLib に対して機能の更新や保守目的での更新を行う予定はありません。Microsoft has no plans to make further feature updates or maintenance updates to EntLib.

一時エラーと再試行に関連した EntLib60 のクラスEntLib60 classes for transient errors and retry

再試行ロジックで特に利用する機会の多い EntLib60 のクラスは次のとおりです。The following EntLib60 classes are particularly useful for retry logic. これらのクラスはすべて、Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling 名前空間に属しています。All these classes are found in or under the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.

名前空間 Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:In the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:

  • RetryPolicy クラスRetryPolicy class
    • ExecuteAction メソッドExecuteAction method
  • ExponentialBackoff クラスExponentialBackoff class
  • SqlDatabaseTransientErrorDetectionStrategy クラスSqlDatabaseTransientErrorDetectionStrategy class
  • ReliableSqlConnection クラスReliableSqlConnection class
    • ExecuteCommand メソッドExecuteCommand method

Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport名前空間:In the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:

  • AlwaysTransientErrorDetectionStrategy クラスAlwaysTransientErrorDetectionStrategy class
  • NeverTransientErrorDetectionStrategy クラスNeverTransientErrorDetectionStrategy class

EntLib60 に関する情報は以下のリンクから入手できます。Here are some links to information about EntLib60:

EntLib60:Logging ブロックEntLib60: The logging block

  • Logging ブロックは、きわめて柔軟性に優れた構成可能なソリューションであり、次の目的で使用できます。The logging block is a highly flexible and configurable solution that you can use to:
    • ログ メッセージをさまざまな場所に作成して保存する。Create and store log messages in a wide variety of locations.
    • メッセージを分類したりフィルタリングしたりする。Categorize and filter messages.
    • デバッグやトレース、監査要件、全般的なログ要件に利用できるコンテキスト情報を収集する。Collect contextual information that is useful for debugging and tracing, as well as for auditing and general logging requirements.
  • Logging ブロックは、ログ出力先が備えるログ機能を抽象化したものです。対象となるログ ストアの場所や種類に関係なく、アプリケーション コードの一貫性を確保することができます。The logging block abstracts the logging functionality from the log destination so that the application code is consistent, irrespective of the location and type of the target logging store.

詳細については、「5 - As easy as falling off a log: Use the Logging Application Block (5 - きわめて簡単: Logging アプリケーション ブロックの使用)」を参照してください。For more information, see 5 - As easy as falling off a log: Use the Logging Application Block.

EntLib60 IsTransient メソッドのソース コードEntLib60 IsTransient method source code

以下に示したのは、SqlDatabaseTransientErrorDetectionStrategy クラスの IsTransient メソッドの C# ソース コードです。Next, from the SqlDatabaseTransientErrorDetectionStrategy class, is the C# source code for the IsTransient method. どのようなエラーが一過性で、再試行する価値があるかは、このソース コードを見るとはっきりわかります (2013 年 4 月時点)。The source code clarifies which errors were considered transient and worthy of retry, as of April 2013.

public bool IsTransient(Exception ex)
{
  if (ex != null)
  {
    SqlException sqlException;
    if ((sqlException = ex as SqlException) != null)
    {
      // Enumerate through all errors found in the exception.
      foreach (SqlError err in sqlException.Errors)
      {
        switch (err.Number)
        {
            // SQL Error Code: 40501
            // The service is currently busy. Retry the request after 10 seconds.
            // Code: (reason code to be decoded).
          case ThrottlingCondition.ThrottlingErrorNumber:
            // Decode the reason code from the error message to
            // determine the grounds for throttling.
            var condition = ThrottlingCondition.FromError(err);

            // Attach the decoded values as additional attributes to
            // the original SQL exception.
            sqlException.Data[condition.ThrottlingMode.GetType().Name] =
              condition.ThrottlingMode.ToString();
            sqlException.Data[condition.GetType().Name] = condition;

            return true;

          case 10928:
          case 10929:
          case 10053:
          case 10054:
          case 10060:
          case 40197:
          case 40540:
          case 40613:
          case 40143:
          case 233:
          case 64:
            // DBNETLIB Error Code: 20
            // The instance of SQL Server you attempted to connect to
            // does not support encryption.
          case (int)ProcessNetLibErrorCode.EncryptionNotSupported:
            return true;
        }
      }
    }
    else if (ex is TimeoutException)
    {
      return true;
    }
    else
    {
      EntityException entityException;
      if ((entityException = ex as EntityException) != null)
      {
        return this.IsTransient(entityException.InnerException);
      }
    }
  }

  return false;
}

次の手順Next steps