SQL Server 存在一种 NUL 设备(注意不是 NULL),它是一个黑洞,是文件系统中的一个特殊“文件”。NUL 可以在 Windows 命令行中使用,其类似 Linux 系统中的 /dev/null,任何写入 NUL 的东西都会被丢弃。
当我们对某个数据库执行完整备份的时候,最简单的SQL如下所示:
BACKUP DATABASE AdventureWorks2012 TO DISK = N'AdventureWorks2012.BAK'
已为数据库 'AdventureWorks2012',文件 'AdventureWorks2012' (位于文件 1 上)处理了 24328 页。
已为数据库 'AdventureWorks2012',文件 'AdventureWorks2012_log' (位于文件 1 上)处理了 2 页。
BACKUP DATABASE 成功处理了 24330 页,花费 4.103 秒(46.326 MB/秒)。
执行完成后,在实例的默认备份路径可以找到其备份文件。实例的默认备份路径可通过以下SQL查询。
DECLARE @BackupDest VARCHAR(200)
EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE',N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory', @BackupDest OUTPUT, 'no_output';
SELECT @BackupDest
如果利用 NUL 设备呢?SQL Server 中备份至NUL设备有2种写法,NUL 后面加上冒号也是可以的。
BACKUP DATABASE AdventureWorks2012 TO DISK = N'NUL'
GO
BACKUP DATABASE AdventureWorks2012 TO DISK = N'NUL:'
GO
已为数据库 'AdventureWorks2012',文件 'AdventureWorks2012' (位于文件 1 上)处理了 24328 页。
已为数据库 'AdventureWorks2012',文件 'AdventureWorks2012_log' (位于文件 1 上)处理了 2 页。
BACKUP DATABASE 成功处理了 24330 页,花费 1.499 秒(126.803 MB/秒)。
NUL 设备可以判断备份的读吞吐量,即使你备份至多个NUL设备,IOPS也是差不多的,没什么效果。备份至NUL设备主要是读取数据,写数据并没有写入具体的磁盘中。
BACKUP DATABASE AdventureWorks2012 TO DISK = N'NUL',DISK = N'NUL',DISK = N'NUL',DISK = N'NUL' ,DISK = N'NUL'
那么,备份至NUL设备有什么用呢?
备份吞吐量验证或测试,上面备份至不同设备可以看到耗时不同,NUL设备可以验证读IOPS,作为参考可以验证写IOPS。(如上结果 46.326 MB/秒与126.803 MB/秒)
长期没有进行日志备份,日志会非常大,备份至文件系统耗时长,备份至NUL设备后再收缩(也可以设置简单模式直接收缩文件)。
开发或测试环境配置了相关高可用,完整模式下只能备份日志使其重用,但又没必要保留日志备份,可直接备份至NUL设备。
MSSQL 2016 及以上版本配置AlwaysOn AG,使用 automatic seeding 功能,配置可用性数据库前需要备份,可将数据库备份至NUL设备后再初始化同步。
如果你的环境要求不能中断备份链,但又打算在生产环境上进行测试,你可以在备份时加上参数 COPY_ONLY 进行备份。当然,备份时读取数据的影响与正常备份到文件一样,所以生产环境验证时需要专业人员确认其影响范围。