我每天都要备份我的 SQL 数据库。我刚买了一台新服务器,打算将数据库备份转移到新服务器上并恢复它。我们的数据库不像大多数公司那么大,只有 40 GB。我们去复制备份时,发现存储备份的硬盘已满,备份大小为 900GB。我在不同的 SQL 版本上使用过同样的任务,数据库备份从未像这样增长。
- 运行 Windows Server 2008 R2
- 运行 SQL Server 2008 R2 Ent
- 64 位
我不确定我是否编写了错误的脚本,下面是它的代码:
将数据库 [DATABASE] 备份到磁盘 = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.COMPANY\MSSQL\Backup\DATABASE.BAK',使用 NOFORMAT、NOINIT、NAME = N'DATABASE'、SKIP、NOREWIND、NOUNLOAD、STATS = 10 GO 将 @backupSetId 声明为 int 从 msdb..backupset 中选择 @backupSetId = position,其中 database_name=N'DATABASE' 和 backup_set_id=(从 msdb..backupset 中选择 max(backup_set_id),其中 database_name=N'DATABASE' ),如果 @backupSetId 为空,则开始 raiserror(N'验证失败。未找到数据库 ''DATABASE'' 的备份信息。',16,1) 结束 从磁盘 = N'C:\Program Files\Microsoft SQL 恢复 VERIFYONLY服务器\MSSQL10_50.COMPANY\MSSQL\Backup\DATABASE.BAK'WITH FILE = @backupSetId,NOUNLOAD,NOREWIND GO
(我添加了代码标签,但由于某种原因,它们没有被采用)
有人能告诉我为什么我的数据库备份不断增长吗?提前感谢你的帮助。
答案1
NOINIT = 表示将备份集附加到指定的媒体集,保留现有的备份集。
正在附加您的备份。如果您不希望备份继续增长,则需要使用 INIT。
答案2
每次备份时它都会附加到其末尾。
答案3
正如 DanBig 和 joeqwerty 所说,您的备份将附加到同一个文件中。如果您想保留版本而不附加或覆盖,请创建单独的日期文件。例如:
Declare @DBname varchar(255),
@SQL nvarchar(max),
@today nvarchar(50),
@servername nvarchar(50)
set @today = convert(nvarchar,GETDATE(),12)
set @servername = REPLACE(@@SERVERNAME,'\','-')
set @DBName = 'YourDB'
set @SQL='BACKUP DATABASE [' + @DBName + '] TO DISK = N''c:\some backup path\' + @servername + '-' + @DBName + '-' + @today + '.bak'' WITH FORMAT, INIT, NAME = N''Full ' + @DBName + ' Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10'
EXEC SP_EXECUTESQL @SQL