資料庫恢復 來自 鄒建blog 自已收藏

2021-04-01 17:02:06 字數 3310 閱讀 2626

/*3.--恢復資料庫

--鄒建 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]

gocreate 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時有效

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

endclose #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

壓縮資料庫日誌 原作 zjcxc 鄒建

經常在csdn上看到發帖說,壓縮日誌檔案處理不當,導致資料庫損壞,甚至不能恢復資料,於是就寫了乙個通用的資料庫日誌檔案壓縮的儲存過程來解決此問題 壓縮資料庫的通用儲存過程 壓縮日誌及資料庫檔案大小 因為要對資料庫進行分離處理 所以儲存過程不能建立在被壓縮的資料庫中 鄒建 2004.3 呼叫示例 ex...

資料庫恢復

如果有備份,直接從備份恢復即可。否則,借助第三方工具log explorer log explorer 解壓縮密碼 www.heibai.net 序號產生器產生的是註冊碼,是兩個 用解壓縮密碼解開後,壓縮包裡也有乙個序號產生器的 開啟log explorer file attach log file...

資料庫恢復

3.中斷的事務 3.2 undo redo日誌恢復 4.檢查點技術 查詢和更新資料庫時,由於某些問題 故障 發生可能會導致資料庫被破壞或影響資料庫中資料的一致性。資料庫恢復技術將資料庫從錯誤狀態恢復到某個一致狀態,它是資料庫可靠性的保證。事務故障 內部原因 介質故障 物理原因 系統故障 其他原因 存...