文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>使用T-SQL进行数据库备份并检查该备份文件是否存在且作出相应处理

使用T-SQL进行数据库备份并检查该备份文件是否存在且作出相应处理

时间:2010-10-02  来源:Simcoder

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

 

相关阅读 更多 +
排行榜 更多 +
百炼英雄抽卡技巧指南

百炼英雄抽卡技巧指南

休闲益智 下载
英雄没有闪滚雷旋风技能如何搭配

英雄没有闪滚雷旋风技能如何搭配

休闲益智 下载
英雄没有闪雷旋风BD构筑推荐

英雄没有闪雷旋风BD构筑推荐

休闲益智 下载