tempdb をインスタンスストアに配置します。 - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

tempdb をインスタンスストアに配置します。

Amazon EC2 インスタンスストアを使用するときは、tempdb のインスタンスストアボリュームを使用します。インスタンスストアは、インスタンスに一時的な (エフェメラルな) ブロックレベルのストレージを提供します。スピードとコストという 2 つの理由から、tempdb をインスタンスストアボリュームに配置することを推奨します。tempdb は一般的に最も使用頻度の高いデータベースであるため、利用可能なドライブが最も速いというメリットがあります。tempdb をインスタンスストアに配置するもう 1 つの利点は、インスタンスストアに対する I/O に個別に課金されないため、コストを削減できるということです。

tempdb は SQL Server を再起動するたびに再作成されるため、インスタンスを停止または終了してもデータが失われることはありません。ただし、エフェメラルディスクはマシンにローカルにアタッチされるため、別のホストで仮想マシンを起動するとインスタンスストアのボリュームは失われます。

インスタンスストアボリュームを使用する場合:

  • SQL Server サービスを開始する前にボリュームを初期化します。そうしないと、SQL Server の起動手順は失敗します。

  • インスタンスストアボリュームに対する権限 (フルコントロール) を SQL Server スタートアップアカウントに明示的に付与します。

tempdb をインスタンスストアに移動する

tempdb をインスタンスストアボリュームに移動するには:
  1. Windows から、管理者として diskmgmt.msc を実行し、ディスク管理システムユーティリティを開きます。

  2. 新しいディスクを初期化します。

  3. ディスクを右クリックし、[New Simple Volume] を選択します。

  4. 次の設定を使用してボリュームをフォーマットし、プロンプトを完了します。

    • ファイルシステム: NTFS

    • アロケーションユニットサイズ: 64K

    • ボリュームラベル: tempdb

    詳細については、マイクロソフトのウェブサイトにある「ディスクの管理に関する文書」 を参照してください。

  5. SQL Server インスタンスに接続し、次のコマンドを実行して tempdb データベースの論理ファイル名と物理ファイル名を記録します。

    $ sp_helpdb 'tempdb'

    次のスクリーンショットは、コマンドとその出力を示しています。

    
                Finding the logical and physical file name of the tempdb database

  6. tempdb ファイルを新しい場所に移動します。tempdb データベースファイルはすべて同じ初期サイズに設定してください。次の SQL サーバースクリプトの例は、tempdb ファイルを T ドライブに移動し、データファイルを同じサイズに設定します。

    USE master GO ALTER DATABASE TempDB MODIFY FILE (NAME = tempdev, FILENAME = 'T:\tempdb.mdf',SIZE = 524288KB) GO ALTER DATABASE TempDB MODIFY FILE (NAME = temp2, FILENAME = 'T:\tempdb_mssql_2.ndf',SIZE = 524288KB) GO ALTER DATABASE TempDB MODIFY FILE (NAME = temp3, FILENAME = 'T:\tempdb_mssql_3.ndf',SIZE = 524288KB) GO ALTER DATABASE TempDB MODIFY FILE (NAME = temp4, FILENAME = 'T:\tempdb_mssql_4.ndf',SIZE = 524288KB) GO ALTER DATABASE TempDB MODIFY FILE (NAME = templog, FILENAME = 'T:\templog.ldf') GO
  7. 次のスクリーンショットに示すように、SQL Server のスタートアップアカウントに tempdb データベースの新しい場所に対する権限を付与して、tempdb ファイルを作成できるようにします。

    
                Granting permissions to the new location of the tempdb database

  8. SQL Server を再起動して、tempdb の新しい場所を使用します。

    次のスクリーンショットに示すように、新しい場所に作成された tempdb ファイルが表示されます。

    
                The new location of the tempdb database

  9. tempdb ファイルを古い場所から削除します。

インスタンスの再起動や起動/停止の際に SQL Server が起動する前にインスタンスストアボリュームが初期化されていることを確認するには、次のセクションの手順に従います。そうしないと、tempdb が初期化されていないため、SQL Server の起動が失敗します。

インスタンスストアの初期化

