数据库即时文件初始化

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本文将介绍即时文件初始化 (IFI),以及如何启用此功能以加速 SQL Server 数据库文件的增长。

默认情况下,初始化数据和日志文件以覆盖之前删除的文件遗留在磁盘上的任何现有数据。 执行以下操作时,应首先通过零填充(用零来填充)数据和日志文件来初始化这些文件:

  • 创建数据库。
  • 向现有数据库添加数据或日志文件。
  • 增大现有文件的大小(包括自动增长操作)。
  • 还原数据库或文件组。

在 SQL Server 中,即时文件初始化会回收已使用的磁盘空间,而不是用零来填充该空间,因此可以更快执行前面提到的文件操作。 相反,新数据写入文件时会覆盖磁盘内容。

在 Azure SQL 数据库和 Azure SQL 托管实例中,即时文件初始化仅可用于事务日志文件。

即时文件初始化和事务日志

适用于:SQL Server 2022 (16.x) 及更高版本、Azure SQL 数据库和 Azure SQL 托管实例。

根据历史经验,事务日志文件无法即时初始化。 但从 SQL Server 2022 (16.x)(所有版本)起,在 Azure SQL 数据库和 Azure SQL 托管实例中即时文件初始化可能有利于处理不超过 64 MB 的事务日志自动增长事件。 新数据库的默认自动增长大小增量为 64 MB。 大于 64 MB 的事务日志文件自动增长事件则无法利用即时文件初始化。

由于事务日志文件的扩展方式性质以及事务日志采用串行方式写入这一事实,使用即时文件初始化有利于采用透明数据加密 (TDE) 的数据库的事务日志增长。

  • 即时文件初始化仅用于 Azure SQL 数据库和 Azure SQL 托管实例的“常规用途”和“业务关键”层,以利于事务日志文件的增长。
  • 即时文件初始化在 Azure SQL 数据库和 Azure SQL 托管实例中不可配置。

启用即时文件初始化

即时文件初始化功能仅在向 SQL Server 服务启动帐户授予了 SE_MANAGE_VOLUME_NAME 权限后才可用。 Windows Administrator 组的成员拥有此权限,并可以通过将其他用户添加到 执行卷维护任务 安全策略中来为其授予此权限。 对于事务日志中不超过 64 MB 的增长事件,随 SQL Server 2022 (16.x) 发布引入的即时文件初始化不需要 SE_MANAGE_VOLUME_NAME 权限。

重要

某些功能(如透明数据加密 [TDE])的使用可能会阻止即时文件初始化。 从 SQL Server 2022 (16.x) 开始,在 Azure SQL 数据库和 Azure SQL 托管实例上允许在事务日志中记录 IFI。 有关详细信息,请参阅即时文件初始化和事务日志

注意

从 SQL Server 2016 (13.x) 开始,可在安装期间向服务帐户授予此权限。

如果使用命令提示符安装,请添加 /SQLSVCINSTANTFILEINIT 参数,或选中安装向导中“授予 SQL Server 数据库引擎服务执行卷维护任务权限”复选框。

要向一个帐户授予 Perform volume maintenance tasks 权限:

  1. 在将要创建数据文件的计算机上打开本地安全策略应用程序 (secpol.msc)。

  2. 在左侧窗格中,展开“本地策略”,然后选择“用户权限分配”

  3. 在右侧窗格中,双击“执行卷维护任务”

  4. 选择“添加用户或组”,然后添加可运行 SQL Server 服务的帐户

  5. 选择“应用”,然后关闭所有“本地安全策略”对话框

  6. 重启 SQL Server 服务。

  7. 在启动时检查 SQL Server 错误日志。

    适用于:SQL Server(从 SQL Server 2012 (11.x) SP4、SQL Server 2014 (12.x) SP2、SQL Server 2016 (13.x) 及更高版本开始)。

    1. 如果向 SQL Server 服务启动帐户授予了 SE_MANAGE_VOLUME_NAME 权限,则将记录与以下示例类似的说明性消息:

      Database Instant File Initialization: enabled. For security and performance considerations see the topic 'Database Instant File Initialization' in SQL Server Books Online. This is an informational message only. No user action is required.

    2. 如果授予 SQL Server 服务启动帐户 SE_MANAGE_VOLUME_NAME,将记录类似如下示例的消息:

      Database Instant File Initialization: disabled. For security and performance considerations see the topic 'Database Instant File Initialization' in SQL Server Books Online. This is an informational message only. No user action is required.

    注意

    在 SQL Server 中,可在 sys.dm_server_services 动态管理视图中使用 instant_file_initialization_enabled 的值来确定实例是否启用了即时文件初始化。

安全注意事项

建议启用即时文件初始化,因为其优势可能远大于安全风险。

使用即时文件初始化,只有将新数据写入文件时才会覆盖已删除的磁盘内容。 出于此原因,在数据文件的该特定区域写入其他数据之前,未经授权的主体可能访问已删除的内容。

当数据库文件连接到 SQL Server 实例之后,可以通过文件中的随机访问控制列表 (DACL) 来降低此信息泄露的风险。 此 DACL 仅允许 SQL Server 服务帐户和本地管理员访问文件。 但是,当文件分离以后,可以由不具有 SE_MANAGE_VOLUME_NAME 的用户或服务访问。

以下情况有类似的注意事项:

  • 备份数据库时。 如果未使用适当的 DACL 对备份文件进行保护,则未授权的用户或服务将可以使用删除的内容。

  • 使用 IFI 增大文件时。 SQL Server 管理员可能会访问原始页面内容并查看以前删除的内容。

  • 数据库文件托管在存储区域网络中。 存储区域网络也可能始终向以预先初始化的形式提供新页面,让操作系统重新初始化页面可能会产生不必要的开销。

如果担心可能会泄漏删除的内容,则应执行以下两种或其中一种操作:

  • 请始终确保所有分离的数据文件和备份文件都具有限制性的 DACL。

  • 为 SQL Server 实例禁用即时文件初始化。 要进行此操作,请从 SQL Server 服务启动帐户撤消 SE_MANAGE_VOLUME_NAME

    注意

    禁用该功能将延长数据文件的分配时间,且只会影响在撤消用户权限后创建的文件或增加的文件部分。

SE_MANAGE_VOLUME_NAME 用户权限

可在 Windows Administrative ToolsLocal Security Policy 小程序中分配 SE_MANAGE_VOLUME_NAME 用户特权。 在“本地策略”下选择“用户权限分配”并修改“执行卷维护任务”属性

性能注意事项

数据库文件初始化过程将零写入进行初始化的文件的新区域。 此过程的持续时间取决于初始化的文件部分的大小以及存储系统的响应时间和容量。 如果初始化需要很长时间,则可能在 SQL Server 错误日志和应用程序日志中看到以下消息。

Msg 5144
Autogrow of file '%.*ls' in database '%.*ls' was cancelled by user or timed out after %d milliseconds. Use ALTER DATABASE to set a smaller FILEGROWTH value for this file or to explicitly set a new file size.
Msg 5145
Autogrow of file '%.*ls' in database '%.*ls' took %d milliseconds. Consider using ALTER DATABASE to set a smaller FILEGROWTH for this file.

数据库和/或事务日志文件的长时间自动增长会导致查询性能问题。 这是因为,要求文件自动增长的操作在文件增长操作期间保留到锁定或闩锁等资源。 可能看到分配页面的闩锁上出现长时间等待。 需要长时间自动增长的操作将显示等待类型 PREEMPTIVE_OS_WRITEFILEGATHER