我们在安装SQL Server的时候会在指定SQL Server各个服务的运行启动账户的账户的时候看到底下有一个选项写着“Grant Perform Volume Maintenance Task privilege.....”。准确的说,这个东西不是SQL Server的东西,“Perform Volume Maintenance Task”权限属于Windows的安全策略(Security Policy)范畴,这里其实只是通过一个UI界面改了本地的Windows安全策略。
那“Perform Volume Maintenance Task”是个什么东西呢?它代表的是Windows操作系统的“Instant File Initialization”特性。意思就是在Windows操作系统下,文件在被创建的时候是否执行“zeroing out”任务,也就是把文件系统分配给某个文件的空间都通过写0来清楚原先的数据。开启了文件及时初始化后在Windows下我们删除一个文件其实并没有把磁盘上的数据清除,而是留到下一次这部分空间被重新利用的时候才来复写。而“Instant File Initialization”的意思就是不执行“zeroing out”任务。
优点:
那么回到SQL Server来谈这个东西,它的作用就是在SQL Server每次文件被创建或者发生空间增长的时候不清楚旧数据,从而提高性能。这点会影响到CREATE DATABASE, ALTER DATABASE, RESTORE和AUTOGROWTH等场景。
缺点/风险:
安全风险是开启文件及时初始化的缺点。
局限性:
1)LOG文件不适用。至于说为什么LOG文件不适用,其实也不难理解。数据文件空间分配背后有GAM,SGAM, PFS以及内部表来支持数据空间的元数据验证,自然不会犯错,把原本不该是“属于自己的数据”当成是自己的,即便这部分数据还留在文件里面。可是LOG不同,LOG文件没有这层的逻辑来支持它。
2)不能是稀疏文件,比如Snapshot,DBCC CHECKDB命令运行时产生的结果文件(这个文件是自动产生);
3) Transparent Data Encryption数据库选项不能被开启;
4)跟踪标记(Trace Flag)1806不能被启用。这个标记的作用就是关闭及时文件初始化特性的。两者相斥。
那如果在安装的时候没勾选那个选项,后面怎么去启用呢?
打开安全策略修改就行。也就是这样SQL Server服务账号具备权限就自动启用的SQL Server的文件及时初始化。添加权限需要重启SQL Server服务,删除权限则需要重启服务器。
参考文献:
SQL Server Premier Field Engineer Blog -- How and Why to Enable Instant File Initialization