适用于:SQL Server
Azure 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) 时会被阻止的数据文件的即时文件初始化不同,由于事务日志文件的增长方式以及以串行方式写入事务日志的事实,对于启用 TDE 的数据库上的事务日志增长,允许进行即时文件初始化。
即时文件初始化用于 Azure SQL 数据库和 Azure SQL 托管实例的“常规用途”和“业务关键”层,仅有利于事务日志文件的增长。
即时文件初始化在 Azure SQL 数据库和 Azure SQL 托管实例中不可配置。
启用即时文件初始化
仅当将 SE_MANAGE_VOLUME_NAME
特权授予数据库引擎服务的服务帐户或服务 SID 时,才能使用数据文件的即时文件初始化。 Windows 管理员组的成员具有此权限,可以通过将其添加到“执行卷维护任务”安全策略来将其授予其他用户。 在事务日志中,对于 SQL Server 2022 (16.x) 版本推出的多达 64 MB 的增长事件即时文件初始化,不需要 SE_MANAGE_VOLUME_NAME
特权。
建议将 SE_MANAGE_VOLUME_NAME
特权授予数据库引擎服务的服务 SID。 这可确保即使更改数据库引擎服务的服务帐户,授予也会保持不变。 有关详细信息,请参阅 使用服务 SID 向 SQL Server 中的服务授予权限。
重要说明
使用某些功能(如透明数据加密 (TDE))时,可能会阻止即时文件初始化 (IFI)。 在 SQL Server 2022(16.x)及更高版本中,以及 Azure SQL 数据库和 Azure SQL 托管实例上,允许在事务日志上使用 IFI。 有关详细信息,请参阅即时文件初始化和事务日志。
在 SQL Server 2016(13.x)及更高版本中,在安装期间,可以在安装时向数据库引擎服务安全标识符(SID)授予此权限。
如果使用命令提示符安装,请添加 /SQLSVCINSTANTFILEINIT
参数,或在安装向导中选中向 SQL Server 数据库引擎服务授予执行卷维护任务特权框。
若要向帐户或服务 SID Perform volume maintenance tasks
授予安全策略,请执行以下操作:
在将创建数据文件的计算机上,打开 本地安全策略 应用程序(
secpol.msc
)。在左侧窗格中,展开“本地策略”,然后选择“用户权限分配”。
在右侧窗格中,双击“执行卷维护任务”。
选择 “添加用户或组 ”,并添加数据库引擎服务帐户或其服务 SID。
选择“应用”,然后关闭所有“本地安全策略”对话框。
重启数据库引擎服务。
在启动时检查数据库引擎错误日志。
适用于:SQL Server(从 SQL Server 2012 (11.x) SP4、SQL Server 2014 (12.x) SP2、SQL Server 2016 (13.x) 及更高版本开始)。
如果向数据库引擎服务帐户或其服务 SID 授予
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.
如果未向数据库引擎服务帐户或其服务 SID 授予
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 服务帐户、其服务 SID 和本地管理员进行文件访问。 但是,分离文件时,没有 SE_MANAGE_VOLUME_NAME
特权的用户或服务可能可访问该文件。
以下情况存在类似的注意事项:
备份数据库。 如果未使用适当的 DACL 对备份文件进行保护,则未授权的用户或服务将可以使用删除的内容。
使用 IFI 增大文件。 SQL Server 管理员可能能够访问原始页面内容并查看以前删除的内容。
数据库文件托管在存储区域网络中。 存储区域网络也可能始终以预初始化形式呈现新页面,并且让操作系统重新初始化页面可能会产生不必要的开销。
如果担心可能会泄漏删除的内容,则应执行以下其中两项或一项操作:
务必确保所有分离的数据文件和备份文件都具有限制性的 DACL。
为 SQL Server 实例禁用即时文件初始化。 为此,请从数据库引擎服务帐户及其服务 SID 中撤消
SE_MANAGE_VOLUME_NAME
。注意
禁用 IFI 会增加数据文件的增长时间,并且只会影响在撤销权限后创建或增加的文件。
SE_MANAGE_VOLUME_NAME 特权
SE_MANAGE_VOLUME_NAME
可以在 Windows 管理工具本地安全策略小程序中分配特权。 在“本地策略”下,选择“用户权限分配”并修改“执行卷维护任务”属性。
性能注意事项
数据库文件初始化过程将零写入初始化下的文件的新区域。 此过程的持续时间取决于初始化的文件部分的大小,以及存储系统的响应时间和容量。 如果初始化需要很长时间,则可能在 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
。