資料庫的備份與恢復的儲存過程

2021-03-31 08:56:59 字數 4029 閱讀 1946

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/*--備份資料庫的通用儲存過程

/*--呼叫示例

--備份當前資料庫

exec p_backupdb @bkpath='c:/',@bkfname='/dbname/_/date/_db.bak'

儲存過程實現備份和還原資料庫:

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/*--備份資料庫的通用儲存過程

1)drop procedure [dbo].[p_restoredb]

go/*--恢復資料庫的通用儲存過程

/*--呼叫示例

--完整恢復資料庫

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_restoredb @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_restoredb @bkfile='c:/db_20031015_log.bak',@dbname='db',@retype='log'

--*/

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為'db'/'dbnor'是有效

@killuser bit=1,      --是否關閉使用者使用程序,僅@overexist=1時有效

@password nvarchar(20)='' --備份檔案的密碼(僅sql2000支援),如果備份時設定了密碼,必須提供此密碼

asdeclare @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,'')=''

begin

select @dbpath=rtrim(reverse(filename)) from master..sysfiles where name='master'

select @dbpath=reverse(substring(@dbpath,charindex('/',@dbpath),4000))

end--生成資料庫恢復語句

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

+case isnull(@password,'') when '' then '' else ',password='''+@password+'''' end

--新增移動邏輯檔案的處理

if @retype='db' or @retype='dbnor'

begin

--從備份檔案中獲取邏輯檔名

declare @lfn nvarchar(128),@tp char(1),@i int,@s varchar(1000)

--建立臨時表,儲存獲取的資訊

create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),msz numeric(20,0))

--從備份檔案中獲取資訊

set @s='restore filelistonly from disk='''+@bkfile+''''

++case isnull(@password,'') when '' then '' else ' with password='''+@password+'''' end

insert into #tb exec(@s)

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

endclose #f

deallocate #f

end--關閉使用者程序處理

if @overexist=1 and @killuser=1

begin

declare hcforeach cursor for

select s='kill '+cast(spid as varchar) from master..sysprocesses

where dbid=db_id(@dbname)

exec sp_msforeach_worker '?'

end--恢復資料庫

exec(@sql)

go--備份

backup database 資料庫 to disk='c:/你的備份檔案名'

--還原

restore database 資料庫 from disk='c:/你的備份檔案名'

備份的資料庫儲存過程

備份的資料庫儲存過程 alter proc p backupdb dbname sysname 要備份的資料庫名稱,不指定則備份當前資料庫 bkpath nvarchar 260 備份檔案的存放目錄,不指定則使用sql預設的備份目錄 bkfname nvarchar 260 備份檔案名,檔名中可以用...

資料庫的備份與恢復

oracle資料庫使用者的備份 update user set name database bak where name database commit alter system checkpoint 將oracle中使用者database更新為database bak alter user dat...

資料庫的備份與恢復

1.資料庫的備份與恢復 在quit後,執行 mysqldump 返回mysqldump的幫助資訊 資料庫備份的必要性 1.保證重要資料不丟失 2.資料轉移 mysql資料庫備份方法 1.mysqldump備份工具 2.資料庫管理工具,如sqlyog 3.直接copy資料庫檔案和相關配置檔案 安裝目錄...