为了在 Azure VM 上使 SQL Server 更高效,将 tempdb 放在临时存储上。

Azure VM 上的SQL Server

本文介绍如何通过使用某些Azure VM 可用的本地 SSD 临时存储(例如,将 tempdb 系统数据库移动到本地 SSD 驱动器或使用本地 SSD 驱动器扩展缓冲池)来提高SQL Server on Azure Virtual Machines(VM)上的工作负荷的性能。

概述

附加到某些Azure Virtual Machines(VM)的本地 SSD 驱动器提供优化的临时存储:一个以物理方式连接到主机的高性能磁盘。 每当解除分配或移动 VM(例如在维护或调整大小期间),将重新创建此临时存储。 不管怎样,将 SQL Server tempdb 系统数据库放在临时存储上不会带来任何风险,因为每次重新启动SQL Server时都会重新创建数据库。

建议将tempdb放在临时驱动器上,因为临时驱动器经过优化的低延迟和高 IOPS 可以显著提升严重依赖临时对象的工作负载性能,包括:

  • 处理大型记录集的查询
  • 索引创建和维护
  • 行版本控制隔离级别
  • 临时表
  • 触发器

但是,由于本地 SSD 驱动器是非永久性的,因此每当 VM 停止、解除分配或重新定位到新主机时,其内容和权限都将丢失。 这需要仔细规划,并考虑以下事项:

  • 重启时重新配置tempdb 每次 VM 重启时,都必须重新配置以使用临时磁盘(通常为 D:)。 对于来自 Azure Marketplace 的 Azure VM 映像上的 SQL Server,此过程使用 SQL IaaS 代理扩展自动化操作,通过在 VM 启动时自动创建文件夹和处理权限来简化管理。 但是,如果手动安装SQL Server,则需要配置 tempdb,以便在每次 VM 重启时手动使用临时磁盘。 可以使用 PowerShell 和任务计划程序等 自动执行 此过程。

  • 独占使用tempdb 应是唯一存储在本地 SSD 驱动器上的数据。 永久性数据(如数据文件、日志文件或备份)不得放置在临时存储上,因为每次 VM 重启或解除分配时,它们都会丢失。

先决条件

在配置 tempdb 以使用临时存储之前,需要满足以下先决条件:

  • 一个Azure订阅。 如果没有Azure订阅,请创建一个 trial 帐户

  • SQL Server手动安装到 Azure VM

  • 初始化的临时磁盘。 在Azure VM 上,临时磁盘通常装载为 D: 驱动器。 如果配置不同,请相应地调整说明。

注释

本文假定已手动安装SQL Server,因为从 Azure Marketplace 在 Azure VM 映像上部署SQL Server时,会自动将 tempdb 配置为使用临时存储。

将 tempdb 配置为使用临时存储

在维护时段内,可以通过Transact-SQL将 SQL Server tempdb 配置为使用临时磁盘。 如下所示:

  • tempb 数据库可以有多个数据文件,例如 tempdb.mdftempdb2.mdtempdb3.md,具体取决于SQL Server配置。 必须为MODIFY FILE运行命令,以重新配置tempdb以使用临时磁盘,例如D:\SQLTemp

  • 可以查询 sys.master_filesWHERE database_id = 2)来标识所有 tempdb 数据文件。

  1. 在本地 SSD 驱动器上创建文件夹,例如 D:\SQLTemp

  2. 打开SQL Server Management Studio(SSMS)并连接到SQL Server实例。

  3. 运行以下 T-SQL 命令以配置 tempdb 使用临时磁盘:

    USE master;
    GO
    
    ALTER DATABASE tempdb
        MODIFY FILE (NAME = tempdev, FILENAME = 'D:\SQLTemp\tempdb.mdf'); -- to move data files
    GO
    
    ALTER DATABASE tempdb
        MODIFY FILE (NAME = templog, FILENAME = 'D:\SQLTemp\templog.ldf'); -- to move log files
    GO
    
  4. 重启SQL Server实例以应用更改。

  5. tempdb通过运行以下 T-SQL 命令验证是否使用临时磁盘:

    USE tempdb;
    GO
    
    EXECUTE sp_helpfile;
    GO
    
  6. 检查临时磁盘上的文件夹,验证 tempdb 是否在 D:\SQLTemp 文件夹中创建了文件。

启动时自动执行 tempdb 配置

由于重启 VM 时,临时驱动器上的内容会丢失,因此在启动SQL Server之前未创建 tempdb 文件夹时,SQL Server无法启动。 可以使用 PowerShell 在SQL Server服务启动之前自动创建文件夹。

