赛捷软件论坛's Archiver

erina.pan 发表于 2017-9-8 10:32

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

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

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

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

那用语句如何实现呢?[code]

--作业步骤1. 备份所有指定数据库
DECLARE @dbs TABLE(
    rowNum INT IDENTITY(1, 1) PRIMARY KEY,
    dbName NVARCHAR(200),
    bakPath AS N'D:\database_bak\' + dbName + '\' + dbName + '_' + REPLACE(REPLACE(REPLACE(CONVERT(CHAR(19), GETDATE(), 120), '-', ''),':',''),' ','_') + '.bak'
)
SET NOCOUNT ON
--将所有符合条件的DB插入到表变量
INSERT INTO @dbs(dbName)
SELECT NAME
FROM   sys.databases d
WHERE  NAME NOT IN ('master', 'tempdb', 'model', 'msdb', 'ag_test')
       AND NAME NOT LIKE '%monitor%'
ORDER BY
       NAME

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

WHILE @i <= ISNULL(@iMax, 0)
BEGIN
    --创建 dbName 开头的子文件夹
    SELECT @sql = 'EXECUTE master.dbo.xp_create_subdir N''d:\database_bak\' +
           dbName + ''''
    FROM   @dbs
    WHERE  rowNum = @i
     
    EXEC (@sql)
    --备份
    --2005 要去掉 COMPRESSION
    SELECT @sql = 'BACKUP DATABASE [' + dbName + '] TO  DISK = N''' + bakPath +
           ''' WITH NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, COMPRESSION,  STATS = 20'     
    FROM   @dbs
    WHERE  rowNum = @i
     
    EXEC (@sql)
    SET @i = @i + 1
END

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

[/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.