完全备份偶尔会跳过某些数据库

时间:2012-01-18 21:09:56

标签: sql sql-server

我们设置了一个作业,每晚运行一个脚本,对我们所有的数据库进行完整备份。最近,我们注意到有时跳过最后两个数据库,但不是所有时间都跳过。我们有一个跟踪表,我们在进行备份时插入每个数据库的状态。在跳过最后两个数据库的夜晚,这些数据库的状态也不会记录在跟踪表中。我们无法弄清楚为什么要跳过这些数据库。这是我们正在使用的备份脚本:

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

1 个答案:

答案 0 :(得分:0)

可以想到三种可能的解释。

  1. 它们不会从针对sys.databases的查询返回,因为它们不存在或运行查询的用户没有对它们的权限。
  2. 未处理的错误表示脚本在处理之前中止。
  3. @@FETCH_STATUS在某些时候返回-2,因为自从键集游标打开后数据库已被删除。
  4. 您需要进行更多登录才能进一步调查。但您可能需要考虑使用维护计划(取决于版本)或Ola Hallengren's DB maintenance scripts而不是重新发明轮子。