2013 年 7 月以前の Windows Azure の ゲスト OS には、SQL Server 2008 Native Client (以下 SQLNCLI10)が含まれていましたが、7 月リリースの Azure ゲスト OS (バージョン 1.24 / 2.16 および 3.4) には、SQL Server 2012 Native Client (以下 SQLNCLI11) に置き換えられました。SQL Databaseに接続するクライアント アプリケーションにおいて Azure ゲスト OS に含まれる SQLNCLI10を使用していた場合、この変更によってデータソース接続ができなくなり、例外がスローされるなどの問題が発生することになります。
問題
Azure ゲスト OS に含まれる SQLNCLI10を使用してデータベースを使用する Windows Azure アプリケーションにおいて、Azure ゲスト OS をアップグレードした後、データベースに突然接続できなくなるという現象が発生します。エラーメッセージは以下の通りです。
ODBC の場合
ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
ERROR [IM002] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバが見つかりません。
OLEDB の場合(※下記Note : OLEDB の接続について参照)
The 'SQLNCLI10' provider is not registered on the local machine.
'SQLNCLI10' プロバイダーはローカルのコンピュータに登録されていません。
PHP:
Error establishing a Database Connection
The connection has timed out – the server at XXXXXXXX.database.windows.net is taking too long to respond.
Note : OLEDB の接続について |
SQL Azure でサポートされるドライバー、プロバイダーについて http://msdn.microsoft.com/ja-jp/windowsazure/hh977108.aspx OLE DB を使用して、SQL Azure へ接続することはサポートされません。ADO OLE DB をベースに開発された API や開発言語を使用されている場合には、注意する必要があります。 |
要因
2013 年 7 月以前の Windows Azure ゲスト OS には、SQLNCLI10 が含まれていました。 しかし、7 月以降の、Windows Azure ゲスト OS には SQLNCLI11 と差し替えられました。 ODBC および OLEDB における接続文字列には、基本的に以下のように SQLNCLI のバージョンを明記しますが、これにより以前のバージョン 10 が指定されているアプリケーションでは、Azure ゲスト OS 上にモジュールがないため接続処理を呼び出すことが出来ず、問題が発生します。
例) SQL Server 2008 Native Client ODBC Driver を接続文字列中でを指定している場合
Driver={SQL Server Native Client 10.0};Server=tcp:[serverName].database.windows.net;Database=myDataBase;Uid=[LoginForDb]@[serverName];Pwd=myPassword;Encrypt=yes;例) SQL Server 2008 Native Client OLE DB Provider を接続文字列中でを指定している場合
Provider=SQLNCLI10;Password=myPassword;User ID=[username]@[servername];Initial Catalog=databasename;Data Source=tcp:[servername].database.windows.net;
影響があるゲスト OS のバージョン
Guest OS Version | Configuration String | Release Date | SQL Native Client Version |
1.24 | WA-GUEST-OS-1.24_ 201306-01 | July 16 2013 | SQLNCLI11 |
2.16 | WA-GUEST-OS-2.16_201306-01 | July 16 2013 | SQLNCLI11 |
3.4 | WA-GUEST-OS-3.4_201306-0 | July 16 2013 | SQLNCLI11 |
ご利用のゲスト OS に含まれる SQLNCLI のライブラリのバージョンを確認する
リモートデスクトップでログインし、以下のいずれかの方法で確認することが可能です。
- D:\Windows\System32 フォルダに移動し、以下を確認します。
> sqlncli10.dll がある場合 : SQLMCLI10の環境です。
> sqlncli11.dll がある場合 : SQLMCLI11の環境です。
- コントロール パネルの「プログラムと機能」を開き、以下を確認します。
> Microsoft SQL Server 2008 Native Client がある場合 : SQLMCLI10の環境です。
> Microsoft SQL Server 2012 Native Client がある場合 : SQLMCLI11の環境です。
問題の影響を受けるか判断するには
・データベース接続文字列で、"Driver=" もしくは "Provider=" があれば、そこで "SQLNCLI10" を指定しているか、あるいは "SQLNCLI11" というキーワードを使用しているかを確認することで判断することが出来ます。
・PHP / Wordpress の場合は、PHP のログを確認します。ログ中で、"sql" という文字列を探します。この文字列を含む場合、SQLNCLI10を使用していることになります。
Note : System.Data.SqlClient (System.Data.dll) を使用している場合 |
.NET Framework アプリケーションでデータアクセス処理を含む場合、コード中で System.Data.SqlClient (System.Data.dll) を使用している場合は、SQLNCLI ではなく、.NET Framework Data Provider for SQL Server を使用しています。従って、この場合今回のモジュール差し替えの影響は受けません。 |
対処方法
対処方法は以下のうち、いずれかとなります。
・SQLNCLI10 を含む以前のゲスト OS に戻します。 (June release – versions 1.23, 2.15, 3.3 以前)
この操作は、Windows Azure 管理ポータルから実行するか、あるいは OS の構成を含むサービス定義ファイルをアップロードすることによって実行します。
しかしこれはあくまでも一時的な対処になります。6 月以前の Azure Guest OS において、SQLNCLI10 同梱はいずれ廃止される予定です。
・Database への接続文字列を SQLNCLI11に変更します。
これは最もシンプルな対応方法になる場合があります。 接続文字列中のドライバの指定を以下のように "SQLNCLI10" から "SQLNCLI11" に変更するだけだからです。ただし、接続テストなど、必ず動作検証を実施ください。
例)
Provider=SQLNCLI10;Password=myPassword;User ID=[username]@[servername];Initial Catalog=databasename;Data Source=tcp:[servername].database.windows.net;
↓
Provider=SQLNCLI11;Password=myPassword;User ID=[username]@[servername];Initial Catalog=databasename;Data Source=tcp:[servername].database.windows.net;
・PHP の場合、PHP 用 SQL ドライバをバージョン 3.0 以降にします。
参考 : http://www.microsoft.com/en-us/download/details.aspx?id=20098
・SQLNCLI 10 をダウンロードし、スタートアップ タスクに含めてアプリケーションの配置時に構成されるようにする。(※下記Note : スタートアップタスクに SQLNCLI10 など必要なモジュールを含める方法参照)
SQLNCLI は、サイドバイサイドで構成可能なため、SQLNCLI10 と SQLNCLI11が同じ環境に共存することが出来ます。
配置済みのアプリケーションを更新する際は、インプレース アップグレードか、VIP SWAP のいずれかで再配置を行うことが出来ます。
Note : スタートアップタスクに SQLNCLI10 など必要なモジュールを含める方法 |
以前以下のブログで対応方法をご案内しています。 ご参考になれば幸いです。 Windows Azure で、Web ロールで特定のバージョンの SQL Server Native Client を常に使えるようにする方法 http://msdn.microsoft.com/ja-jp/windowsazure/hh977108.aspx |
参考情報
こちらは、Windows Azure - Troubleshooting & Debugging ブログの以下記事をベースに公開しています。原文はこちらを参照ください。
Compatibility Issue - SQL Azure connectivity using the SQL Native Client may break after the July release of the Windows Azure Guest OS