データストアを初期化するには:
  1. Windows Services Manager (services.msc) を開き、SQL Serverとその依存サービス (SQL Server Agentなど) を手動で起動するように設定します。(インスタンスストアボリュームの準備ができたら、スクリプトを使用して起動します)。

  2. ユーザーデータとして Amazon EC2 インスタンスに渡す PowerShell スクリプトを作成します。このスクリプトは以下の処理を実行します:

    • エフェメラルストレージを検出し、そのための tempdb ドライブを作成します (例では T ドライブ)。

    • EC2 インスタンスが停止して再起動すると、エフェメラルディスクを更新します。

    • SQL Server スタートアップアカウントに、新しく初期化された tempdb ボリュームのフルコントロールを付与します。この例では、デフォルトのインスタンスを想定しているため、NT SERVICE\MSSQLSERVER を使用します。名前付きインスタンスの場合、これは通常デフォルトで NT SERVICE\MSSQL$<InstanceName> となります。

    • スクリプトをローカルボリューム (例では c:\scripts) に保存し、ファイル名 (InstanceStoreMapping.ps1) を割り当てます。

    • Windows タスクスケジューラを使用して、スケジュールされたタスクを作成します。このタスクは起動時に PowerShell スクリプトを実行します。

    • 前のアクションの後に SQL Server と SQL Server エージェントを起動します。

    以下のスクリプトは、「MS-SQL 可用性グループワークショップ」の 2 つ目のラボのスクリプトに若干の変更を加えたものです。EC2 インスタンスを起動するときにこのスクリプトを [ユーザー] データフィールドにコピーし、必要に応じてカスタマイズします。

<powershell> # Create pool and virtual disk for TempDB using the local NVMe, ReFS 64K, T: Drive $NVMe = Get-PhysicalDisk | ? { $_.CanPool -eq $True -and $_.FriendlyName -eq "NVMe Amazon EC2 NVMe"} New-StoragePool -FriendlyName TempDBPool -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $NVMe New-VirtualDisk -StoragePoolFriendlyName TempDBPool -FriendlyName TempDBDisk -ResiliencySettingName simple -ProvisioningType Fixed -UseMaximumSize Get-VirtualDisk -FriendlyName TempDBDisk | Get-Disk | Initialize-Disk -Passthru | New-Partition -DriveLetter T -UseMaximumSize | Format-Volume -FileSystem ReFS -AllocationUnitSize 65536 -NewFileSystemLabel TempDBfiles -Confirm:$false # Script to handle NVMe refresh on start/stop instance $InstanceStoreMapping = { if (!(Get-Volume -DriveLetter T)) { #Create pool and virtual disk for TempDB using mirroring with NVMe $NVMe = Get-PhysicalDisk | ? { $_.CanPool -eq $True -and $_.FriendlyName -eq "NVMe Amazon EC2 NVMe"} New-StoragePool -FriendlyName TempDBPool -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $NVMe New-VirtualDisk -StoragePoolFriendlyName TempDBPool -FriendlyName TempDBDisk -ResiliencySettingName simple -ProvisioningType Fixed -UseMaximumSize Get-VirtualDisk -FriendlyName TempDBDisk | Get-Disk | Initialize-Disk -Passthru | New-Partition -DriveLetter T -UseMaximumSize | Format-Volume -FileSystem ReFS -AllocationUnitSize 65536 -NewFileSystemLabel TempDBfiles -Confirm:$false #grant SQL Server Startup account full access to the new drive $item = gi -literalpath "T:\" $acl = $item.GetAccessControl() $permission="NT SERVICE\MSSQLSERVER","FullControl","Allow" $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission $acl.SetAccessRule($rule) $item.SetAccessControl($acl) #Restart SQL so it can create tempdb on new drive Stop-Service SQLSERVERAGENT Stop-Service MSSQLSERVER Start-Service MSSQLSERVER Start-Service SQLSERVERAGENT } } New-Item -ItemType Directory -Path c:\Scripts $InstanceStoreMapping | set-content c:\Scripts\InstanceStoreMapping.ps1 # Create a scheduled task on startup to run script if required (if T: is lost) $action = New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument 'c:\scripts\InstanceStoreMapping.ps1' $trigger = New-ScheduledTaskTrigger -AtStartup Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "Rebuild TempDBPool" -Description "Rebuild TempDBPool if required" -RunLevel Highest -User System </powershell>

バッファープール拡張機能の使用

バッファープールエクステンションを使用する予定がある場合は、エフェメラルボリュームに配置することも検討してください。ただし、導入前に徹底的にテストすることを強くお勧めします。バッファープール拡張と tempdb に同じボリュームを使用することは避けます。

注記

バッファープール拡張は便利な場合もありますが、RAM の代わりにはなりません。使用を決定する前に、Microsoft の Web サイトに記載されている詳細を参照してください。