将 tempdb 放在实例存储中 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 tempdb 放在实例存储中

当您使用 Amazon EC2 实例存储时,请将实例存储卷用于 tempdb。实例存储为您的实例提供临时性(短暂的)块级存储。我们建议您在实例存储卷上放置 tempdb,原因有两个:速度和成本。Tempdb 通常是使用最频繁的数据库,因此它受益于最快的可用驱动器。将 tempdb 放在实例存储中的另一个好处是可以节省成本,因为您无需为实例存储的 I/O 单独付费。

每当您重新启动 SQL Server 时,都会重新创建 Tempdb,因此停止或终止实例不会导致数据丢失。但是,在另一台主机上启动虚拟机时,实例存储卷会丢失,因为临时磁盘是在本地连接到计算机的,因此请谨慎规划。

当您使用实例存储卷时:

  • 在 SQL Server 服务启动之前初始化卷。否则,SQL Server 启动过程将失败。

  • 向 SQL Server 启动账户明确授予对实例存储卷的权限(完全控制权)。

将 tempdb 移至实例存储

要将 tempdb 移动到实例存储卷,请执行以下操作:
  1. 在 Windows 中,以管理员身份运行 diskmgmt.msc 以打开“磁盘管理”系统实用程序。

  2. 初始化一个新磁盘。

  3. 右键单击菜单,然后选择 New Simple Volume (新建简单卷)

  4. 使用以下设置格式化卷,完成提示:

    • 文件系统:NTFS

    • 分配单位大小:64K

    • 卷标:tempdb

    有关更多信息,请参考 Microsoft 网站上的 Disk Management (磁盘管理)文档

  5. 连接到 SQL Server 实例,然后运行以下命令以记下 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. 重新启动 SQL Server 以使用 tempdb 的新位置。

    您将看到在新位置创建的 tempdb 文件,如以下屏幕截图所示。

    The new location of the tempdb database

  9. 从原来位置删除 tempdb 文件。

在实例重启或启动/停止的情况下,要确保在 SQL Server 启动之前初始化实例存储卷,请按照下一节中的步骤进行操作。否则,由于 tempdb 未初始化,SQL Server 启动将失败。

初始化实例存储

要初始化数据存储,请执行以下操作:
  1. 打开 Windows 服务管理器 (services.msc),将 SQL Server 及其相关服务(例如 SQL Server 代理)设置为手动启动。(当实例存储卷准备就绪时,您将使用脚本启动它。)

  2. 创建 PowerShell 脚本以用户数据形式传递给 Amazon EC2 实例。该脚本执行以下操作:

    • 检测临时存储并为其创建 tempdb 驱动器(示例中为驱动器 T)。

    • 如果 EC2 实例停止并重新启动,则刷新临时磁盘。

    • 授予 SQL Server 启动帐户对新初始化的 tempdb 卷的完全控制权。该示例假设一个默认实例,因此它使用 NT SERVICE\MSSQLSERVER。对于命名实例,通常默认值为 NT SERVICE\MSSQL$<InstanceName>

    • 将脚本保存在本地卷上(示例中的 c:\scripts),并为其分配一个文件名(InstanceStoreMapping.ps1)。

    • 使用 Windows Task Scheduler 创建计划任务。此任务在启动时运行 PowerShell 脚本。

    • 在执行之前的操作之后启动 SQL Server 和 SQL Server Agent。

    以下脚本来自 MS-SQL 可用性组研讨会的第二个实验,但有一些更改。启动 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 网站上提供的详细信息