クラウドで利用できるRDBMSとしてのSQL Azure
SQL AzureのテーブルにはClustered Indexが必須
ガイドに従った操作では気がつかずに進んでしまいますが、ここで注意しておかなければならないのはClustered Indexです。
SQL AzureでClustered Indexが必要な理由として「クラスターインデックスによりディスク上のデータの並びが決まるので、クラスターの設定は不可欠であるが、プライマリーキーに以外に設定することも可能である」と説明されています。[※1][※2]
これについて詳細を確認します。1つのClustered Indexが必須だと、ソート指定する列にもインデックスが必要になるのかと思いましたが、通常のRDBMS同様、インデックスがない列を指定したソートは可能でした。また10,000行の“全件”検索を実行しても、Windows Azure Tableのように1,000件でエラーとなることはありません。
インデックスの使われ方についてはHoLTestTableにデータが1行しかないとき、Email Addressを指定した“条件”検索ではClustered Indexが使われ、10,000行のデータでは、追加で作成したインデックスが使われる様子などの実行計画をSQL Azureでも確認することができます。[※1]
PHPでSQL Azureを使う
SQL Azureにテーブルとデータが用意できましたので、このデータにアクセスする簡単なプログラムをPHPで作成してみます。
同じAzureであっても、Windows Azure StorageとSQL AzureではPHPで接続するために必要なファイルが異なります。Windows AzureではCodeplexのPHPAzureライブラリを利用しましたが、SQL Azureはこれとは異なりSQL Serverと同じものを利用します。
従って、マイクロソフト社から提供されている資料もWindows Azure関連ではなく、PHP on Windows Training Kit(August 2009)[※3]が参考になります。
具体的には、今回のドライバ設定はUTF-8に対応したSQL Server Driver for PHP 1.1 CTP[※4]からphp_sqlsrv_52_nts_vc6.dllを取り出し、php.iniのextension_dirに指定したフォルダにコピーし、php.ini にextension=php_sqlsrv_52_nts_vc6.dllを追記しました。
プログラムファイルa01.phpはUTF-8で保存し、接続時に「”CharcterSet=>”UTF-8”」と指定してあります。
動作内容は一部のデータを日本語で更新した後、10,000行のデータを全件検索します。
a01.php
---------------------------------------------------
function Connect()
{
$serverName = "tcp:「サーバー名」.ctp.database.windows.net";
$connectionInfo = array(
"Database"=>"HoLTestDB","UID"=>"HoLTestUser@「サーバー名」", "PWD"=>"Pass@word1","MultipleActiveResultSets"=>"0",
"CharacterSet" => "UTF-8");
$connection = sqlsrv_connect( $serverName, $connectionInfo);
if( $connection === false )
{ print_r(sqlsrv_errors() ) ;
die( sqlsrv_errors());
}
return $connection;
}
$conn = Connect();
$tsql = "update Customer set LastName=(?) where CustomerID=(?)";
$param = array("test2 テストupdate from php",2);
$stmt = sqlsrv_query( $conn, $tsql, $param);
$tsql = "SELECT CustomerID, EmailAddress FROM Customer ";
$stmt = sqlsrv_query( $conn, $tsql );
while( $row = sqlsrv_fetch_array($stmt))
{
echo "CsutomerID:".$row[0]. "EmailAddress:".$row[1]."\r\n";
}
?>
---------------------------------------------------
C:\PHPAzure-0.2.0[1]\library>c:\php_529\php.exe a01.phpを実行した後、SMSSでデータを確認することができます。
【注意】データベースの接続にはPHP5.2.9を使用しましたが、PHPのバージョンが古いと、「Call to undefined function sqlsrv_connect()」、またSQL Server 2008 Native Client が正しくインストールされていない場合に以下のエラーが発生します[※5]。
---------------------------------------------------
「The SQL Server Driver for PHP requires the SQL Server 2008 Native Client ODBC Driver (SP1 or later) to communicate with SQL Server. That ODBC Driver is not currently installed.」
---------------------------------------------------
また、「”CharcterSet=>”UTF-8”」を指定しなかった場合、日本語の部分はSSMSでは“?”に文字化けします。
■SQL ServerからSQL Azureへのデータ移行
PHPを用いてSQL Azureへアクセスし、日本語も利用できることが確認できました。この調子であればWordPressなどは既にSQL Azureで動いているのではないかと思い、検索したのですが、稼働報告はまだ発見できませんでした。
それではと、インストールマニアックス2009においてインストールしたIIS7+PHP+SQL Serverの環境のWordPress[※6]をSQL Azureへ移行に挑戦してみることにしたのですが、作業開始後に判明した問題は「text型がSQL Azureでは利用できない」ということです。
これはnvarchar(4000)などにして、取りあえずは対応できそうですが、これ以外にもテーブル作成の段階で次々と制限事項が見つかります。次はCreate Tableの際に発生したエラーの一部です。
---------------------------------------------------
Deprecated feature 'Data types: text ntext or image' is not supported in this version of SQL Server.
'Filegroup reference and partitioning scheme' is not supported in this version of SQL Server.
Option 'sort_in_tempdb' is not supported in this version of SQL Server.
'Multi-part names with Server or Database specifier' is not supported in this version of SQL Server.
---------------------------------------------------
データ移行には、Windows Azure Platform Training Kit - August Updateにある「Hands-On Lab:Migrating Databases to SQL Azure」[※1]が参考になりました。ツールの利用方法が解説されているので、一部抜粋します。
---------------------------------------------------
SQL Serverの管理ツール(SSMS)を起動して、データベースを選択した状態で右クリックし開いたメニューの中から「スクリプトの生成」を選ぶと「スクリプト作成ウィザード」が起動されます。画面の指示に従い、設定を進めることでテーブル作成およびデータ挿入用のSQL文が作成されます。
---------------------------------------------------
ポイントは「スクリプトオプションの選択」の画面で[UDDTsを基本データ型に変換: True]、[拡張プロパティのスクリプトを作成: False]、[USE DATABASEのスクリプト作成: False]、[データのスクリプトを作成: True]とすることです(図2参照)。
「スクリプト作成ウィザード」で作成されたSQLから手動で不要な部分を置換・削除して作業完了です。こうして作成したSQLにより、SQL ServerのWordPress用のデータをSQL Azureへ移行することができました。
【補足】今回のWordPressはテスト環境ですので、4,000バイト以上のテキストデータはありませんでしたが、実際に稼働しているシステムの移行の際にはデータの加工が必要になりますので、移行用のプログラムを作成した方が確実でしょう。
※1 Windows Azure Platform Training Kit - August Update(http://www.microsoft.com/DownLoads/details.aspx?familyid=413E88F8-5966-4A83-B309-53B7B77EDF78&displaylang=en)(アクセス:2009.09)
※2 Guidelines and Limitations(SQL Azure Database)(http://msdn.microsoft.com/en-us/library/ee336245.aspx)(アクセス:2009.09)
※3 PHP on Windows Training Kit(August 2009)(http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=c8498c9b-a85a-4afa-90c0-593d0e4850cb)(アクセス:2009.09)
※4 SQL Server Driver for PHP 1.1 Community Technology Preview - August 2009(http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=ccdf728b-1ea0-48a8-a84a-5052214caad9)(アクセス:2009.09)
※5 Microsoft SQL Server 2008 Native Client
(http://www.microsoft.com/downloadS/details.aspx?familyid=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=ja)(アクセス:2009.09)
※6 Wordpress on SQL Server
(http://x64.museum-in-cloud.com/index.php/2009/05/wordpress-on-sql-server/)(http://www.forestpointtechnologies.com/blog/wordpress-on-sql-server/)(アクセス:2009.09)