互換性の問題 – SQL Server Native Clientを使ったWindows Azure SQLデータベースの接続性が、Windows AzureゲストOSの7月リリース以降、動作しなくなる場合があります

Posted: 2013/08/05 カテゴリー: Uncategorized
タグ:, , , , ,

2013年7月より前は、Windows Azureクラウド サービスのWindows AzureゲストOSは、(通常、SQLNCLIまたはSNACと名付けられている) SQL Server Native Clientライブラリのバージョン10を含んでいました。Windows AzureゲストOSの7月リリース (1.24、2.16、3.4) は、SQL Server Native Clientライブラリのバージョン11を含むようになりました。この変更によって、Windows Azure SQLデータベース (あるいは、SNACでアクセスしている他のデータベース) に接続するクライアント アプリケーションが例外をスローするようになる場合があります。

症状

  • 最も一般的な症状は、7月中旬、あるいは、Windows AzureゲストOSの最新バージョン (1.24、2.16、3.4) に手動アップグレードした時から始まった、データベースへの接続性における障害です (7月16日が、7月リリースが展開され始めた日です (英語 / 日本語))。
  • エラー メッセージは、お使いの言語やフレームワークに依存しますが、通常はデータベースへの接続をオープンする時にスローされます。発生するエラーのいくつかの例を示します:

SNAC ODBCの場合:

ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

SNAC OLEDBの場合:

The ‘SQLNCLI10’ provider is not registered on the local machine.

PHPの場合:

Error establishing a Database Connection
The connection has timed out – the server at XXXXXXXX.database.windows.net is taking too long to respond.

原因

2013年7月より前は、Windows AzureゲストOSは、Microsoft SQL Server 2008 Native Client (SQLNCLIのバージョン10 – sqlncli10.dll) を含んでいましたが、2013年7月以降、Windows AzureゲストOSは、Microsoft SQL Server 2012 Native Client (SQLNCLIのバージョン11 – sqlncli11.dll) を含んでいます。

ODBC/OLEDB接続文字列は、通常、次の例のように、SQLNCLIのバージョンをハードコードしています:

SQL Server Native Client 10.0 ODBCドライバー

Driver={SQL Server Native Client 10.0};Server=tcp:[serverName].database.windows.net;Database=myDataBase;Uid=[LoginForDb]@[serverName];Pwd=myPassword;Encrypt=yes;

SQL Server Native Client 10.0 OLE DBプロバイダー

Provider=SQLNCLI10;Password=myPassword;User ID=[username]@[servername];Initial Catalog=databasename;Data Source=tcp:[servername].database.windows.net;

もはやOS上にsqlncli10.dllが存在しないので、そのメソッドへの呼び出しは失敗します。

影響を受けるOSのバージョン

ゲストOSの
バージョン
構成文字列 リリース日 SQL Server Native
Clientのバージョン
1.24 WA-GUEST-OS-1.24_ 201306-01 2013年7月16日 SQL 2012 (v11)
2.16 WA-GUEST-OS-2.16_201306-01 2013年7月16日 SQL 2012 (v11)
3.4 WA-GUEST-OS-3.4_201306-01 2013年7月16日 SQL 2012 (v11)

 
ロール インスタンスにおけるSQL Server Native Clientライブラリのバージョンの確認方法

  • RDPでロール インスタンスにログインし、D:\Windows\System32を確認できます。
    • sqlncli10.dllが存在する場合、バージョン10が使われています。
    • sqlncli11.dllが存在する場合、バージョン11が使われています。
  • コントロール パネルの「プログラムと機能」一覧を確認できます。
    • Microsoft SQL Server 2008 Native Clientが存在する場合、バージョン10が使われています。
    • Microsoft SQL Server 2012 Native Clientが存在する場合、バージョン11が使われています。

影響を受けているかどうかの判断方法

  • データベース接続文字列を使っている場合は、「Driver=」、または「Provider=」の存在を確認してください。この値が、バージョン10、またはバージョン11を使っていることを示しています。
  • PHP/WordPressを使っている場合は、PHPログを確認できます。PHPログで、文字列「sql」を検索できます。呼び出しは、通常、バージョン10を期待していることを示しています。

注: System.Data.SqlClient.dllを直接使っている.NETアプリケーションがある場合、このアセンブリはSNACを使わないので、影響を受けないはずです。

解決策

  • 迅速で一時的な解決策として、SNAC 10を含んでいる以前のゲストOS (6月リリース – 1.23、2.15、3.3) にロールバックできます。Windows Azure管理ポータルを介して、あるいは、正しいOS構成文字列 (英語 / 日本語) を持つ新しいサービス構成ファイルをアップロードすることで、これを行えます。ゲストOSの6月リリースは非推奨になる予定 (英語 / 日本語) なので、これは一時的な解決策であるべきです。
  • SNACバージョン11を使うように、コードや接続文字列をアップグレードします。これは、「10」を「11」に変更するという単純なことです (http://www.connectionstrings.com/sql-azure/ で、Windows Azure SQLデータベースの接続文字列の例をご覧ください)。ですが、もちろんテストは必要です。
  • PHPをお使いの場合、http://www.microsoft.com/en-us/download/details.aspx?id=20098 で入手可能な、Microsoft Drivers for PHP for SQL Serverの最新バージョン3.0を使えます。
  • SQLNCLI10 x64 (x64のSQLNCLIバージョン10) を、バージョン10と並列にインストールできますスタートアップ タスク (英語 / 日本語) でSQLNCLIバージョン10をインストールし、アプリケーションを再デプロイする必要があることに注意してください。ダウンタイムを避けるために、インプレース アップグレード、またはVIPスワップを使ってアプリケーションを再デプロイできます。

関連情報

 

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中