sql2005备份在sql2000中恢复

时间:2022-08-17 20:24:37
 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#