惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
A
About on SuperTechFans
博客园 - Franky
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
Last Week in AI
Last Week in AI
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
V
V2EX
G
Google Developers Blog

博客园 - Caviare

前台优化法则(YSlow) ASP.NET MVC源代码 启用IIS的Gzip压缩功能 web.sitemap Dynamic Generation SQL字符正则匹配 委托应用 WorkBook操作实例 判断大陆IPAddress 迭代器和排序基本使用 Bertrand Meyer提出的设计模式的原则 - Caviare - 博客园 Web.cofig详解[转] UpdatePanel Control [转老赵博客] .Net环境下的缓存技术介绍 (转) [转]webservice和remoting在分布式程序中的应用 Excel WorkBook操作例 温故知新-Excel操作类 SQL collation设置 一张类的访问权限图,帮您加深概念 [转]您可能不知道的Asp.Net2.0技巧
sql2005备份在sql2000中恢复
Caviare · 2007-08-28 · via 博客园 - Caviare

sql2005中的备份要在sql2000中还原,首先在sql2005中还原,然后选择兼容sql2000(80),备份后再在sql2000种还原。

用mdf和ldf来备份数据库,首先要分离数据库,右键备份数据库-任务-分离,对数据库分离,数据库的readonly要为false。分离后,在sql的data目录下找到要备份的mdf和ldf数据库。

还原时选择附加数据库,选择对应的mdf和ldf文件,附加即可。要判断要附加的数据库是否为只读,如果是,要去掉只读属性。要附加的数据库文件即mdf和ldf文件的安全设置中设置user用户完全控制权限,即为数据库文件的属性,设置成功后才可以附加。否则会抱错,要附加的数据库为只读。

要导出数据库脚本时,右键导出的数据库-任务-生成脚本

以下是sql语句备份还原数据库:

 /*--备份数据库   
    
  --邹建   2003.10--*/   
    
  /*--调用示例   
    
  --备份当前数据库   
  exec   p_backupdb   @bkpath='c:\',@bkfname='db_\DATE\_db.bak'   
    
  --差异备份当前数据库   
  exec   p_backupdb   @bkpath='c:\',@bkfname='db_\DATE\_df.bak',@bktype='DF'   
    
  --备份当前数据库日志   
  exec   p_backupdb   @bkpath='c:\',@bkfname='db_\DATE\_log.bak',@bktype='LOG'   
    
  --*/   
    
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_backupdb]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)   
  drop   procedure   [dbo].[p_backupdb]   
  GO   
    
  create   proc   p_backupdb   
  @dbname   sysname='', --要备份的数据库名称,不指定则备份当前数据库   
  @bkpath   nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录   
  @bkfname   nvarchar(260)='', --备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间   
  @bktype   nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF'   差异备份,'LOG'   日志备份   
  @appendfile   bit=1 --追加/覆盖备份文件   
  as   
  declare   @sql   varchar(8000)   
  if   isnull(@dbname,'')=''   set   @dbname=db_name()   
  if   isnull(@bkpath,'')=''   set   @bkpath=dbo.f_getdbpath(null)   
  if   isnull(@bkfname,'')=''   set   @bkfname='\DBNAME\_\DATE\_\TIME\.BAK'   
  set   @bkfname=replace(replace(replace(@bkfname,'\DBNAME\',@dbname)   
  ,'\DATE\',convert(varchar,getdate(),112))   
  ,'\TIME\',replace(convert(varchar,getdate(),108),':',''))   
  set   @sql='backup   '+case   @bktype   when   'LOG'   then   'log   '   else   'database   '   end   +@dbname   
  +'   to   disk='''+@bkpath+@bkfname   
  +'''   with   '+case   @bktype   when   'DF'   then   'DIFFERENTIAL,'   else   ''   end   
  +case   @appendfile   when   1   then   'NOINIT'   else   'INIT'   end   
  print   @sql   
  exec(@sql)   
  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_backupdb   @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_backupdb   @bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'   
    
  --*/   
    
  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   
    
  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为   
  @killuser   bit=1       --是否关闭用户使用进程,仅@overexist=1时有效   
  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,'')=''   set   @dbpath=dbo.f_getdbpath('')   
    
  --生成数据库恢复语句   
  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   
  print   @sql   
  --添加移动逻辑文件的处理   
  if   @retype='DB'   or   @retype='DBNOR'   
  begin   
  --从备份文件中获取逻辑文件名   
  declare   @lfn   nvarchar(128),@tp   char(1),@i   int   
    
  --创建临时表,保存获取的信息   
  create   table   #tb(ln   nvarchar(128),pn   nvarchar(260),tp   char(1),fgn   nvarchar(128),sz   numeric(20,0),Msz   numeric(20,0))   
  --从备份文件中获取信息   
  insert   into   #tb   exec('restore   filelistonly   from   disk='''+@bkfile+'''')   
  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)   
    
  go   
参考:http://topic.csdn.net/t/20031110/17/2446440.html#