支付方式  联系我们   网站地图       
首页 关于域浪 互联网数据中心业务、主机托管、主机租用、机架租用、带宽租用、机房介绍、机房对比、CCN网络加速 adsl专线、深圳adsl专线 虚拟主机、域名注册、数据库、企业邮局、动态域名 网络安全、网络临近平台、安全服务、防火去墙租用、安全产品、域浪抗DDOS防火墙、NetScreen防火墙 技术支持  
   当前位置:首页 >> 技术支持 >> MSSQL数据库技术 >> MS SQL数据库备份和恢复存储过程
 
精华文章
    关于MSSQL Server中DA...  
    利用MSSQL sp自制未公...  
    MS SQL数据库备份和恢...  
    使用MS SQL7的LINKED ...  
    使用MS SQL7的LINKED ...  
    使用MS SQL7的LINKED ...  
    使用MS SQL7的LINKED ...  
    关于MSSQL占用过多内存...  
    关于MSSQL数据库日志满...  
    Ms SQL Server 中单引...  
    MS SQL Server 7.0 的...  
    MS SQL Server查询优化...  
    Web环境下MS SQL Serv...  
    MS SQL Server 性能优...  
    远程检测MS SQL Serve...  
    MSSQL db_owner角色注...  
    MSSQL注入攻击服务器与...  
    MS-SQL数据库开发常用...  
    win2003 64位系统下as...  
    MSSQL数据库日志压缩/...  
    mssql数据库管理的简单...  
    MSSQL Server 2000的安...  
    如何成为数据库技术专...  
    MS SQL Server数据库事...  
    使用MS SQL7的LINKED ...  
    MS SQL Server:事务处...  
    MS SQL Server 7.0 的...  
    MS SQL Server 7.0 查...  
  更多>>  
   MSSQL数据库技术
 MS SQL数据库备份和恢复存储过程
MS SQL数据库备份和恢复存储过程

if exists( select * from sysobjects  where name='pr_backup_db' and xtype='p' )

begin

 drop proc pr_backup_db

end

go

/*备份数据库*/

create proc pr_backup_db

@flag varchar(10) out,

@backup_db_name varchar(128),

@filename varchar(1000)  --路径+文件名字

as

declare @sql nvarchar(4000),@par nvarchar(1000)

select @par='@filename varchar(1000)'

select @sql='BACKUP DATABASE '+@backup_db_name+' to disk=@filename with init'

execute sp_executesql @sql,@par,@filename

select @flag='ok'

go



 if exists(

 select * from sysobjects

  where name='fn_GetFilePath' and xtype='fn'

 )

begin

 drop function fn_GetFilePath

end

go

/*创建函数,得到文件得路径*/

create function fn_GetFilePath(@filename nvarchar(260))

returns nvarchar(260)   

as

