程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQLServer 2000 數據庫備份還原存儲過程

SQLServer 2000 數據庫備份還原存儲過程

編輯:關於SqlServer
--這個存儲過程是在網上找到的,並非原創。

if exists(select * from sysobjects where type='p' and name='usp_backup')
 drop proc usp_backup
go
create proc usp_backup
 @flag int out,
 @backup_db_name varchar(128),    
 @filename varchar(1000) /**//*路徑+文件名字*/
as
 declare @sql nvarchar(4000),@par nvarchar(1000)
 if not exists( select * from master..sysdatabases where name=@backup_db_name)
 begin
  set @flag=0   /**//*數據庫不存在*/
  return
 end
 else
 begin
  if right(@filename,1)<>'' and charindex('',@filename)<>0
  begin
   set @par='@filename varchar(1000)'
   set @sql='BACKUP DATABASE '+@backup_db_name+' to disk=@filename with init'
   execute sp_executesql @sql,@par,@filename
   set @flag=1
   return
  end
  else
  begin
set @flag=0  /**//*參數@filename輸入格式錯誤*/
   return
  end
 end
go

if exists(select * from sysobjects where type='fn' and name='fn_GetFilePath')
 drop function fn_GetFilePath
go
create function fn_GetFilePath(@filename nvarchar(260))
 returns nvarchar(260) 
as
begin
 declare @file_path nvarchar(260),@filename_reverse nvarchar(260)
 set @filename_reverse=reverse(@filename)
 set @file_path=substring(@filename,1,len(@filename)+1-charindex('',@filename_reverse))
 return @file_path
end
go

if exists(select * from sysobjects where type='p' and name='usp_restore')
 drop proc usp_restore
go
CREATE  proc usp_restore
 @flag int out, /**//*過程運行的狀態標志,是輸入參數*/
 @restore_db_name nvarchar(128),  /**//*要恢復的數據名字*/
 @filename nvarchar(260) /**//*備份文件存放的路徑+備份文件名字*/
as
declare @proc_result tinyint, /**//*返回系統存儲過程xp_cmdshell運行結果*/
   @loop_time smallint, /**//*循環次數*/
   @max_ids smallint, /**//*@tem表的ids列最大數*/
   @file_bak_path nvarchar(260), /**//*原數據庫存放路徑*/
   @flag_file bit, /**//*文件存放標志*/
   @master_path nvarchar(260), /**//*數據庫master文件路徑*/
   @sql nvarchar(4000),
   @par nvarchar(1000),
   @sql_sub nvarchar(4000),
   @sql_cmd nvarchar(100),
   @sql_kill nvarchar(100)
