本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 tempdb 放在实例存储中
当您使用 Amazon EC2 实例存储时,请将实例存储卷用于 tempdb。实例存储为您的实例提供临时性(短暂的)块级存储。我们建议您在实例存储卷上放置 tempdb,原因有两个:速度和成本。Tempdb 通常是使用最频繁的数据库,因此它受益于最快的可用驱动器。将 tempdb 放在实例存储中的另一个好处是可以节省成本,因为您无需为实例存储的 I/O 单独付费。
每当您重新启动 SQL Server 时,都会重新创建 Tempdb,因此停止或终止实例不会导致数据丢失。但是,在另一台主机上启动虚拟机时,实例存储卷会丢失,因为临时磁盘是在本地连接到计算机的,因此请谨慎规划。
当您使用实例存储卷时:
-
在 SQL Server 服务启动之前初始化卷。否则,SQL Server 启动过程将失败。
-
向 SQL Server 启动账户明确授予对实例存储卷的权限(完全控制权)。
将 tempdb 移至实例存储
要将 tempdb 移动到实例存储卷,请执行以下操作:
-
在 Windows 中,以管理员身份运行
diskmgmt.msc
以打开“磁盘管理”系统实用程序。 -
初始化一个新磁盘。
-
右键单击菜单,然后选择 New Simple Volume (新建简单卷)。
-
使用以下设置格式化卷,完成提示:
-
文件系统:NTFS
-
分配单位大小:64K
-
卷标:tempdb
有关更多信息,请参考 Microsoft 网站上的 Disk Management (磁盘管理)文档
。 -
-
连接到 SQL Server 实例,然后运行以下命令以记下 tempdb 数据库的逻辑和物理文件名:
$ sp_helpdb 'tempdb'
下列屏幕截图展示了该命令及其输出。
-
将 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
-
向 SQL Server 启动帐户授予访问 tempdb 数据库新位置的权限,使其可以创建 tempdb 文件,如以下屏幕截图所示。
-
重新启动 SQL Server 以使用 tempdb 的新位置。
您将看到在新位置创建的 tempdb 文件,如以下屏幕截图所示。
-
从原来位置删除 tempdb 文件。
在实例重启或启动/停止的情况下,要确保在 SQL Server 启动之前初始化实例存储卷,请按照下一节中的步骤进行操作。否则,由于 tempdb 未初始化,SQL Server 启动将失败。
初始化实例存储
要初始化数据存储,请执行以下操作:
-
打开 Windows 服务管理器 (
services.msc
),将 SQL Server 及其相关服务(例如 SQL Server 代理)设置为手动启动。(当实例存储卷准备就绪时,您将使用脚本启动它。) -
创建 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 网站上提供的详细信息