こんにちは、SQL Server サポートです。
Azure の SQL VM(SQL Server on Windows Server) で FCI 環境を構成している場合のディスク拡張方法についてご紹介します。
Azure の SQL VM(SQL Server on Windows Server)をご利用中、SQL Server のサーバープロパティの[データベースの既定の場所]で設定しているドライブのストレージを拡張したくなった場合、Azure Portal の SQL 仮想マシンの[ストレージの構成]メニューからストレージの拡張が可能です。
しかしながら、FCI 構成を組んでいる場合、 SQL IaaS Agent 拡張機能の仕様上、軽量モードのみのインストールしかサポートされていないため、SQL 仮想マシンの[ストレージの構成]メニューの機能がご利用いただけません。
そのため、Azure Portalから拡張したいサイズのディスクを追加し、記憶域スペースを再作成することで拡張する手順をご紹介します。
■ 記憶域スペースを再作成する
手順の流れとして、既存の記憶域プールや仮想ディスクを残した状態で、既存のドライブレターとドライブ文字を変更し、ディスクを新規追加して記憶域プールと仮想ディスクを作成します。
【概要】
- 事前準備
- 新規にデータディスクを作成、追加
- 仮想ディスクの作成
- 新規のディスクにファイルをコピーして、SQL Server サービスを起動
- 不要なデータディスクを削除
■前提条件
Azure 共有ディスクを利用して FCI を構成した環境を前提としています。
その他の方法や 3rd パーティ製品を利用して構成した場合には以降の手順は適用できませんので事前にご確認ください。
フェールオーバー クラスター インスタンス - SQL Server on Azure VMs | Microsoft Docs
A. 事前準備
事前準備として、現在の設定の確認と既存ディスク上にあるドライブレターを一時的に変更するためSQL Serverを止める必要があります。
- 管理者ユーザにて VM にログインし、拡張したいディスクのドライブ文字・ドライブレターを確認
同じドライブ文字を指定するため、拡張したいディスクのドライブ文字を確認し、キャプチャやテキストメモに残しておきます。
- PowerShell を起動し、Get-Virtualdisk コマンドを利用して、仮想ディスクのストライプサイズを確認
仮想ディスクのストライプサイズは、SQL VM のデプロイ時に「全般」、「トランザクション処理」、「データウェアハウス」の選択により決定されます。
ディスクを再作成する際に同じストライプサイズを設定する必要があるため、現在のストライプサイズを確認し、キャプチャやテキストメモに残しておきます。
なお、「トランザクション処理」の場合は64KB(65536Byte) 、「全般」、「データウェアハウス」の場合は256KB(262144Byte) となります。
実行例:Get-Virtualdisk | ft friendlyName, interleave
出力結果(サンプル):
friendlyName interleave
------------ ----------
SQLVMVirtualDisk1 65536
SQLVMVirtualDisk2 65536
ご参考)Azure Premium Storage: 高パフォーマンス用の設計 - Azure Virtual Machines | Microsoft Docs
######## 抜粋 ########
ストライプ サイズ
ディスク ストライピングの重要な構成の 1 つに、ストライプ サイズがあります。
ストライプ サイズ (ブロック サイズ) は、アプリケーションがストライプ ボリュームで対応できるデータの最小チャンクです。
構成するストライプ サイズは、アプリケーションの種類と要求パターンによって異なります。
間違ったストライプ サイズを選択すると、IO の不均衡が生じ、アプリケーションのパフォーマンスが低下する可能性があります。
####################
ご参考)SQL Server VM のストレージを構成する - SQL Server on Azure VMs | Microsoft Docs
######## 抜粋 ########
Azure では、次の設定を使用して、SQL Server VM で記憶域プールを作成します。
設定 値
ストライプ サイズ 256 KB (データ ウェアハウス)、64 KB (トランザクション)
######################
- 以下のコマンドを実行してSQL Server のサービスを停止
実行例:net stop SQLServerAgent /y
net stop MSSQLServer /y
!!重要!!
以降の操作で既存ディスクのドライブレター、ドライブ名を変更します。
- [Administrative Tools] > [Computer Management] > [Disk Management] から、今回修正するドライブを選択して右クリックし、 [Change Drive Letter and Paths …] から任意のドライブレターに変更する
※ここで変更した元々のドライブレターを手順 B の 5 で指定します。
例)既存のドライブレターが F の場合、ドライブレターを X などに変更します。
- [Administrative Tools] > [Computer Management] > [Disk Management] から、今回修正するドライブを選択して右クリックし、 [Properties] から [General] タブのドライブ文字を任意の名前に変更する
※ここで変更した元々のドライブ文字を手順Bの 5 で指定します。
例)既存のドライブ文字がSQLVMDATAの場合、ドライブ文字をSQLVMDATA2などに変更します。
B. 新規にデータディスクを作成、追加
- Azure Portal にログインして VM の [概要] ページを表示し、左ペインのメニューより [ディスク] を選択
- [+ 新しいディスクを作成し接続する] を選択
- [ディスク名]、[ストレージの種類]、[サイズ] 欄を入力し、データディスクを新規作成
※サイズは最終的に必要なディスクのサイズを指定します。
- [保存] を選択
C.仮想ディスクの作成
- 管理者ユーザにて アクティブノードのVM にログインし、 PowerShell を起動
- New-StoragePool コマンドを使用して記憶域プールを作成
※既存と同じストレージプールの名称は使用できないため[SQLVMStoragePool3]など任意の名前を設定します
【これ以降の手順を実施する上での事前作業】
以下のPowerShell を実行して、作成する仮想ディスクがクラスターに自動追加されないようにする必要があります。
2-1. 以下を実行して、"Clustered Windows Storage*" サブシステムの AutomaticClusteringEnabled を 0 に変更します。
Get-StorageSubSystem -Model "Clustered Windows Storage*" | Set-StorageSubSystem -AutomaticClusteringEnabled 0
2-2. 以下を実行して、AutomaticClusteringEnabled が False になっていることを確認します。
Get-StorageSubSystem -Model "Clustered Windows Storage*" | select AutomaticClusteringEnabled
- 記憶域プールを作成します
PowerShell の New-StoragePool を使って記憶域プールを作成します。
$PD = Get-StorageNode -Name <ノードのFQDN> | Get-PhysicalDisk -CanPool $True
New-StoragePool -FriendlyName <作成するプール名> -StorageSubsystemFriendlyName “Clustered Windows Storage*” -PhysicalDisks $PD
- 仮想ディスクを作成します
各ノードで同一の名前を使用する場合、 PowerShell から実行する必要があります。
New-VirtualDisk -FriendlyName [仮想ディスク名] -StoragePoolFriendlyName [記憶域プール名] -ProvisioningType Fixed -ResiliencySettingName Simple -UseMaximumSize -Interleave [ストライプサイズ(65536 または262144)]
- ボリュームを作成します
各ノードで同一の名前を使用する場合、 PowerShell から実行する必要があります。
Get-VirtualDisk –FriendlyName [仮想ディスク名] | Get-Disk | Initialize-Disk –Passthru | New-Partition -DriveLetter [ドライブ文字] –UseMaximumSize | Format-Volume -NewFileSystemLabel [ドライブ名] -Force
D. 新規のディスクにファイルをコピーして、SQL Server サービスを起動
- データドライブおよび ログドライブ配下のファイルを全て同一ディレクトリ構造で、新規のディスクにコピーする
コマンド)
robocopy [src] [dst] /E /COPYALL /TEE /LOG:[logfile path]
例)
コピー元:X:\dir コピー先:D:\dir
ログ出力先:コマンドプロンプトのカレントディレクトリにrobocopy.logという名前でログを出力
robocopy X:\dir D:\dir /E /COPYALL /TEE /LOG:robocopy.log
参考)robocopy | Microsoft Docs
- データドライブおよび ログドライブ配下のmdf 、ldf ファイルに「NT Service\MSSQLSERVER」ユーザのフルコントロールのアクセス権限を付与
※robocopy コマンドを使用した場合は不要です。
- VM 上のコマンドプロンプトで以下のコマンドを実行し、サービスを開始して、問題なくデータベースにアクセスできることを確認
実行例:net start MSSQLServer /y
net start SQLServerAgent /y
!!重要!!
移行の手順でもともとのディスクを削除するため必ずすべてのデータが正しくコピーできていることを確認します
E. 不要なデータディスクを削除
- 管理者ユーザにて VM にログインし、Server Manager を起動
- 左ペインより [File and Storage Services] を選択
- 表示されるメニューより [Storage Pools] を選択
- [STORAGE POOLS] 欄にて既存の記憶域プールを選択し、 [VIRTUAL DISKS] 欄に表示される仮想ディスクを右クリック、 [Detach Virtual Disk] を選択し、表示される画面にて [Yes] を選択
!!重要!!
手順Aの4-5でドライブレターやドライブ文字を変更したディスクを含む記憶域プールに対して操作を実施します。
新規に追加した記憶域プールに対して操作を実施するとデータが削除されます。
- [VIRTUAL DISKS] 欄にて仮想ディスクを右クリック、[Delete Virtual Disk] を選択し、表示される画面にて[Yes] を選択
- [PHYSICAL DISKS] 欄にてにMsft Virtual Disk を右クリックし、[Remove Disk] を選択し、表示される画面にて[Yes] を選択
- Azure Portal にログインしてVM の[概要] ページを表示し、左ペインのメニューより[ディスク] を選択
- 既存のデータディスクをデタッチ
- [保存] を選択
- Azure ポータルまたはVM にログインしてOS を再起動
- SQL Server サービスが起動して、問題なくデータにアクセスできることを確認
- リソースグループよりデタッチしたディスクのリソースを削除
参考)
スタンドアロン構成の手順は以下をご参照ください。
Azure Windows VM で記憶域スペースを拡張する | Japan Azure IaaS Core Support Blog (jpaztech.github.io)
※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。