こんにちは。日本マイクロソフト SQL Server サポートチームです。
今回は、Azure の SQL VM(SQL Server on Windows Server) のディスク拡張について、よくお問い合わせいただく以下の内容についてご案内します。
【本ブログで紹介させていただく内容】
A. SQL 仮想マシンのディスクを拡張する方法
Azure Marketplace から SQL Server のライセンス込みの仮想マシンをデプロイすると、OS 上のディスクが記憶域プール(SQLVMStoragePoolX)で構成されます。
SQL仮想マシンのストレージを拡張したい場合は、この記憶域プールを拡張する必要があります。
図.記憶域プール
記憶域プールの拡張は以下のいずれかの方法で実施します。
① SQL 仮想マシンからの拡張
② 手動での記憶域プールのディスク拡張
① SQL 仮想マシンからの拡張
[前提条件]
・SQL Server IaaS Agent をフル管理モードで導入している。
SQL Server IaaS Agent 拡張機能とは (Windows) - SQL Server on Azure VMs | Microsoft Learn
・本ブログ記事執筆現在(2023/3/17)Premium ディスクがサポートされているインスタンスタイプを利用している。
※ Premium ディスクがサポートされていない場合は以下のようにメッセージが表示されます。
・本ブログ記事執筆現在(2023/3/17)、SQL 仮想マシンから拡張ができるのは、Premium ディスクのみになります。
※ Ultra ディスクの場合は以下のようにメッセージが表示されます。
図.SQL 仮想マシン ストレージ構成
上記の前提条件を満たしてない場合は、「② 手動での記憶域プールへディスク拡張」を参照し、拡張ください。
[拡張手順]
図.SQL 仮想マシン
4. 拡張したいドライブの「構成」を選択します。
図.SQL 仮想マシン ストレージ構成
5. 拡張したいディスクのサイズを選択し、「適用」を選択します。
※ Premium ディスクで構築した場合は、プルダウンに Premium ディスクが表示されます。
図.SQL 仮想マシン ストレージ構成
6. 拡張されたことを確認します。
図.SQL 仮想マシン ストレージ構成
SQL Server VM のストレージを構成する - SQL Server on Azure VMs | Microsoft Learn
② 手動での記憶域プールのディスク拡張
手動での記憶域プールのディスク拡張は以下の流れで拡張します。
[拡張の流れ]
手順の詳細については、下記 URL の「方法 1 : 記憶域プールに新規のディスクを追加し、仮想ディスクおよびボリュームを拡張する」の項目をご参照ください。
Azure Windows VM で記憶域スペースを拡張する | Japan Azure IaaS Core Support Blog (jpaztech.github.io)
B. SQL 仮想マシンからディスク拡張ができない
Azure Marketplace から SQL Server のライセンス込みの仮想マシンをデプロイ後に、SQL Server を再インストールし、その後 SQL 仮想マシンからディスクを拡張できなくなったというお問い合わせをいただくことがあります。
Azure ポータルの SQL 仮想マシンのディスク拡張に表示されるドライブは、 SQL Server の[データベースの既定の場所]のデータとログのファイル配置先の情報を読み取って表示しています。
図.SQL Server インスタンスのプロパティ
そのため、SQL Server を再インストールした際に、C ドライブなど記憶域プールで構成されていないドライブを設定した場合、Azure ポータルから以下のように拡張ができません。
図.SQL 仮想マシン ストレージ構成
[対処方法]
SQL Server の既定のファイルの配置先を、記憶域プールで構成されたドライブに変更します。
既定のファイルの配置先の変更方法については、下記 URL をご参照ください。
こちらを変更後も、Azureポータルの画面に反映されない場合は、 VM を再起動してください。
データ ファイルとログ ファイルの既定の場所の表示または変更 - SQL Server | Microsoft Learn
図.SQL Server インスタンスのプロパティ
C. ディスク拡張を拡張したが拡張できない
改めてにはなりますが、Azure Marketplace から SQL Server のライセンス込みの仮想マシンをデプロイすると、OS 上のディスクが記憶域プールで構成されます。
記憶域プールで構成されたドライブを拡張する際は、ディスクの追加が必要になります。
OS についている既存のディスクを追加した場合、以下のように表示され既存のディスクで拡張した領域で記憶域プールのドライブを拡張することができません。
図.既存のディスク拡張前のOSのディスクの状態(対象のドライブ:F ドライブ)
図.既存のディスク拡張後のOSのディスクの状態(対象のドライブ:F ドライブ)
[対処方法]
既存のディスクを拡張した場合は、記憶域プールの作り直しが必要となります。
一例にはなりますが、以下のような方法で作り直しをします。
事前準備
事前準備として、現在の設定の確認と拡張したディスク上にあるドライブレターを一時的に変更するためSQL Server を止める必要があります。
同じドライブ文字を指定するため、拡張したディスクのドライブ文字を確認し、キャプチャやテキストメモに残しておきます。
本手順は F ドライブに SQL Server のデータファイルなどを配置している構成を想定した手順としています。
ディスクを再作成する際に同じストライプサイズを設定する必要があるため、現在のストライプサイズを確認し、キャプチャやテキストメモに残しておきます。
実行例:
Get-Virtualdisk | ft friendlyName, interleave
friendlyName interleave
------------ ----------
SQLVMVirtualDisk1 65536
SQLVMVirtualDisk2 65536
ご参考)ディスク ストライピング
https://learn.microsoft.com/ja-jp/azure/virtual-machines/premium-storage-performance#disk-striping
######## 抜粋 ########
ストライプ サイズ
ディスク ストライピングの重要な構成の 1 つに、ストライプ サイズがあります。
ストライプ サイズ (ブロック サイズ) は、アプリケーションがストライプ ボリュームで対応できるデータの最小チャンクです。
構成するストライプ サイズは、アプリケーションの種類と要求パターンによって異なります。
間違ったストライプ サイズを選択すると、IO の不均衡が生じ、アプリケーションのパフォーマンスが低下する可能性があります。
####################
実行例:
net stop SQLServerAgent /y
net stop MSSQLServer /y
※既定のインスタンス以外を使用している場合には、サービス名が異なるため適切なサービスを確認の上停止します。
!!重要!!
以降の操作で既存ディスクのドライブレター、ドライブ名を変更します。
SQL Server 以外に当該ドライブにアクセスするアプリケーションが存在する場合は、それらのアプリケーションも事前に停止します。
4.[Administrative Tools]->[Computer Management]->[Disk Management]から、今回修正するドライブを選択して右クリックし、[Change Drive Letter and Paths …]から任意のドライブレターに変更する
例)既存のドライブレターがFの場合、ドライブレターをXなどに変更します。
5.[Administrative Tools]->[Computer Management]->[Disk Management]から、今回修正するドライブを選択して右クリックし、[Properties]から[General]タブのドライブ文字を任意の名前に変更する
例)既存のドライブ文字がSQLVMDATAの場合、ドライブレターをSQLVMDATA2などに変更します。
① 新規にデータディスクを作成、追加
※サイズは最終的に必要なディスクのサイズを指定します。
図.データディスクの作成
4. [保存] を選択します。
5. 管理者ユーザにてVM にログインし、PowerShell を起動します。
6. New-StoragePool コマンドを使用して記憶域プールを作成します。
※既存と同じストレージプールの名称は使用できないため[SQLVMStoragePool2]など任意の名前を設定します。
実行例1:
// すべてのディスクを使用して記憶域プールを作成する場合
New-StoragePool –FriendlyName [記憶域プール名] –StorageSubsystemFriendlyName “Windows Storage*” –PhysicalDisks (Get-PhysicalDisk –CanPool $True)
例)
New-StoragePool –FriendlyName SQLVMStoragePool2 –StorageSubsystemFriendlyName “Windows Storage*” –PhysicalDisks (Get-PhysicalDisk –CanPool $True)
スタンドアロン サーバーに記憶域スペースを展開する | Microsoft Learn
7. New-VirtualDisk コマンドを使用して仮想ディスクを作成します。
※既存と同じ仮想ディスク名は使用できないため[SQLVMVirtualDisk2]など任意の名前を設定します。
実行例:
New-VirtualDisk -FriendlyName [仮想ディスク名] -StoragePoolFriendlyName [記憶域プール名] -ProvisioningType Fixed -ResiliencySettingName Simple -UseMaximumSize -Interleave [ストライプサイズ(65536 または262144)]
例)
New-VirtualDisk -FriendlyName SQLVMVirtualDisk2 -StoragePoolFriendlyName SQLVMStoragePool2 -ProvisioningType Fixed -ResiliencySettingName Simple -UseMaximumSize -Interleave 65536
8. Get-VirtualDisk コマンドを使用して新規ボリューム作成およびドライブ文字を割り当てます。
※コマンドを実行した際にフォーマットを確認するウィンドウが表示された場合、OK ボタンを選択します。
※ドライブレターは最終的に使用したい値(本手順の構成では F )を指定します。
実行例:
Get-VirtualDisk –FriendlyName [仮想ディスク名] | Get-Disk | Initialize-Disk –Passthru | New-Partition -DriveLetter [ドライブ文字] –UseMaximumSize | Format-Volume -NewFileSystemLabel [ドライブ名] -Force
例)
Get-VirtualDisk –FriendlyName SQLVMVirtualDisk2 | Get-Disk | Initialize-Disk –Passthru | New-Partition -DriveLetter F –UseMaximumSize | Format-Volume -NewFileSystemLabel SQLVMDATA -Force
② 新規のディスクにファイルをコピーして、SQL Server サービスを起動
コピー方法は任意ですが、一例として robocopy を使用した例を記載します。
※実際のパスなどは適宜読み替えて実施します。
コマンド例)
robocopy [src] [dst] /E /COPYALL /TEE /LOG:[logfile path]
例)
コピー元:X:\dir
コピー先:F:\dir
ログ出力先:コマンドプロンプトのカレントディレクトリにrobocopy.logという名前でログを出力
robocopy X:\dir F:\dir /E /COPYALL /TEE /LOG:robocopy.log
2. データフォルダおよび ログフォルダ配下のmdf 、ldf ファイルに「NT Service\MSSQLSERVER」ユーザのフルコントロールのアクセス権限を付与します。
※robocopy コマンドを使用した場合は不要です。
※既定のインスタンス以外を使用している場合や SQL Server サービスの起動アカウントを変更している場合には、「NT Service\MSSQLSERVER」部分を実際の SQL Server サービス起動アカウントに読み替えて作業します。
3. VM 上のコマンドプロンプトで以下のコマンドを実行し、サービスを開始して、問題なくデータベースにアクセスできることを確認します。
実行例:
net start MSSQLServer /y
net start SQLServerAgent /y
※既定のインスタンス以外を使用している場合には、サービス名が異なるため適切なサービスを確認の上起動します。
!!重要!!
以降の手順でもともとのディスクを削除するため必ずすべてのデータが正しくコピーできていることを確認します。
③ 不要なデータディスクを削除
!!重要!!
ドライブレターやドライブ文字を変更したディスクを含む記憶域プールに対して操作を実施します。
新規に追加した記憶域プールに対して操作を実施するとデータが削除されます。
5. [VIRTUAL DISKS] 欄にて仮想ディスクを右クリック、[Delete Virtual Disk] を選択し、表示される画面にて[Yes] を選択します。
6. [PHYSICAL DISKS] 欄にてにMsft Virtual Disk を右クリックし、[Remove Disk] を選択し、表示される画面にて[Yes] を選択します。
7. Azure Portal にログインしてVM の[概要] ページを表示し、左ペインのメニューより[ディスク] を選択します。
8. 拡張したデータディスクをデタッチします。
図.ディスクのデタッチ
9. [保存] を選択します。
10. Azure ポータルまたはVM にログインしてOS を再起動します。
11. SQL Server サービスが起動して、問題なくデータにアクセスできることを確認します。
12. リソースグループよりデタッチしたディスクのリソースを削除します。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.