我们设置了一个作业,每晚运行一个脚本,对我们所有的数据库进行完整备份。最近,我们注意到有时跳过最后两个数据库,但不是所有时间都跳过。我们有一个跟踪表,我们在进行备份时插入每个数据库的状态。在跳过最后两个数据库的夜晚,这些数据库的状态也不会记录在跟踪表中。我们无法弄清楚为什么要跳过这些数据库。这是我们正在使用的备份脚本:
DECLARE @dbname VARCHAR(100),
@dbid INT,
@rcmodel VARCHAR(50),
@state VARCHAR(60),
@date VARCHAR(50),
@time VARCHAR(50),
@sql VARCHAR(3000),
@dir VARCHAR(1000),
@path VARCHAR(100),
@type VARCHAR(10)
SET @path = 'E:\Backups\'
SET @type = 'Full'
SET @date = REPLACE(CONVERT(date,GETDATE(),101),'-','_')
SET @time = REPLACE(CONVERT(TIME(0), GETDATE()),':','_')
SET @path = @path + CONVERT(VARCHAR(30),@@SERVERNAME) + '\' + @type + '\'
DECLARE BackupCur CURSOR FOR
SELECT NAME, database_id, recovery_model_desc, state_desc
FROM sys.databases
WHERE NAME <> 'tempdb'
OPEN BackupCur
FETCH NEXT FROM BackupCur INTO @dbname, @dbid, @rcmodel, @state
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO backuptrackingtable (db, statedesc, datecreated)
values (@dbname, @state, GETDATE())
IF @type = 'Full' AND @state = 'ONLINE'
BEGIN
SET @dir = 'EXECUTE master.dbo.xp_create_subdir N'''+@path+@dbname+''''
SET @sql = 'BACKUP DATABASE '+@dbname+' TO DISK = N'''+@path+@dbname+'\'+@dbname+'_'+@date+'.bak'' WITH NOFORMAT, INIT, SKIP, REWIND, NOUNLOAD, COMPRESSION'
PRINT 'Backing up ' + @dbname
EXEC (@dir)
EXEC (@sql)
END
IF @type = 'Log' AND @dbid > 4 AND @rcmodel = 'FULL' AND @state = 'ONLINE'
BEGIN
SET @dir = 'EXECUTE master.dbo.xp_create_subdir N'''+@path+@dbname+''''
SET @sql = 'BACKUP LOG '+@dbname+' TO DISK = N'''+@path+@dbname+'\'+@dbname+'_'+@date+'__'+@time+'.bak'' WITH NOFORMAT, INIT, SKIP, REWIND, NOUNLOAD, COMPRESSION'
PRINT 'Backing up ' + @dbname
EXEC (@dir)
EXEC (@sql)
END
FETCH NEXT FROM BackupCur INTO @dbname, @dbid, @rcmodel, @state
END
CLOSE BackupCur
DEALLOCATE BackupCur
答案 0 :(得分:0)
可以想到三种可能的解释。
sys.databases
的查询返回,因为它们不存在或运行查询的用户没有对它们的权限。@@FETCH_STATUS
在某些时候返回-2
,因为自从键集游标打开后数据库已被删除。您需要进行更多登录才能进一步调查。但您可能需要考虑使用维护计划(取决于版本)或Ola Hallengren's DB maintenance scripts而不是重新发明轮子。