Sql server 使用NOINIT备份到URL失败,因为文件已存在
有一个问题,但我无法解决,因为情况略有不同,所以请容忍我;我整天都在和官方文件较劲 我的目标是每天每个数据库有一个备份文件,并有15分钟的恢复目标。我正在安排代理作业,如下所示:Sql server 使用NOINIT备份到URL失败,因为文件已存在,sql-server,t-sql,sql-server-2019,Sql Server,T Sql,Sql Server 2019,有一个问题,但我无法解决,因为情况略有不同,所以请容忍我;我整天都在和官方文件较劲 我的目标是每天每个数据库有一个备份文件,并有15分钟的恢复目标。我正在安排代理作业,如下所示: 每天在00:00为指定的每个数据库创建一次完整备份 每15分钟,为指定的每个数据库创建一个事务日志备份 忽略遍历所需数据库的所有代码,这是上面第1部分的核心逻辑: DECLARE @dbName nvarchar(50) = (SELECT DatabaseName FROM #DbsToBackup WHER
DECLARE @dbName nvarchar(50) = (SELECT DatabaseName FROM #DbsToBackup WHERE (Id = @current));
DECLARE @dbNameAndDate nvarchar(200) = @dateString + '_' + @dbName;
DECLARE @dbSpecificContainerUrl nvarchar(MAX) = @containerUrl + @dbNameAndDate + '.bak';
DECLARE @verifyError nvarchar(200) = N'Verify failed. Backup information for database ' + @dbName + ' not found.';
BACKUP DATABASE @dbName
TO URL = @dbSpecificContainerUrl
WITH CREDENTIAL = @containerCredential
,NOINIT
,NAME = @dbNameAndDate
,COMPRESSION
,CHECKSUM
;
然后,事务日志备份逻辑如下(抓取数据库名称、日期字符串等的步骤相同):
BACKUP LOG @dbName
TO URL = @dbSpecificContainerUrl
WITH CREDENTIAL = @containerCredential
,NOINIT
,NAME = @dbNameAndDate
,SKIP
,COMPRESSION
,CHECKSUM
;
第1部分适用于第一次尝试,但第2部分(以及第1部分的任何后续重新运行)立即失败:
文件“”上发生不可恢复的I/O错误https://.....Test.bak:"
档案https://....Test.bak 存在于远程终结点上,并且具有
未指定格式。备份无法继续..[SQLSTATE 42000]
(错误3271)备份日志异常终止。该步骤失败
我知道.bak文件已经存在,但我认为NOINIT
强制了一个附加,它将事务日志数据添加到现有的.bak文件中
我可能遗漏了一些简单的东西,但有人能提供建议吗?基于,似乎不支持
不支持附加到现有备份Blob。备份到
只能使用WITH FORMAT选项覆盖现有blob。
但是,在使用文件快照备份时(使用
文件(快照参数),不允许使用WITH FORMAT参数
避免留下使用创建的孤立文件快照
原始文件快照备份
确保
@dbSpecificContainerUrl
包含@dateString
(最好是ISO 8610格式),以便每个日志备份都有自己的文件
乙二醇
根据问题,我们的目标是每天每个数据库有一个备份文件。我正试图减少有这么多文件。备份到Azure Blob存储是不可能的,因为您不能将新备份附加到单个文件。您可以将日志备份放在“子文件夹”中通过“/”分隔日期和时间。例如
/backups/mydb/20210514/tlog/tlog-02:15:00.bak
set @dateString = FORMAT(GetUtcDate(),'yyyy-MM-ddTHH:mm:ssZ')