如何编写格式为 SQL 的数据库备份脚本:Demo_YYYYMMDD_XX.bak

How to write a SQL DB Backup script with format: Demo_YYYYMMDD_XX.bak

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

示例如下。

  1. 第一次备份:Demo_20170704_01.bak
  2. 第二次备份:Demo_20170704_02.bak
  3. 第三次备份:Demo_20170704_03.bak

XX 每次在同一天和同一文件夹(路径)运行进行备份时,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

你有两个选择。

  • 列出目录中与您的模式(日期)、计数和递增匹配的文件
  • 记下您每天进行多少次备份(增量)

既然你有一个数据库并且正在备份那个数据库,为什么不只做后者呢?并将您的每日备份记录到 table 中,其中包含

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,您可以确保在临时 table

中获得基本(第一)行