/**//*判斷參數@filename文件格式合法性,以防止用戶輸入類似d: 或者 c:a 等非法文件名參數@filename裡面必須有''並且不以''結尾*/
 if right(@filename,1)<>'' and charindex('',@filename)<>0
 begin
  set @sql_cmd='dir '+@filename
  EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
  IF (@proc_result<>0) /**//*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
  begin
   set @flag=0   /**//*備份文件不存在*/
   return /**//*退出過程*/
  end
  create table #tem  /**//*創建臨時表,保存由備份集內包含的數據庫和日志文件列表組成的結果集*/
  (
   LogicalName nvarchar(128), /**//*文件的邏輯名稱*/ 
 PhysicalName nvarchar(260), /**//*文件的物理名稱或操作系統名稱*/
   Type char(1), /**//*數據文件 (D) 或日志文件 (L)*/
   FileGroupName nvarchar(128), /**//*包含文件的文件組名稱*/
   [Size] numeric(20,0), /**//*當前大小(以字節為單位)*/
   [MaxSize] numeric(20,0) /**//*允許的最大大小(以字節為單位)*/
  )
  /**//*創建表變量,表結構與臨時表基本一樣就是多了兩列,列ids(自增編號列),列file_path,存放文件的路徑*/
  declare @tem table
  (
   ids smallint identity, /**//*自增編號列*/
 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+'''')
  insert into @tem(LogicalName,PhysicalName,File_path,Type,FileGroupName) /**//*將臨時表導入表變量中,並且計算出相應得路徑*/
  select LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName from #tem
  if @@rowcount>0 
  begin
   drop table #tem
  end
  set @loop_time=1
  select @max_ids=max(ids) from @tem /**//*@tem表的ids列最大數*/
  while @loop_time<=@max_ids
  begin
   select @file_bak_path=file_path from @tem where ids=@loop_time
   set @sql_cmd='dir '+@file_bak_path
   EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
   IF (@proc_result<>0) /**//*系統存儲過程xp_cmdshell返回代碼值:0(成功)或1(失敗)*/
    set @loop_time=@loop_time+1  
   else
BREAK /**//*沒有找到備份前數據文件原有存放路徑,退出循環*/
  end
  set @master_path=''
  if @loop_time>@max_ids 
   set @flag_file=1   /**//*備份前數據文件原有存放路徑存在*/
  else
  begin
   set @flag_file=0  /**//*備份前數據文件原有存放路徑不存在*/
   select @master_path=dbo.fn_GetFilePath(filename) from master..sysdatabases where name='master'
  end
  /**//*@flag_file=1時新的數據庫文件還是存放在原來路徑,否則存放路徑和master數據庫路徑一樣*/
  set @sql_sub=''
  select @sql_sub=@sql_sub+'move '''+LogicalName+''' to ''' 
  +case type  /**//*type='d'是數據文件,type='l'是日志文件 */
   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
    +'_DATA'
    +convert(sysname,ids) /**//*給文件編號*/ 
    +'.'
    +right(PhysicalName,3)  /**//*給文件加入後綴名,mdf or ndf*/ 
    +''','  
   when 'l' then @restore_db_name
    +'_LOG'
    +convert(sysname,ids)   
    +'.'
    +right(PhysicalName,3)  
    +''','  
  end
  from @tem
  set @sql='RESTORE DATABASE @db_name '+'FROM DISK=@filename with '
  set @sql=@sql+@sql_sub+'replace'
  set @par='@db_name nvarchar(128),@filename nvarchar(260)'
  /**//*關閉相關進程,把相應進程狀況導入臨時表中*/
  select identity(int,1,1) ids, spid into #temp from master..sysprocesses where dbid=db_id(@restore_db_name)
if @@rowcount>0  /**//*找到相應進程*/
  begin   
   select @max_ids=max(ids) from #temp
   set @loop_time=1
   while @loop_time<=@max_ids
   begin
    select @sql_kill='kill '+convert(nvarchar(20),spid) from #temp where ids=@loop_time
    execute sp_executesql @sql_kill
    set @loop_time=@loop_time+1 
   end
  end 
  drop table #temp
  execute sp_executesql @sql,@par,@db_name=@restore_db_name,@filename=@filename
  set @flag=1  /**//*操作成功*/
 end
 else
 begin
 set @flag=0  /**//*參數@filename輸入格式錯誤*/
 end
GO

 

再加上一個遠程備份的:



CREATE   procedure   usp_copy   
  as   
  begin   
      declare   @filename     nvarchar(200)   
      declare   @eloname     nvarchar(200)   
 declare   @data   datetime   
      declare   @lastday   varchar(100)   
      --建立映射   
      exec   master..xp_cmdshell 'net   use   z:   \192.168.1.2   "*"   /user:192.168.1.2administrator'   
      --設備異地文件夾路徑   
      set       @filename='Z:esysdb'+convert(char(8),getdate(),112)+   convert(varchar(2),getdate(),108)+'.bak'   
      print   'esys備份完成'   
      set       @eloname='Z:elogisdb'+convert(char(8),getdate(),112)+   convert(varchar(2),getdate(),108)+'.bak'   
        print   'elogisdb備份完成'     
      select   @filename   
      --備份開始   
      BACKUP       DATABASE       [sanshu_pf]       TO       DISK       =       @filename       WITH       NOINIT       ,       NOUNLOAD       ,       NAME       =       N'addin       備份',       NOSKIP       ,       STATS       =       10,       NOFORMAT       
      BACKUP       DATABASE       [sanshu_pf]       TO       DISK       =       @eloname       WITH       NOINIT       ,       NOUNLOAD       ,       NAME       =       N'addin       備份',       NOSKIP       ,       STATS       =       10,       NOFORMAT           
  --刪除前六天備份數據庫   
      set   @lastday   =   'del     z:*'+   convert(char(8),getdate()-6,112)+'*.*     /f'   
      exec   master..xp_cmdshell     @lastday   
        --刪除映射       
      exec   master..xp_cmdshell   'net   use   z:   /delete'   
end   
    
    
  GO   

下面是DOS命令NET USE的幫助:

/*

NET USE
[devicename | *] [\\computername\sharename[\volume] [passWord | *]]
        [/USER:[domainname\]username]
        [/USER:[dotted domain name\]username]
        [/USER:[username@dotted domain name]
        [/SMARTCARD]
        [/SAVECRED]
        [[/DELETE] | [/PERSISTENT:{YES | NO}]]


  DeviceName:指派名稱以便連接到資源或指定斷開的設備。有兩種類型的設備名: 磁盤驅動器號(即 D: 到 Z:} 和打印機(即 LPT1:到 LPT3:}。如果鍵入星號而不是特定設備名,則系統會指派下一個可用的設備名。這個名稱以後可以作為訪問共享資源的名稱進行引用。

  \\computername:指控制共享資源的計算機的名字。如果計算機名中包含有空字符,就要將雙反斜線 (\\) 和計算機名一起用引號 (" ")括起來。計算機名可以有1 到 15 個 字符。\volume :指定一個服務器上的NetWare卷。用戶必須安裝 Netware 的客戶服務 (Windows 工作站) 或者 Netware 的網關服務(Windows 服務器) 並使之與 NetWare 服務器相連。

  PassWord:指定訪問共享資源所需的密碼。輸入星號 (*) 產生一個密碼提示在密碼提示行處鍵入密碼時不顯示密碼。

  /user:在其後指定建立連接時使用的不同於目前登錄用戶的用戶名。

  DomainName:指定不同於目前登錄域的其他域。如果省略則net use使用當前登錄的域。

  注意,/user:後的登錄用戶和域可以有三種不同的表示形式,分別為domainname\username,dotted domain name\username和username@dotted domain name,其中dotted domain name提指域名的全稱,如Office.yesky.com,也即域名加域後綴的完全形式。

  /SAVECRED:指定保留用戶名和密碼。除非命令提示輸入用戶名和密碼。否則此開關被忽略,

  /SMARTCARD:指定連接使用在智能卡上的憑據。

  /delete:取消指定的網絡連接。如果使用星號 (*) 指定連接,則所有網絡連接均將取消。

  /persistent:{yes | no}:控制持久網絡連接的使用。默認值為最後一次使用的設置。非設備連接不會持久。Yes 將按其建立時的原樣保存所有連接,並在下次登錄時還原它們。No 則不保存已建立的連接或後續連接。現存的連接在下一次登錄時還原。使用 /delete 刪除持久連接。

  Net use命令還有另兩種使用格式,分別如下:

  NET USE {devicename | *} [passWord | *] /HOME

  NET USE [/PERSISTENT:{YES | NO}]

  其中第一種命令格式將用戶連到其域的主目錄並將主目錄映射為設備名DeviceName。後一種格式用來修改持久連接的使用。

  下面是兩個例子:

  要連接用戶標識符 Dan 就好像是通過 Accounts 域創建的連接:

  net use d:\\server\share /user:Accounts\Dan

  要斷開 \\Financial\Public 目錄:

  net use f:\\financial\public /delete

*/
   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved