如何使用以下格式编写SQL DB备份脚本:Demo_YYYYMMDD_XX.bak

时间:2017-07-04 03:32:38

标签: sql sql-server sql-server-2008 backup

如何编写具有唯一名称格式的每日备份脚本:Demo_YYYYMMDD_XX 其中XX是基于备份历史记录的增量编号。

示例如下。

  1. 第一次备份:Demo_20170704_01.bak
  2. 第二次备份:Demo_20170704_02.bak
  3. 第3次备份:Demo_20170704_03.bak
  4. 每次在同一天和同一文件夹(路径)上运行备份过程时,

    XX将增加+1。

    管理下面的脚本。需要改进吗?感谢

    DECLARE @path VARCHAR(500) 
    DECLARE @name VARCHAR(500) 
    DECLARE @pathwithname VARCHAR(500) 
    DECLARE @time DATETIME 
    DECLARE @year VARCHAR(4) 
    DECLARE @month VARCHAR(2) 
    DECLARE @day VARCHAR(2) 
    DECLARE @counter varchar(10)
    
    SET @path = 'C:\Backup Path\' 
    
    SELECT @time = GETDATE() 
    SELECT @year = (SELECT CONVERT(VARCHAR(4), DATEPART(yy, @time))) 
    SELECT @month = (SELECT CONVERT(VARCHAR(2), FORMAT(DATEPART(mm,@time),'00'))) 
    SELECT @day = (SELECT CONVERT(VARCHAR(2), FORMAT(DATEPART(dd,@time),'00'))) 
    SELECT @counter = (
    select format(count(A.database_name),'000')
    from msdb.dbo.backupset A join msdb.dbo.backupmediafamily B 
    on A.media_set_id = B.media_set_id
    where A.database_name = 'Demo' 
    and (select convert(date,A.backup_start_date, 120))  = (select convert(date,getdate(), 120))
    )
    
    SELECT @name ='Demo' + '_' + @year + @month + @day + '_' + @counter
    SET @pathwithname = @path + @name + '.bak' 
    
    BACKUP DATABASE Demo 
    TO DISK = @pathwithname WITH NOFORMAT, NOINIT, SKIP, REWIND, NOUNLOAD, STATS = 10
    

1 个答案:

答案 0 :(得分:0)

你有两个选择。

  • 列出与您的模式(日期),计数和增量匹配的目录中的文件
  • 计算每天备份的数量(增量)

由于你有一个数据库并且正在备份该数据库,为什么不做后者呢?并将您的每日备份记录到具有

的表中
create table backups (
    dbback DATE NOT NULL DEFAULT GETDATE()
   ,dbname varchar(99) NOT NULL
   ,name   varchar(99) NOT NULL
   ,index  int NOT NULL
   ,primary key(db,backdb)
) ;

您可以记录对(db,backdb)以记录多个数据库(dbname,dbback)的条目。

WITH t as ( select (backups.index+1) as nextnum
from backups where dbname = 'database_name' and dbback = CAST(GETDATE() AS DATE)
union select 1 as nextnum from dual )
insert into backups (dbback,dbname,name,index)
values (CAST(GETDATE() AS DATE),'database_name','yourname',t.nextnum) ;

请注意,通过使用union,您可以确保获得临时表中的基(第一行)