在 Linux 上的 tmpfs 上启用并运行适用于 SQL Server 2025 预览版的 tempdb

适用于: SQL Server 2025 (17.x) 预览版 - Linux

本文介绍如何在 SQL Server 2025 (17.x) 预览版中的 tmpfs 文件系统上启用和运行tempdb数据库文件。

Linux 上的 SQL Server 和容器传统上支持 XFSext4 文件系统来部署 SQL Server 数据库文件和日志。 但是,对于临时数据库(例如 tempdb,不需要将数据从一个运行时间周期保存到另一个时间段),使用利用内存(RAM)的 tmpfs 文件系统可以增强基于工作负荷的整体性能 tempdb

有关 tmpfs 文件系统的详细信息,请参阅 tmpfs - Linux 内核文档

配置 DESCRIPTION
支持的配置 tmpfs 非常适合用于存储不需要在重启时保存的非持久性数据。 目前,仅在tempdb数据库文件位于tmpfs文件系统上时才支持基于容器和非容器的部署。
不支持的配置 tmpfs 文件系统可用于 SQL 容器部署中的用户数据库,但仅用于开发目的。 但是,不支持此配置。 可以在 GitHub 上提供此方案的反馈。

物理或虚拟机部署

若要在物理或虚拟机上为 Linux 上的 SQL Server 启用 tmpfs 支持,需要正确装载 tmpfs 文件系统,这需要 sudo 访问。 设置装入点后,可以将tempdb文件放置在这些装入点上,并使用tempdbtmpfs文件系统上挂载的文件启动 SQL Server。