begin

 declare @file_path nvarchar(260)

 declare @filename_reverse nvarchar(260)

 select @filename_reverse=reverse(@filename)

 select @file_path=substring(@filename,1,len(@filename)+1-charindex('\',@filename_reverse))

 return @file_path

end



go



if exists(

 select * from sysobjects

  where name='pr_restore_db' and xtype='p'

 )

begin

 drop proc pr_restore_db

end

go

create proc pr_restore_db    /*恢复数据库*/

@flag varchar(20) out,    /*过程运行的状态标志,是输入参数*/      

@restore_db_name nvarchar(128),  /*要恢复的数据名字*/

@filename nvarchar(260)         /*备份文件存放的路径+备份文件名字*/

as

declare @proc_result tinyint  /*返回系统存储过程xp_cmdshell运行结果*/

declare @loop_time smallint  /*循环次数*/

declare @max_ids smallint    /*@tem表的ids列最大数*/

declare @file_bak_path nvarchar(260)  /*原数据库存放路径*/

declare @flag_file bit   /*文件存放标志*/

declare @master_path nvarchar(260)  /*数据库master文件路径*/

declare @sql nvarchar(4000),@par nvarchar(1000)

declare @sql_sub nvarchar(4000)

declare @sql_cmd nvarchar(4000) 

/*

判断参数@filename文件格式合法性,以防止用户输入类似d: 或者 c:\a\ 等非法文件名

参数@filename里面必须有'\'并且不以'\'结尾

*/

if right(@filename,1)<>'\' and charindex('\',@filename)<>0

begin 

 select @sql_cmd='dir '+@filename

 EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output

 IF (@proc_result<>0)  /*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/

 begin

  select @flag='not exist'   /*备份文件不存在*/

  return  /*退出过程*/

 end

 /*创建临时表,保存由备份集内包含的数据库和日志文件列表组成的结果集*/

 create table #tem(

     LogicalName nvarchar(128), /*文件的逻辑名称*/

     PhysicalName nvarchar(260) , /*文件的物理名称或操作系统名称*/

     Type char(1),  /*数据文件 (D) 或日志文件 (L)*/

     FileGroupName nvarchar(128), /*包含文件的文件组名称*/

     [Size] numeric(20,0),  /*当前大小(以字节为单位)*/

     [MaxSize] numeric(20,0)  /*允许的最大大小(以字节为单位)*/

   )

 /*

 创建表变量,表结构与临时表基本一样

 就是多了两列,

 列ids(自增编号列),

 列file_path,存放文件的路径

 */

 declare @tem table(       

     ids smallint identity,  /*自增编号列*/

     LogicalName nvarchar(128), 

     PhysicalName nvarchar(260), 

     File_path nvarchar(260), 

     Type char(1),  

     FileGroupName nvarchar(128)

   )

 insert into #tem 

  execute('restore filelistonly from disk='''+@filename+'''')

 /*将临时表导入表变量中,并且计算出相应得路径*/

 insert into @tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)  

  select LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName 

   from #tem

 if @@rowcount>0 

 begin

  drop table #tem

 end

 select @loop_time=1

 select @max_ids=max(ids)  /*@tem表的ids列最大数*/

  from @tem

 while @loop_time<=@max_ids

 begin

  select @file_bak_path=file_path 

   from @tem where ids=@loop_time

  select @sql_cmd='dir '+@file_bak_path

  EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output

  /*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/

  IF (@proc_result<>0) 

   select @loop_time=@loop_time+1  

  else

   BREAK /*没有找到备份前数据文件原有存放路径,退出循环*/

 end

 select @master_path=''

 if @loop_time>@max_ids 

  select @flag_file=1   /*备份前数据文件原有存放路径存在*/

 else

 begin

  select @flag_file=0  /*备份前数据文件原有存放路径不存在*/

  select @master_path=dbo.fn_GetFilePath(filename)

   from master..sysdatabases where name='master'

 end

 select @sql_sub=''

 /*type='d'是数据文件,type='l'是日志文件 */

 /*@flag_file=1时新的数据库文件还是存放在原来路径,否则存放路径和master数据库路径一样*/

 select @sql_sub=@sql_sub+'move '''+LogicalName+''' to '''

   +case type 

         when 'd' then case @flag_file 

             when 1 then  File_path 

      else @master_path 

          end    

         when 'l' then case  @flag_file

      when 1 then  File_path 

      else @master_path 

          end    

   end

   +case type

    when 'd' then @restore_db_name+'_'+LogicalName+'_data.mdf'','  

    when 'l' then @restore_db_name+'_'+LogicalName+'_log.ldf'','  

    end

   from @tem

 select @sql='RESTORE DATABASE @db_name FROM DISK=@filename with '

 select @sql=@sql+@sql_sub+'replace'

 select @par='@db_name nvarchar(128),@filename nvarchar(260)'

 print @sql

 execute sp_executesql @sql,@par,@db_name=@restore_db_name,@filename=@filename

 select @flag='ok'   /*操作成功*/

end

else

begin

 SELECT @flag='file type error'  /*参数@filename输入格式错误*/

end



--备份数据库test_database

declare @fl varchar(10)

execute pr_backup_db @fl out,'test_database','c:\test_database.bak'

select @fl



--恢复数据库,输入的参数错误

declare @fl varchar(20)

exec pr_restore_db @fl out,'sa','c:\'

select @fl



--恢复数据库,即创建数据库test_database的复本test_db

declare @fl varchar(20)

exec pr_restore_db @fl out,'test_db','c:\test_database.bak'

select @fl



  • 上一篇文章: 利用MSSQL sp自制未公开的加密函数
  • 下一篇文章: 使用MS SQL7的LINKED SERVER(四)
  • 深圳地址:深圳市罗湖区宝安北路国际商品交易大厦七楼C30室
    Tel:0755-82266883/82267566 Fax:0755-82261966
    邮编:518000 
                        Copyright © 2006-2008 elang.cn All Rights Reserved 深圳市域浪网络技术有限公司版权所有