返回列表 发帖

SQLServer维护计划:用语句来创建多个数据库的备份、删除过期文件

SQLServer的维护计划是强大的,特别是体现在备份、删除过期文件这个方面。

可以创建文件夹、备份多个库、删除过期文件……

不过配置时还是有点烦人,要选择很多东西。

那用语句如何实现呢?
  1. --作业步骤1. 备份所有指定数据库
  2. DECLARE @dbs TABLE(
  3.     rowNum INT IDENTITY(1, 1) PRIMARY KEY,
  4.     dbName NVARCHAR(200),
  5.     bakPath AS N'D:\database_bak\' + dbName + '\' + dbName + '_' + REPLACE(REPLACE(REPLACE(CONVERT(CHAR(19), GETDATE(), 120), '-', ''),':',''),' ','_') + '.bak'
  6. )
  7. SET NOCOUNT ON
  8. --将所有符合条件的DB插入到表变量
  9. INSERT INTO @dbs(dbName)
  10. SELECT NAME
  11. FROM   sys.databases d
  12. WHERE  NAME NOT IN ('master', 'tempdb', 'model', 'msdb', 'ag_test')
  13.        AND NAME NOT LIKE '%monitor%'
  14. ORDER BY
  15.        NAME

  16. --遍历表变量中的所有数据库
  17. DECLARE @i INT,@iMax INT,@sql NVARCHAR(MAX)
  18. SELECT @i = 1,@iMax = MAX(rowNum) FROM @dbs

  19. WHILE @i <= ISNULL(@iMax, 0)
  20. BEGIN
  21.     --创建 dbName 开头的子文件夹
  22.     SELECT @sql = 'EXECUTE master.dbo.xp_create_subdir N''d:\database_bak\' +
  23.            dbName + ''''
  24.     FROM   @dbs
  25.     WHERE  rowNum = @i
  26.      
  27.     EXEC (@sql)
  28.     --备份
  29.     --2005 要去掉 COMPRESSION
  30.     SELECT @sql = 'BACKUP DATABASE [' + dbName + '] TO  DISK = N''' + bakPath +
  31.            ''' WITH NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 20'     
  32.     FROM   @dbs
  33.     WHERE  rowNum = @i
  34.      
  35.     EXEC (@sql)
  36.     SET @i = @i + 1
  37. END

  38. --作业步骤二. 删除过期文件
  39. DECLARE @oldDate DATETIME
  40. --保留 2 天文件(昨天0点之前文件会被删除)
  41. SET @oldDate = CAST(CONVERT(CHAR(10),GETDATE(),120) AS DATETIME)-1
  42. EXECUTE MASTER.dbo.xp_delete_file
  43. 0,                      --0: 备份文件,1: 维护计划文本报告
  44. N'D:\database_bak\',    --文件路径
  45. N'bak',                 --文件扩展名
  46. @oldDate,               --在此时间之前的文件一律删除
  47. 1                       --删除子文件夹中的文件
复制代码

返回列表