zoukankan      html  css  js  c++  java
  • sql2005备份在sql2000中恢复

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

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

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

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

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

     /*--备份数据库   
            
      /*--调用示例   
        
      --备份当前数据库   
      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   
  • 相关阅读:
    python如何编译py文件生成pyc、pyo、pyd以及如何和C语言结合使用
    urllib.parse:很底层,但是是一个处理url路径的好模块
    pandas中的Series
    pandas中Series对象下的str所拥有的方法(df["xx"].str)
    10.集成学习与随机森林
    9.决策树
    8.支撑向量机SVM
    HTTP协议详细介绍
    mysql 总结
    MySql练习题参考答案
  • 原文地址:https://www.cnblogs.com/88223100/p/1174210.html
Copyright © 2011-2022 走看看