使用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示例数据库\  该文件是已经事先创建好了的,还可以判断文件是否存在然后进行处理,但考虑 一般备份文件的时候都有事先建立文件夹的习惯,所以这里不做处理。

 

你可能感兴趣的:(数据库备份)