如何编写格式为 SQL 的数据库备份脚本:Demo_YYYYMMDD_XX.bak
How to write a SQL DB Backup script with format: Demo_YYYYMMDD_XX.bak
如何编写具有唯一名称格式的每日备份脚本:Demo_YYYYMMDD_XX
其中 XX 是基于备份历史记录的增量数字。
示例如下。
- 第一次备份:Demo_20170704_01.bak
- 第二次备份:Demo_20170704_02.bak
- 第三次备份: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
中获得基本(第一)行
如何编写具有唯一名称格式的每日备份脚本:Demo_YYYYMMDD_XX 其中 XX 是基于备份历史记录的增量数字。
示例如下。
- 第一次备份:Demo_20170704_01.bak
- 第二次备份:Demo_20170704_02.bak
- 第三次备份: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
中获得基本(第一)行