-- Estimate the amount of total buffer memory that a particular full database backup to a physical disk would use
-- Reference: http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/06/incorrect-buffercount-data-transfer-option-can-lead-to-oom-condition.aspx
declare @MaxTransferSize float,
@BufferCount bigint,
@DBName varchar(255),
@BackupDevices bigint
-- Default value is zero. Value to be provided in MB.
set @MaxTransferSize = 0
-- Default value is zero
set @BufferCount = 0
-- Provide the name of the database to be backed up
set @DBName = 'entities' --<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<----- CHANGE HERE YOUR DB NAME !!!
-- Number of disk devices that you are writing the backup to
set @BackupDevices = 1
declare @DatabaseDeviceCount int
select @DatabaseDeviceCount=count(distinct(substring(physical_name,1,charindex(physical_name,':')+1)))
from sys.master_files
where database_id = db_id(@DBName)
and type_desc <> 'LOG'
if @BufferCount = 0
set @BufferCount = (@BackupDevices*3) + @BackupDevices + (2 * @DatabaseDeviceCount)
if @MaxTransferSize = 0
set @MaxTransferSize = 1
select 'Total buffer space (MB): ' + cast ((@Buffercount * @MaxTransferSize) as varchar(10))
您使用 MIN 和 MAX 内存分配的内存仅用于缓冲池,对于 SQL Server 2012 及更高版本,内存管理器已更改。
当备份开始时,它会创建一系列缓冲区,从缓冲池外的内存中分配。每个缓冲区的目标通常是 4 MB,导致大约 4 到 8 个缓冲区。
不要在 PROD 上这样做,只是为了你自己的学习利益:
您可以了解备份占用了多少内存:
跟踪标志 3605:此跟踪标志会将跟踪发送到 SQL Server 错误日志。
跟踪标志 3213:此跟踪标志提供有关备份和还原吞吐量和其他配置的信息。
以下来自我的测试服务器:
是的,因为它强制检查点发生。完整备份将强制数据库检查点在备份读取任何内容之前将所有更新的内存页面刷新到磁盘。
如果要估计到物理磁盘的特定完整数据库备份将使用的总缓冲内存量:
参考: