[Windows Azure] ゲスト OS アップグレード後、ゲスト OS 上のSQL Server Native Client を使用している WebRole/Worker Role アプリケーションで例外エラーが発生する (Ver 2.0)

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 を使用していた場合、この変更によってデータソース接続ができなくなり、例外がスローされるなどの問題が発生することになります。

Note Note : 2013/08/09 Update - 過去バージョンの Guest OS のリタイアについて

対処方法として、SQLNCLI10 の含まれる June release – versions 1.23, 2.15, 3.3 以前の VM に戻す方法もございますが、以下 "Guest OS Supportability and Retirement Policy" セクションに触れておりますように、最新バージョン –1 世代の Guest OS までのサポートとなります。従いまして、2013/08/09 現在以降、近いうちにご利用できなくなる可能性もあります。従いまして、なるべく早めにスタートアップ タスクなどによる対応に切り替えられることを強く推奨いたします。

Windows Azure Guest OS Releases and SDK Compatibility Matrix  https://msdn.microsoft.com/en-us/library/windowsazure/ee924680.aspx

<--- 引用ここから Microsoft will support the latest two versions of the supported Guest OS families. When newer version is released, an older version is retired. Customers have 60 days from the retirement date to update to a later version.

・・・(省略) ・・・

What can I expect during and after the 60 day grace period for a Guest OS version expires? When a Guest OS Version is retired, customers with the manual upgrade option will have 60 days to upgrade their services to a supported Guest OS version. During the 60 days, new deployments with the expired version will still be allowed. After this grace period expires, Cloud Services using the retired OS version will be force updated to a supported Guest OS version. < --- 引用ここまで

  Guest OS のバージョンがリタイアすると、アップデートされ、また同じ問題が再発する可能性がありますので、恒久的な対処(スタートアップ タスクなど)を取られることを強く推奨します。なお、2013/08/09 現在、上記 Matrix の WA-GUEST-OS-2.15_201305-01 の “TBD” に日付が入りましたら、リタイア期間に入ったと判断できます。リタイア期間は恒久的ではなく、いずれ失効します。上記も合わせご参照ください。

2.15 Note (2)

WA-GUEST-OS-2.15_201305-01

June 11 2013 TBD

2.0 and 1.8 tested  1.3 and newer supported

 

問題

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 の場合 (※下記NoteNote : 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 Note : OLEDB の接続について  
SQL Azure でサポートされるドライバー、プロバイダーについて https://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-01 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 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;

参考 : https://www.connectionstrings.com/sql-azure/

・PHP の場合、PHP 用 SQL ドライバをバージョン 3.0 以降にします。
参考 : https://www.microsoft.com/en-us/download/details.aspx?id=20098

・SQLNCLI 10 をダウンロードし、スタートアップ タスクに含めてアプリケーションの配置時に構成されるようにする。(※下記NoteNote : スタートアップタスクに SQLNCLI10 など必要なモジュールを含める方法参照)
SQLNCLI は、サイドバイサイドで構成可能なため、SQLNCLI10 と SQLNCLI11が同じ環境に共存することが出来ます。
配置済みのアプリケーションを更新する際は、インプレース アップグレードか、VIP SWAP のいずれかで再配置を行うことが出来ます。

Note Note : スタートアップタスクに SQLNCLI10 など必要なモジュールを含める方法
以前以下のブログで対応方法をご案内しています。 ご参考になれば幸いです。 Windows Azure で、Web ロールで特定のバージョンの SQL Server Native Client を常に使えるようにする方法 https://blogs.msdn.com/b/jpsql/archive/2013/07/18/windows-azure-web-sql-server-native-client.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

https://blogs.msdn.com/b/kwill/archive/2013/08/01/compatibility-issue-sql-azure-connectivity-using-the-sql-native-client-may-break-after-the-july-release-of-the-windows-azure-guest-os.aspx