启用 tempdb 的 tmpfs

  1. 创建 tempdb 目录。

    使用mkdir命令为tempdb数据库创建目录。 确保它由 mssql 用户和组拥有,以允许 SQL Server 访问:

    mkdir /var/opt/mssql/tempdb
    sudo chown mssql. /var/opt/mssql/tempdb
    
  2. 装载 tmpfs 文件系统。

    使用以下命令装载 tmpfs 文件系统:

    sudo mount -t tmpfs -o size=4G tmpfs /var/opt/mssql/tempdb/
    

    -t 选项指定文件系统的类型,在本例中为 tmpfs

    使用 -o 此选项可以指定装载选项。 在这里, size=4Gtmpfs 的最大大小设置为 4 GB,这意味着它可以使用高达 4 GB 的 RAM。

    此命令将 tmpfs 装载到 SQL Server tempdb 数据库使用的目标目录。

    (可选)将其添加到 fstab 以在重启后保持装载:

    echo "tmpfs /var/opt/mssql/tempdb tmpfs defaults,size=4G 0 0" | sudo tee -a /etc/fstab
    
  3. 更新 tempdb 文件位置。

    确保 SQL Server 已启动并运行。 使用 SQL Server Management Studio(SSMS)连接到 SQL Server 实例,并运行以下 T-SQL 命令。

    使用以下 T-SQL 脚本标识所有 tempdb 文件,然后运行以下命令 ALTER DATABASE 以更新 tempdb 文件位置:

    SELECT [name], physical_name
    FROM sys.master_files
    WHERE database_id = 2;
    

    根据你看到 tempdb的文件数,创建 ALTER DATABASE 命令,如下所示:

    ALTER DATABASE tempdb
    MODIFY FILE (NAME = tempdev, FILENAME = '/var/opt/mssql/tempdb/tempdb.mdf');
    
    ALTER DATABASE tempdb
    MODIFY FILE (NAME = tempdev2, FILENAME = '/var/opt/mssql/tempdb/tempdb2.mdf');
    
    ALTER DATABASE tempdb
    MODIFY FILE (NAME = tempdev3, FILENAME = '/var/opt/mssql/tempdb/tempdb3.mdf');
    
    ALTER DATABASE tempdb
    MODIFY FILE (NAME = tempdev4, FILENAME = '/var/opt/mssql/tempdb/tempdb4.mdf');
    
    ALTER DATABASE tempdb
    MODIFY FILE (NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf');
    
  4. 重启 SQL Server 以应用更改。

    sudo systemctl restart mssql-server
    
  5. 验证 tempdb 文件位置。

    SQL Server 启动并运行后,使用 SQL Server Management Studio(SSMS)等工具连接到 SQL Server,验证 tempdb 数据和日志文件现在是否位于新目录中。

   SELECT [name], physical_name
   FROM sys.master_files
   WHERE database_id = 2;

现在应会看到新装载路径/var/opt/mssql/tempdb上的所有tempdb数据库文件。

tmpfs 挂载的热调整大小

如果tempdb已满,可以热调整tmpfs装载的大小。 若要热重设大小,请运行以下命令,将 tmpfs 装载大小调整为 6 GB:

mount -o remount,size=6G /var/opt/mssql/tempdb

(可选)通过修改 fstab 条目,使新大小在重启时保持保留:

sudo sed -i 's|tmpfs /var/opt/mssql/tempdb tmpfs defaults,size=4G 0 0|tmpfs /var/opt/mssql/tempdb tmpfs defaults,size=6G 0 0|' /etc/fstab

容器部署

对于开发人员工作负载, tmpfs 可用于用户数据库。 tmpfs 文件系统可以显著加快容器中部署的用户数据库的测试用例。 由于 tmpfs 使用 RAM 而不是磁盘存储,因此它允许快速读取/写入作。 此配置在开发和测试环境中非常有用,需要快速迭代。

用户数据库不支持 tmpfs。 可以在 GitHub 上的 tmpfs 上提供与用户数据库相关的反馈。

仅在 tmpfs 文件系统上托管 tempdb 数据库

如果要部署 SQL Server 容器,并且想要确保容器使用 tmpfs 作为 tempdb,可以运行以下命令:

docker run \
  -e ACCEPT_EULA=Y \
  -e MSSQL_SA_PASSWORD = <password>\
  --tmpfs /var/opt/mssql/tempdb:uid=10001,gid=10001,size=4G \
  -p 5433:1433 \
  --name sql1 \
  -h sql1 \
  --d mcr.microsoft.com/mssql/server:2025-latest

--tmpfs 命令将大小设置为 4 GB,并将 uid(用户 ID)和 gid(组 ID)设置为 10001,以确保正确设置所需的权限,使要创建的 tempdb 文件能够拥有正确的权限。

容器启动并运行后,使用 SSMS 连接到 SQL Server,并使用以下 T-SQL 命令将 tempdb 文件移动到新位置 /var/opt/mssql/tempdb

SELECT [name], physical_name
FROM sys.master_files
WHERE database_id = 2;

根据看到的文件数,修改以下命令。 在此示例中,有四 tempdb 个文件和一个日志文件。 使用以下命令将这些文件移动到其新位置:

ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = '/var/opt/mssql/tempdb/tempdb.mdf');
GO

ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev2, FILENAME = '/var/opt/mssql/tempdb/tempdb2.mdf');
GO

ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev3, FILENAME = '/var/opt/mssql/tempdb/tempdb3.mdf');
GO

ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev4, FILENAME = '/var/opt/mssql/tempdb/tempdb4.mdf');
GO

ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf');
GO

移动文件后,使用以下命令停止并重启容器

docker stop sql1
docker start sql1

在 tmpfs 上部署包含所有数据和日志文件的容器

警告

不支持此配置,但可用于开发目的。 可以在 GitHub 上提供此方案的反馈。

docker run -e ACCEPT_EULA=Y \
  -e MSSQL_SA_PASSWORD=<password> \
  --tmpfs /var/opt/mssql/data:uid=10001,gid=10001,size=4G \
  -p 5434:1433 \
  --name sql2 \
  -h sql2 \
  -d mcr.microsoft.com/mssql/server:2025-latest