如果文件存在,SQL Server备份到URL将失败
问题描述:
我正在尝试将数据库备份到Azure Blob存储。数据库相对较大,介于1到30 Gig之间。如果文件存在,SQL Server备份到URL将失败
我已成功备份第一天,但在随后的日子里,我收到一个错误,指出该文件已存在,并且需要使用WITH FORMAT。
但我需要做一个差异备份,因为完整备份上的数据负载会非常缓慢和昂贵。
我收到错误“MyBackup.bak存在于远程端点上,并且未指定WITH FORMAT”。
我所试图做的是:
BACKUP DATABASE [MyDatabase]'
TO URL = 'https://myaccount.blob.core.windows.net/dbbackups/Container/', MyDatabase.bak',
WITH CREDENTIAL = 'AzureDBBackupsContainer'
, DIFFERENTIAL
, COMPRESSION;
我已经看到,使用URL备份时,差异备份支持。
这实际上是不可能的,或者我做错了什么?
答
由于您需要保留第一个完整备份,因此在阻止您时是正确的。 当你恢复你的数据库,你会
- 从完整备份
- 恢复应用差异备份
你的脚本应该产生一个唯一的名称。我通过追加文件的日期和时间来做到这一点:
DECLARE
@now DATETIME,
@datePrefix VARCHAR(MAX),
@timePart VARCHAR(MAX),
@backupFileName VARCHAR(MAX),
@fullUrl VARCHAR(MAX),
@blobServiceEndpoint VARCHAR(MAX)
SET @now = GETDATE();
SET @datePrefix = CONVERT(VARCHAR(8), GETDATE(), 112);
SET @timePart = RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(hh, @now)), 2)
+ RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(mi, @now)), 2)
+ RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(ss, @now)), 2);
SET @backupFileName = 'MyDatabase_' + @datePrefix + @timePart + '.bak';
SET @blobServiceEndpoint = 'https://myaccount.blob.core.windows.net/';
SET @fullUrl = @blobServiceEndpoint + 'Container/' + @backupFileName;
BACKUP DATABASE [MyDatabase]'
TO URL = @fullUrl
WITH CREDENTIAL = 'AzureDBBackupsContainer'
, DIFFERENTIAL
, COMPRESSION;
谢谢安德鲁。所以我应该先做一个初步的完全备份,我似乎已经成功完成了,然后再进行差分?我们没有理由回到过去。即当我们进行恢复时,我们总是需要最新的。所以要恢复,我们需要恢复完整,然后每个后续备份?然后,也许每个月一次,做一个完整的,并删除所有的差异? – Craig
@克雷格:没错。我一直使用事务日志备份而不是自己的差异备份。您的差异备份每次都会变得更大,直到您通过完整备份进行重置为止。您需要观察它才能看到执行完整备份的时间。 –
谢谢...我会查找备份日志然后......但表面上,是一个初始备份的情况下,然后备份日志之后,使用相同的日志文件名? – Craig