2012-01-18 86 views
0

我们有一项工作,每天晚上运行脚本以在我们所有数据库上进行完整备份。最近,我们注意到有时会跳过最后两个数据库,但不是全部。我们有一个跟踪表,我们在进行备份时插入每个数据库的状态。在最后两个数据库被跳过的晚上,这些数据库的状态也不会记录在跟踪表中。我们无法弄清楚为什么会跳过这些数据库。这是我们所使用的备份脚本:完整备份偶尔会跳过某些数据库

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'''[email protected][email protected]+'''' 
SET @sql = 'BACKUP DATABASE '[email protected]+' TO DISK =  N'''[email protected][email protected]+'\'[email protected]+'_'[email protected]+'.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'''[email protected][email protected]+'''' 
SET @sql = 'BACKUP LOG '[email protected]+' TO DISK = N'''[email protected][email protected]+'\'[email protected]+'_'[email protected]+'__'[email protected]+'.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

属于http://dba.stackexchange.com/ – Aaron 2012-01-18 21:12:41

回答

0

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

  1. 他们未从对sys.databases查询返回的,因为他们不存在,或者运行查询的用户没有对他们的权限。
  2. 未处理的错误意味着脚本在处理它们之前中止。
  3. @@FETCH_STATUS返回-2在某个点,因为数据库已被删除,因为键集游标打开。

您需要更多登录才能进一步调查。但是您可能需要考虑使用维护计划(取决于版本)或Ola Hallengren's DB maintenance scripts,而不是重新发明轮子。