CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

如何通过代码将生成的数据库备份设备自动恢复呢

楼主xiaoyie()2004-05-02 09:46:14 在 MS-SQL Server / 基础类 提问

例如我在某个文件夹中生成了一个备份设备   AAADEVICE。BAK   如何通过代码将原先的数库删除后恢复备份设备中的数据   ,不要手动,要通过代码实现,谢谢 问题点数:0、回复次数:6Top

1 楼zjcxc(邹建)回复于 2004-05-02 09:49:22 得分 0

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_RestoreDb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[p_RestoreDb]  
  GO  
   
  /*--恢复数据库的通用存储过程  
   
  --邹建   2003.10--*/  
   
  /*--调用示例  
  --完整恢复数据库  
  exec   p_RestoreDb   @bkfile='c:\db_20031015_db.bak',@dbname='db'  
   
  --差异备份恢复  
  exec   p_RestoreDb   @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'  
  exec   p_RestoreDb   @bkfile='c:\db_20031015_df.bak',@dbname='db',@retype='DF'  
   
  --日志备份恢复  
  exec   p_RestoreDb   @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'  
  exec   p_RestoreDb   @bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'  
   
  --*/  
   
  create   proc   p_RestoreDb  
  @bkfile   nvarchar(1000), --定义要恢复的备份文件名  
  @dbname   sysname='',         --定义恢复后的数据库名,默认为备份的文件名  
  @dbpath   nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录  
  @retype   nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR'   为差异恢复,日志恢复进行完整恢复,'DF'   差异备份的恢复,'LOG'   日志恢复  
  @filenumber   int=1, --恢复的文件号  
  @overexist   bit=1,             --是否覆盖已经存在的数据库,仅@retype为'DB'/'DBNOR'是有效  
  @killuser   bit=1,       --是否关闭用户使用进程,仅@overexist=1时有效  
  @password   nvarchar(20)='' --备份文件的密码(仅sql2000支持),如果备份时设置了密码,必须提供此密码  
  as  
  declare   @sql   varchar(8000)  
   
  --得到恢复后的数据库名  
  if   isnull(@dbname,'')=''  
  select   @sql=reverse(@bkfile)  
  ,@sql=case   when   charindex('.',@sql)=0   then   @sql  
  else   substring(@sql,charindex('.',@sql)+1,1000)   end  
  ,@sql=case   when   charindex('\',@sql)=0   then   @sql  
  else   left(@sql,charindex('\',@sql)-1)   end  
  ,@dbname=reverse(@sql)  
   
  --得到恢复后的数据库存放目录  
  if   isnull(@dbpath,'')=''  
  begin  
  select   @dbpath=rtrim(reverse(filename))   from   master..sysfiles   where   name='master'  
  select   @dbpath=reverse(substring(@dbpath,charindex('\',@dbpath),4000))  
  end  
   
  --生成数据库恢复语句  
  set   @sql='restore   '+case   @retype   when   'LOG'   then   'log   '   else   'database   '   end+@dbname  
  +'   from   disk='''+@bkfile+''''  
  +'   with   file='+cast(@filenumber   as   varchar)  
  +case   when   @overexist=1   and   @retype   in('DB','DBNOR')   then   ',replace'   else   ''   end  
  +case   @retype   when   'DBNOR'   then   ',NORECOVERY'   else   ',RECOVERY'   end  
  +case   isnull(@password,'')   when   ''   then   ''   else   ',PASSWORD='''+@password+''''   end  
   
  --添加移动逻辑文件的处理  
  if   @retype='DB'   or   @retype='DBNOR'  
  begin  
  --从备份文件中获取逻辑文件名  
  declare   @lfn   nvarchar(128),@tp   char(1),@i   int,@s   varchar(1000)  
   
  --创建临时表,保存获取的信息  
  create   table   #tb(ln   nvarchar(128),pn   nvarchar(260),tp   char(1),fgn   nvarchar(128),sz   numeric(20,0),Msz   numeric(20,0))  
  --从备份文件中获取信息  
  set   @s='restore   filelistonly   from   disk='''+@bkfile+''''  
  ++case   isnull(@password,'')   when   ''   then   ''   else   '   with   PASSWORD='''+@password+''''   end  
  insert   into   #tb   exec(@s)  
  declare   #f   cursor   for   select   ln,tp   from   #tb  
  open   #f  
  fetch   next   from   #f   into   @lfn,@tp  
  set   @i=0  
  while   @@fetch_status=0  
  begin  
  select   @sql=@sql+',move   '''+@lfn+'''   to   '''+@dbpath+@dbname+cast(@i   as   varchar)  
  +case   @tp   when   'D'   then   '.mdf'''   else   '.ldf'''   end  
  ,@i=@i+1  
  fetch   next   from   #f   into   @lfn,@tp  
  end  
  close   #f  
  deallocate   #f  
  end  
   
  --关闭用户进程处理  
  if   @overexist=1   and   @killuser=1  
  begin  
  declare   @spid   varchar(20)  
  declare   #spid   cursor   for  
  select   spid=cast(spid   as   varchar(20))   from   master..sysprocesses   where   dbid=db_id(@dbname)  
  open   #spid  
  fetch   next   from   #spid   into   @spid  
  while   @@fetch_status=0  
  begin      
  exec('kill   '+@spid)  
  fetch   next   from   #spid   into   @spid  
  end      
  close   #spid  
  deallocate   #spid  
  end  
   
  --恢复数据库  
  exec(@sql)  
   
  goTop

2 楼zjcxc(邹建)回复于 2004-05-02 09:49:49 得分 0

不知道你所谓的自动是怎么自动法?   总得有个触发恢复的事件吧?Top

3 楼xiaoyie()回复于 2004-05-02 10:01:00 得分 0

是前台程序调用SQL   SERVER   中的存储过程恢复就可以了Top

4 楼zjcxc(邹建)回复于 2004-05-02 10:05:38 得分 0

创建上面的存储过程后,前台程序中这样调用就可以恢复了.  
   
  exec   p_RestoreDb   @bkfile='c:\AAADEVICE.BAK',@dbname='恢复后的数据库名'Top

5 楼xiaoyie()回复于 2004-05-02 11:18:41 得分 0

我有个hotel的数据库文件   内有存储过程  
  CREATE   PROCEDURE   procbackup1   AS  
      backup   database   hotel   to   hoteldevice   with   init  
  GO  
  我已经生成了备份设备  
  文件存在C   盘根目录   c:\HOTELDEVICE.BAK  
  首先我用查询分析器执行  
  EXEC   PROCBAKCUP1  
   
  然后执行EXEC   exec   p_RestoreDb   @bkfile='c:\HOTELDEVICE.BAK',@dbname='HOTEL'  
  这样操作对吗    
  若对的话   那为什么   我在执行备份后更改了数据  
  执行完全恢复后却不能恢复到备份全的状态呢   麻烦你指教好吗  
  Top

6 楼xiaoyie()回复于 2004-05-02 11:24:54 得分 0

我明白了谢谢你谢谢你真的很感谢Top

相关问题

  • 如何用代码生成数据库?
  • 如何在代码中实现备份pordaxs的数据库?
  • 备份access数据库原代码,看看错在哪里?
  • 如何用代码实现mysql数据库备份?
  • 求一段sql数据库备份得代码
  • (100分)请教access数据库备份代码??在线等!!!!!!!
  • (100分)请教access数据库备份代码??在线等!!!!!!!
  • 请指教winform数据库备份和恢复的代码
  • 10分求SQL数据库备份和还原Delphi代码?
  • 关于用C#代码实现数据库备份的问题

关键词

  • 数据库
  • 代码
  • db
  • 备份
  • restoredb
  • 恢复
  • bkfile
  • bak
  • retype
  • dbname

得分解答快速导航

  • 帖主:xiaoyie

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo