使用T-SQL进行数据库备份并检查该备份文件是否存在且作出相应处理
使用T-SQL進行數據庫備份并檢查該備份文件是否存在且作出相應處理
USE master
GO
EXEC sp_addumpdevice 'disk', 'AdvWorksData',
'E:/開發軟件/數據庫/SQl2005示例數據庫/AdvWorksData.bak'
BACKUP DATABASE AdventureWorks
?? TO AdvWorksData
1.備份數據庫語句:
EXEC sp_addumpdevice 'disk','數據庫備份名稱','文件路徑'
BACKUP DATABASE 數據庫名稱
TO 數據庫備份名稱
2.sp_addumpdevice
代碼
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER procedure [sys].[sp_addumpdevice]??? -- 1995/09/07 12:01
??? @devtype varchar(20),??????????????? -- disk, tape, or virtual_device
??? @logicalname?? sysname,??????????????? -- logical name of the device
??? @physicalname? nvarchar(260),??????? -- physical name of the device
??? @cntrltype? smallint = null,??????? -- obsolete: controller type - ignored.
??? @devstatus? varchar(40) = null????? -- obsolete: device characteristics -ignored
as
??? declare @type_enum??? smallint -- devtype enumeration value
??? declare @returncode int
??? declare @devtypeIn varchar(20)
??? select @devtypeIn = @devtype
?????????? ,@devtype = LOWER (@devtype collate Latin1_General_CI_AS)
??? -- An open txn might jeopardize a recovery.
??? set implicit_transactions off
??? if @@trancount > 0
??? begin
??????? raiserror(15002,-1,-1,'sys.sp_addumpdevice')
??????? return (1)
??? end
??? -- You must be SA to execute this sproc.
??? if (not is_srvrolemember('diskadmin') = 1)
??? begin
??????? raiserror(15247,-1,-1)
??????? return (1)
??? end
??? -- Check out the @devtype.
??? select @type_enum = (case @devtype
??????? when 'disk'??????????????? then 2
??????? when 'tape'??????????????? then 5
??????? when 'virtual_device'??? then 7
??????? end)
??? if @type_enum is null
??? begin
??????? raiserror(15044,-1,-1,@devtypeIn)
??????? return (1)
??? end
??? -- Check the args are not NULL.
??? if @logicalname is null
??? begin
??????? raiserror(15045,-1,-1)
??????? return(1)
??? end
??? -- Check to see that the @logicalname is valid.
??? EXEC @returncode = sys.sp_validname @logicalname
??? if @returncode <> 0
??????? return(1)
??? if @physicalname is null
??? begin
??????? raiserror(15046,-1,-1)
??????? return(1)
??? end
??? -- Prohibit certain special english words from being logical names.
??? if (@logicalname IN ('disk', 'tape', 'virtual_device'))
??? begin
??????? raiserror(15285,-1,-1,@logicalname)
??????? return (1)
??? end
??? BEGIN TRANSACTION
??? -- Make sure that a device with @logicalname doesn't already exist.
??? --? Always turn on the dump status bit, ignore @skip_tape (not in use)
??? EXEC %%Device().NewDevice(Name = @logicalname, PhysicalName = @physicalname,
??????? Type = @type_enum, Size = 0)
??? if @@error <> 0??? -- duplicate logical name
??? begin
??????? ROLLBACK TRANSACTION
??????? raiserror(15026,-1,-1,@logicalname)
??????? return (1)
??? end
??? -- Make sure physical file name would be unique among devices.
??? if (select count(*) from master.dbo.sysdevices where phyname = @physicalname) > 1
??? begin
??????? ROLLBACK TRANSACTION
??????? raiserror(15061,-1,-1,@physicalname)
??????? return (1)
??? end
??? COMMIT TRANSACTION
??? return (0) -- sp_addumpdevice
?
3.這樣備份有一個弊端。如果沒有修改數據庫備份名稱,多次使用原有備份的名稱,會將數據累加到該原有備份文件上面,比如該數據庫第一次備份是100M,還是使用此名稱備份下次就是200M,300M....,這樣就要判斷該備份文件是否存在!
代碼
USE master
GO
declare @num int --申明一個接受返回值的變量
EXEC xp_fileexist 'E:/開發軟件/數據庫/SQl2005示例數據庫/AdvWorksData.bak',@num output -- 執行文件存在否的驗證 存在返回1 不存在返回0
if(@num = 1) --如果存在就給出提示或做其他功能的實現
begin
print '備份文件已經存在'
end
else --該文件不存在執行備份操作
begin
EXEC sp_addumpdevice 'disk', 'AdvWorksData',
'E:/開發軟件/數據庫/SQl2005示例數據庫/AdvWorksData.bak'
BACKUP DATABASE AdventureWorks
?? TO AdvWorksData
end
?
?改進,如果該備份文件已經存在使用當前系統日期時間作為文件名的一部分,這樣每次備份幾乎就不可能出現同名數據累加的現象了
?
代碼
USE master
GO
declare @num int --申明一個接受返回值的變量
EXEC xp_fileexist 'E:/開發軟件/數據庫/SQl2005示例數據庫/AdvWorksData.bak',@num output -- 執行文件存在否的驗證 存在返回1 不存在返回0
if(@num = 1) --如果存在就給出提示或做其他功能的實現
begin
declare @file varchar(120),@name varchar(30)
set @file = 'E:/開發軟件/數據庫/SQl2005示例數據庫/AdvWorksData_'+ replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-','_'),' ','_'),':','')+'.bak'
set @name = 'AdvWorksData'+CONVERT(VARCHAR(30),GETDATE(),9)
print '備份文件已經存在,自動按照日期重新命名進行備份'
EXEC sp_addumpdevice 'disk',@name , @file
BACKUP DATABASE AdventureWorks
?? TO @name
end
else --該文件不存在執行備份操作
begin
EXEC sp_addumpdevice 'disk', 'AdvWorksData',
'E:/開發軟件/數據庫/SQl2005示例數據庫/AdvWorksData.bak'
BACKUP DATABASE AdventureWorks
?? TO AdvWorksData
end
?
?
注意:E:/開發軟件/數據庫/SQl2005示例數據庫/? 該文件是已經事先創建好了的,還可以判斷文件是否存在然后進行處理,但考慮 一般備份文件的時候都有事先建立文件夾的習慣,所以這里不做處理。
?
我跋山涉水,翻山越嶺,終于來到博客園的桃花深處,在這里我有一個家,名字叫"歡迎您"。
總結
以上是生活随笔為你收集整理的使用T-SQL进行数据库备份并检查该备份文件是否存在且作出相应处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么国内软件行业普遍不如国外?
- 下一篇: 由一次WCF项目的需求扩展想到的