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. ディスクを右クリックして、「新規シンプルボリューム」を選択します。

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

    • ファイルシステム: NTFS

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

    • ボリュームラベル:tempdb

    詳細については、Microsoft のウェブサイトの「ディスク管理」を参照してください

  5. SQL Server インスタンスConnect し、次のコマンドを実行して tempdb データベースの論理ファイル名と物理ファイル名を書き留めます。

    $ sp_helpdb 'tempdb'

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

    
                Finding the logical and physical file name of the tempdb database

  6. tempdb ファイルを新しい場所に移動します。すべての tempdb データベースファイルは必ず同じ初期サイズに設定してください。次の SQL Server スクリプトのサンプルは、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. tempdb の新しい場所を使用するには、SQL Server を再起動します。

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

    
                The new location of the tempdb database

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

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

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

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

  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 サイトに記載されている詳細を参照してください