[SQL Azure] 接続系の問題に対処する編:アプリケーションのエラーハンドリングへの考慮事項
SQL Server を利用していた際には、アプリケーションからSQL Serverへの接続に関する問題に対し、トレースを仕掛けるなど、様々なトラブルシューティングの手法が用意されていました。SQL Azureでは、SQL Azureのサーバーはマイクロソフトのデータセンターに配置されており、現在個々サーバートレースを仕掛けて調査を行うことはできません。したがって従来のトラブルシューティングの手法とは違う考慮が必要になってきます。ここでは、Activity IDを取得することで、接続系のトラブルに備える方法を紹介します。
Activity IDとは
例えば、SQL Azureのサーバーを作成しようとしたときに、たまたま以下のようなエラーに遭遇して作成できなかったとします。
上記のエラーの詳細情報(赤字の情報)にある activity id ‘fF1b03f47-ddd0-40d8-c13-26b5cc6143f1’ が Activity IDと呼ばれるものになります。この Activity IDは、全てのSQL Azureの接続時に生成されるユニークな GUID で、セッション コンテキスト 情報、トレースID、またはセッショントレースIDとも呼ばれることがあります。マイクロソフトのSQL Azure Developerサポートは、このActivity IDを追跡して、エラーの発生した理由を探ることができる場合があります。その際には、以下の情報もわかる範囲でお知らせください。
- Activity ID
- エラーの発生時刻(上記の例ではUTC Timestampで表記されている時刻となります。)
- 利用しているデータセンター名
- SQL Azureのサーバー名(取得済みである場合)
- SQL Azure に接続を実施したユーザー名
- SQL Azure 上の接続先のデータベース名
Activity IDはSQL Server Management Studioでどうやってみることができる?
上記の図のように、CONTEXT_INFO()関数を使って、現在のセッションのActivity IDを確認することができます。Activity IDは、現在の接続に関するプロパティでは、Session Tracing ID(黄色でハイライトした部分)として表示されています。
アプリケーション内でActivity IDを取得する例
以下はコードサンプルになりますが、黄色でハイライトした部分を実行することにより、ログに記録することができます。アプリケーションを設計する際には、エラーハンドリングを考慮する必要がありますが、Activity IDの取得をアプリケーションの実行ログに記録するようにすることで、トラブルシューティングに備えることができます。
sessionId = null; using (SqlConnection conn = new SqlConnection(…)) { // Grab sessionId from new connection using (SqlCommand cmd = conn.CreateCommand()) { conn.Open(); cmd.CommandText ="SELECT CONVERT(NVARCHAR(36), CONTEXT_INFO()) "; sessionId = new Guid(cmd.ExecuteScalar().ToString()); } // continue processing ... } |
さらに詳しい情報は、以下のサイト(英語のサイトになります)をご覧ください。
- CONTEXT_INFO (Transact-SQL).
- Development Considerations in SQL Azure
- SQL Azure: Connection Management in SQL Azure
- Best Practices for handling transient conditions in SQL Azure
- SQL Azure connectivity Troubleshooting Guide
また、Windows Azure / SQL Azure のサポートについては、以下を参照ください。
--
Kayoko Gray