2017-09-28 85 views
0

我正在尝试将数据库备份到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备份时,差异备份支持。

这实际上是不可能的,或者我做错了什么?

回答

1

由于您需要保留第一个完整备份,因此在阻止您时是正确的。 当你恢复你的数据库,你会

  • 从完整备份
  • 恢复应用差异备份

你的脚本应该产生一个唯一的名称。我通过追加文件的日期和时间来做到这一点:

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; 
+0

谢谢安德鲁。所以我应该先做一个初步的完全备份,我似乎已经成功完成了,然后再进行差分?我们没有理由回到过去。即当我们进行恢复时,我们总是需要最新的。所以要恢复,我们需要恢复完整,然后每个后续备份?然后,也许每个月一次,做一个完整的,并删除所有的差异? – Craig

+0

@克雷格:没错。我一直使用事务日志备份而不是自己的差异备份。您的差异备份每次都会变得更大,直到您通过完整备份进行重置为止。您需要观察它才能看到执行完整备份的时间。 –

+0

谢谢...我会查找备份日志然后......但表面上,是一个初始备份的情况下,然后备份日志之后,使用相同的日志文件名? – Craig