Azure Virtual Machines における SQL Server のパフォーマンスに関するガイドライン 等の情報に記載されていますが、SQL Server on Azure VM を使用する場合、tempdb 用のファイルを D ドライブに配置するというチューニング方法があります。
SQL Server on Azure VM を SQL Server インストール済みのイメージから展開する場合は、最近の展開であれば、ストレージの最適化として、D ドライブに配置するように構成ができるようになっています。
この配置ですが、以前に展開した SQL Server インストール済みのイメージや、自分で Azure VM に SQL Server をインストールしたセルフインストールの環境では構成がされていない状態となります。
今回の投稿では、この tempdb を D ドライブ (ローカル SSD) に配置する方法をまとめておこうかと思います。
公式のドキュメントとしては、一時ディスク に記載されており、詳細な解説は Announcing Performance Optimized Storage Configuration for SQL Server on Azure VMs with SQL VM RPで行われています。
VM のサイズによっては D ドライブのサイズが少なく、VM の通常のディスク上に配置する必要があるかもしれませんが、tempdb のスループットを向上させるための汎用的な方法として覚えておくと利便性は高いのではないでしょうか。
Azure VM を使用していて、SQL Server の tempdb を D ドライブに配置しようとした場合ですが、単純に tempdb のデータ / ログファイルを D ドライブに配置するように tempdb のデータベースを移動する ほかに、
Using SSDs in Azure VMs to store SQL Server TempDB and Buffer Pool Extensions で紹介されているような内容を設定する必要があります。
SQL Server のサービスアカウントが、ドライブの直下にファイルを格納しようとすると、デフォルトの状態では、権限周りでエラーになるため、
- D ドライブにディレクトリを作成
- 作成したディレクトリに tempdb のデータベースを配置
をする必要があります。
Azure の D ドライブのローカル SSD は揮発性のディスクですので、サーバーの再起動等が発生すると初期化され、tempdb のデータベースを配置するディレクトリも削除されてしまい、再起動後の SQL Server の起動でエラーとなってしまいます。
これを回避するために、サーバー起動時に実行されるタスクスケジューラーに、D ドライブのディレクトリ作成と SQL Server の起動を行うためのジョブを登録して、SQL Server を起動するというのが上記で解説されている内容となります。
SQL Server インストール済みの VM を展開する際に指定できる tempdb のローカル SSD への配置は、D ドライブに tempdb を配置して稼働させるための、
- tempdb のデータベースを D ドライブに変更
- データベース配置用のディレクトリ作成
- タスクスケジューラー経由で SQL Server のサービスを起動させる
というような設定を自動的に実施してくれるものとなります。
セルフインストールした SQL Server にSQL VM リソースプロバイダー で、Azure VM を登録し、SQL IaaS 拡張機能がインストールされることで、SQL Server インストール済みイメージで使用することができる、SQL Server の最適化の機能を使用することもできるのですが、tempdb ストレージの最適化の機能については、ポータル等から設定ができるような機能は、この投稿を書いている時点では提供されていなさそうです。
REST API や、ARM テンプレートでは設定変更は提供されていそうですので、今回は REST 経由で設定をしてみたいと思います。
$subscriptionID = "Subscription ID" $tenantId = "Tenant ID" $resourceGroup = "Resource Group" $vmName = "VM Name" Connect-AzAccount -Tenant $tenantId Get-AzSubscription -SubscriptionId $subscriptionID | Select-AzSubscription | Out-Null # $context = Get-AzContext # $token = "Bearer " + ($context.TokenCache.ReadItems() | Where-Object TenantId -eq $tenantId).AccessToken $token = "Bearer " + (Get-AzAccessToken).Token $uri = "https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.SqlVirtualMachine/sqlVirtualMachines/{2}?api-version=2017-03-01-preview" -f $subscriptionID, $resourceGroup, $vmName $header = @{ "Authorization" = $token "Content-type" = "application/json" } $body = @{ "location" = "japaneast" "properties" = @{ "virtualMachineResourceId" = "/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/virtualMachines/{2}" -f $subscriptionID, $resourceGroup, $vmName "storageConfigurationSettings" = @{ "diskConfigurationType"= "NEW" "storageWorkloadType" = "OLTP" "sqlTempDbSettings" = @{ "defaultFilePath" = "D:\tempDb" } } } } | ConvertTo-Json -Depth 4 -Compress Invoke-WebRequest -Method "PUT" -Uri $uri -Headers $header -Body $body $uri = "https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/virtualMachines/{2}?api-version=2017-03-30" -f $subscriptionID, $resourceGroup, $vmName $ret = Invoke-WebRequest -Method "GET" -Uri $uri -Headers $header $json = $ret.Content | Convertfrom-Json ($json.resources | Where-Object Name -eq SqlIaasExtension).properties.Settings.ServerConfigurationsManagementSettings.SQLStorageUpdateSettingsV2
これで、tempdb を D ドライブに配置するように、設定を行うことができます。
正常に登録が行われると、タスクスケジューラーに「SqlStartUp」というジョブが登録されて、このジョブにより tempdb を D ドライブに配置するためのディレクトリの作成や SQL Server のサービスの起動が行われるようになります。
簡単に D ドライブを使用した tempdb の配置ができるようになったのはうれしいですね。