一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

MS SQL的數(shù)據(jù)庫(kù)備份和恢復(fù)存儲(chǔ)過(guò)程

 廚房阿四 2009-11-06
再次修正了恢復(fù)過(guò)程,加入了殺死相應(yīng)進(jìn)程的功能,使恢復(fù)過(guò)程更完善  
   
  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         /*恢復(fù)數(shù)據(jù)庫(kù)*/  
  @flag   varchar(20)   out,         /*過(guò)程運(yùn)行的狀態(tài)標(biāo)志,是輸入?yún)?shù)*/              
  @restore_db_name   nvarchar(128),     /*要恢復(fù)的數(shù)據(jù)名字*/  
  @filename   nvarchar(260)                   /*備份文件存放的路徑+備份文件名字*/  
  as  
  declare   @proc_result   tinyint     /*返回系統(tǒng)存儲(chǔ)過(guò)程xp_cmdshell運(yùn)行結(jié)果*/  
  declare   @loop_time   smallint     /*循環(huán)次數(shù)*/  
  declare   @max_ids   smallint         /*@tem表的ids列最大數(shù)*/  
  declare   @file_bak_path   nvarchar(260)     /*原數(shù)據(jù)庫(kù)存放路徑*/  
  declare   @flag_file   bit       /*文件存放標(biāo)志*/  
  declare   @master_path   nvarchar(260)     /*數(shù)據(jù)庫(kù)master文件路徑*/  
  declare   @sql   nvarchar(4000),@par   nvarchar(1000)  
  declare   @sql_sub   nvarchar(4000)  
  declare   @sql_cmd   nvarchar(4000)    
  declare   @sql_kill   nvarchar(400)    
  /*  
  判斷參數(shù)@filename文件格式合法性,以防止用戶(hù)輸入類(lèi)似d:   或者   c:\a\   等非法文件名  
  參數(shù)@filename里面必須有'\'并且不以'\'結(jié)尾  
  */  
  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)     /*系統(tǒng)存儲(chǔ)過(guò)程xp_cmdshell返回代碼值:0(成功)或1(失?。?/  
  begin  
  select   @flag='not   exist'       /*備份文件不存在*/  
  return     /*退出過(guò)程*/  
  end  
  /*創(chuàng)建臨時(shí)表,保存由備份集內(nèi)包含的數(shù)據(jù)庫(kù)和日志文件列表組成的結(jié)果集*/  
  create   table   #tem(  
      LogicalName   nvarchar(128),   /*文件的邏輯名稱(chēng)*/  
      PhysicalName   nvarchar(260)   ,   /*文件的物理名稱(chēng)或操作系統(tǒng)名稱(chēng)*/  
      Type   char(1),     /*數(shù)據(jù)文件   (D)   或日志文件   (L)*/  
      FileGroupName   nvarchar(128),   /*包含文件的文件組名稱(chēng)*/  
      [Size]   numeric(20,0),     /*當(dāng)前大?。ㄒ宰止?jié)為單位)*/  
      [MaxSize]   numeric(20,0)     /*允許的最大大?。ㄒ宰止?jié)為單位)*/  
  )  
  /*  
  創(chuàng)建表變量,表結(jié)構(gòu)與臨時(shí)表基本一樣  
  就是多了兩列,  
  列ids(自增編號(hào)列),  
  列file_path,存放文件的路徑  
  */  
  declare   @tem   table(                
      ids   smallint   identity,     /*自增編號(hào)列*/  
      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+'''')  
  /*將臨時(shí)表導(dǎo)入表變量中,并且計(jì)算出相應(yīng)得路徑*/  
  insert   into   @tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)      
  select   LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName    
  from   #tem  
  select   *   from   #tem  
  select   *   from   @tem  
  if   @@rowcount>0    
  begin  
  drop   table   #tem  
  end  
  select   @loop_time=1  
  select   @max_ids=max(ids)     /*@tem表的ids列最大數(shù)*/  
  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  
  /*系統(tǒng)存儲(chǔ)過(guò)程xp_cmdshell返回代碼值:0(成功)或1(失?。?/  
  IF   (@proc_result<>0)    
  select   @loop_time=@loop_time+1  
  else  
  BREAK /*沒(méi)有找到備份前數(shù)據(jù)文件原有存放路徑,退出循環(huán)*/  
  end  
  select   @master_path=''  
  if   @loop_time>@max_ids    
  select   @flag_file=1       /*備份前數(shù)據(jù)文件原有存放路徑存在*/  
  else  
  begin  
  select   @flag_file=0     /*備份前數(shù)據(jù)文件原有存放路徑不存在*/  
  select   @master_path=dbo.fn_GetFilePath(filename)  
  from   master..sysdatabases   where   name='master'  
  end  
  select   @flag_file   as   '@flag_file'  
  select   @sql_sub=''  
  /*type='d'是數(shù)據(jù)文件,type='l'是日志文件   */  
  /*@flag_file=1時(shí)新的數(shù)據(jù)庫(kù)文件還是存放在原來(lái)路徑,否則存放路徑和master數(shù)據(jù)庫(kù)路徑一樣*/  
  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)'  
  select     @sql   as   'sql'  
  /*關(guān)閉相關(guān)進(jìn)程,把相應(yīng)進(jìn)程狀況導(dǎo)入臨時(shí)表中*/  
  --select   *   from   master..sysprocesses   where   dbid=db_id(@restore_db_name)  
   
  select   identity(int,1,1)   ids,   spid    
  into   #temp  
  from   master..sysprocesses  
  where   dbid=db_id(@restore_db_name)  
  select   *   from   #temp  
   
  if   @@rowcount>0   --找到相應(yīng)進(jìn)程  
  begin        
  select   @max_ids=max(ids)    
  from   #temp  
  select   @loop_time=1  
  while   @loop_time<=@max_ids  
  begin  
  select   @sql_kill=''  
  select   @sql_kill='kill   '+convert(nvarchar(20),spid)    
  from   #temp  
  where   ids=@loop_time  
  execute   sp_executesql   @sql_kill  
  select   @loop_time=@loop_time+1  
  end  
  end  
  drop   table   #temp  
   
  execute   sp_executesql   @sql,@par,@db_name=@restore_db_name,@filename=@filename  
  select   @flag='ok'       /*操作成功*/  
  end  
  else  
  begin  
  SELECT   @flag='file   type   error'     /*參數(shù)@filename輸入格式錯(cuò)誤*/  
  end  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    国产超薄黑色肉色丝袜| 国产又粗又猛又爽又黄| 在线观看免费无遮挡大尺度视频 | 丰满熟女少妇一区二区三区| 日本加勒比在线播放一区| 五月婷婷欧美中文字幕| 亚洲av一区二区三区精品| 欧美国产日产综合精品| 日韩一区二区三区在线日| 婷婷一区二区三区四区| 人妻内射精品一区二区| 丝袜av一区二区三区四区五区| 好骚国产99在线中文| 99久热只有精品视频免费看| 欧美日韩一区二区午夜| 精品伊人久久大香线蕉综合| 亚洲欧洲一区二区中文字幕 | 在线免费不卡亚洲国产| a久久天堂国产毛片精品| 久久这里只有精品中文字幕| 91香蕉国产观看免费人人| 国产免费自拍黄片免费看| 视频在线播放你懂的一区| 少妇人妻中出中文字幕| 欧美中文日韩一区久久| 一区二区欧美另类稀缺| 国产一区二区精品高清免费| 欧美一区二区三区99| 亚洲黄色在线观看免费高清| 欧美日韩精品视频在线| 少妇特黄av一区二区三区| 国产成人一区二区三区久久| 色婷婷久久五月中文字幕| 免费在线播放不卡视频| 好吊日视频这里都是精品| 午夜久久久精品国产精品| 日韩性生活视频免费在线观看| 日韩一级免费中文字幕视频| 91欧美一区二区三区成人| 日韩一级欧美一级久久| 亚洲妇女作爱一区二区三区|