若要在启动时自动 tempdb 执行配置,请执行以下步骤:

  1. 配置服务:将SQL Server和SQL Server Agent服务设置为手动启动。 这样可以防止他们在创建文件夹之前自动启动。

  2. 创建 PowerShell 脚本,该脚本在临时磁盘上创建文件夹并启动 SQL Server 和 SQL 代理服务。

  3. 使用Windows计划任务在系统启动时运行脚本。 使用帐户配置任务,以确保无论用户是否已登录都能运行任务。

以下部分提供了每个步骤的详细说明。

配置启动模式

由于希望脚本在SQL Server启动之前创建要运行的文件夹,需要设置SQL Server和 SQL 代理服务以手动启动。 为此,请执行以下步骤:

  1. 打开 SQL Server Configuration Manager

  2. 在左窗格中选择 SQL Server Services

  3. 右键单击 SQL Server 服务,然后选择 Properties 打开 Properties 窗口。

  4. “属性 ”窗口中,选择“ 服务 ”选项卡。

  5. “服务 ”选项卡上,使用下拉列表将 “开始模式 ”更改为 “手动”:

  6. 使用 “应用” 保存更改,然后 确定 关闭窗口。

  7. SQL Server Agent 服务重复这些步骤。

创建 PowerShell 脚本

创建一个 PowerShell 脚本,该脚本:

  1. 在临时磁盘上创建文件夹。
  2. 启动SQL Server服务。
  3. 启动 SQL 代理服务。

复制并粘贴以下脚本,根据需要对其进行修改,并将其另存为 OS 驱动器上的 PowerShell 文件,例如 C:\Scripts\SQLStartup.ps1

$SQLService = "SQL Server (MSSQLSERVER)"
$SQLAgentService = "SQL Server Agent (MSSQLSERVER)"
$tempfolder = "D:\SQLTEMP"
if (!(test-path -path $tempfolder)) {
    New-Item -ItemType directory -Path $tempfolder
}
Start-Service $SQLService
Start-Service $SQLAgentService

注释

该脚本假定SQL Server实例是默认实例。 如果使用命名实例,请将 MSSQLSERVER 替换为SQL Server实例的名称。

创建运行脚本的计划任务

创建计划任务以在启动时运行 PowerShell 脚本。 为此,请执行以下步骤:

  1. 从“开始”菜单打开 任务计划程序

  2. “作”下,选择“ 创建基本任务 ”以打开 “创建任务” 窗口。

  3. 在“ 创建基本任务 ”选项卡上,输入任务的名称,例如 SQL-startup,并提供说明。 选择“下一步”。

  4. 在“ 触发器 ”选项卡上,选中 计算机启动时 并选择“ 下一步”。

  5. 在“ ”选项卡上,选择“ 启动程序 ”,然后选择“ 下一步”。

  6. 在“启动程序”选项卡上,n“程序/脚本”框,输入powershell.exe并在“添加参数”(可选)框中输入脚本的路径,例如: -ExecutionPolicy Bypass -File C:\Scripts\SQLStartup.ps1

  7. 查看“ 完成 ”选项卡上的摘要,然后选择“ 完成 ”以创建任务:

    任务计划程序“创建基本任务”窗口的屏幕截图,其中显示了输入脚本路径的位置。

测试脚本

重启 VM 以测试脚本。 VM 重启后,请检查 tempdb 数据文件是否位于临时磁盘上,以及SQL Server和 SQL 代理服务是否正在运行。

配置缓冲池扩展

可以通过配置 buffer 池扩展 来进一步增强 SQL Server 的性能,以使用 Azure VM 上的本地 SSD 驱动器。 此功能通过使用磁盘上的文件来提升超过可用 RAM 的内存密集型工作负荷的 I/O 吞吐量,从而扩展内存中缓冲池。 由于本地 SSD(临时存储)提供低延迟和高性能,因此它是此扩展的理想位置。

配置缓冲池扩展时,请指定文件大小(KB)、兆字节(MB)或千兆字节(GB)。 建议的大小通常是 max server memory (MB) 设置的 4 到 8 倍,但对于标准版,上限为 4 倍(企业版允许最多 32 倍)。 例如,如果 max server memory (MB)设置为 16 GB,则目标为缓冲池扩展大小 64-128 GB,根据SQL Server版本和工作负荷需求进行调整。

假设临时驱动器上存在指定的路径(如 D:\SQLTEMP\),若要启用缓冲池扩展,请在连接到实例后在 SQL Server Management Studio (SSMS) 中执行以下 T-SQL 命令:

ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION ON
( FILENAME = 'D:\SQLTEMP\ExtensionFile.BPE' , SIZE = <size> [ KB | MB | GB ] )