备份所有数据库+索引创建脚本?

时间:2011-08-26 22:49:00

标签: sql sql-server tsql sql-server-2008

我试图备份我的所有SQL Server数据库,并从here遇到以下脚本:

DECLARE @name VARCHAR(50) -- database name  
DECLARE @path VARCHAR(256) -- path for backup files  
DECLARE @fileName VARCHAR(256) -- filename for backup  
DECLARE @fileDate VARCHAR(20) -- used for file name 

SET @path = 'C:\Backup\'  

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 

DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb')  

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   

WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @fileName = @path + @name + '_' + @fileDate + '.BAK'  
       BACKUP DATABASE @name TO DISK = @fileName  

       FETCH NEXT FROM db_cursor INTO @name   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

除非我认为在恢复数据库之后我必须重建数据库的所有索引,否则它的工作原理非常好。我想知道是否可以转储所有索引的CREATE语句,以便在恢复所有这些数据库之后可以一次性重新运行它们?

1 个答案:

答案 0 :(得分:2)

这是定期维护备份操作吗?如果没有,则必须添加WITH COPY_ONLY子句,否则会破坏备份链。

作为常规维护备份,这很差:

  • 它忽略每个数据库恢复模型(可能不同)
  • 它没有很好地安排完整/差异/日志备份(即使用太多的磁盘空间并导致太多的灾难恢复数据丢失)
  • 它不是错误安全的,一个db错误将使整个循环失败
  • 它不会清理生成的文件名(例如,名为[a:b]的数据库将创建无效的文件名并始终失败)。
  • 它不会维护旧备份并从过时备份中回收磁盘空间
  • 它不允许backup compression
  • 之类的内容
  • 与数据库在同一磁盘上进行备份是一种无用的安全错觉,无论如何都会丢失所有关于磁盘丢失的数据

但最终的根本问题是你从错误的角度看待它。您的目标不是制定备份计划,而是制定恢复计划。在这里阅读更多内容:Importance of testing your disaster recovery plan。顺便说一句,您还需要master的恢复计划。

关于索引的问题,我认为您根本不了解SQL Server备份的工作原理。从这里开始:SQL Server: Recovering from Disasters Using Backups