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

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

tempdb をインスタンスストアに配置する

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

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

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

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

  • インスタンスストアボリュームに対するアクセス許可 (フルコントロール) をSQLサーバーのスタートアップアカウントに明示的に付与します。

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. 次のスクリーンショットに示すように、tempdb データベースの新しい場所にSQLサーバースタートアップアカウントアクセス許可を付与して、tempdb ファイルを作成できるようにします。

    Granting permissions to the new location of the tempdb database

  8. tempdb の新しい場所を使用するには、SQLサーバーを再起動します。

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

    The new location of the tempdb database

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

インスタンスの再起動または起動/停止が発生した場合にSQL、サーバーが起動する前にインスタンスストアボリュームが初期化されていることを確認するには、次のセクションのステップに従います。そうしないと、tempdb が初期化されなかったため、SQLサーバーの起動は失敗します。

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

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

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

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

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

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

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

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

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

    次のスクリプトは、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 サイトに記載されている詳細を参照してください。