【网学网提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学会员整理了T-SQL恢复数据库的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
/*3.--恢复数据库
*/
/*--调用示例
--完整恢复数据库
execp_RestoreDb@bkfile='c:\db_20031015_db.bak',@dbname='db'
--差异备份恢复
execp_RestoreDb@bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
execp_backupdb@bkfile='c:\db_20031015_df.bak',@dbname='db',@retype='DF'
--日志备份恢复
execp_RestoreDb@bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
execp_backupdb@bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'
--*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_RestoreDb]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[p_RestoreDb]
GO
createprocp_RestoreDb
@bkfilenvarchar(1000)='c:\hotelfundb.bak',--定义要恢复的备份文件名
@dbnamesysname='hotelfundb',--定义恢复后的数据库名,默认为备份的文件名
@dbpathnvarchar(260)='D:\ProgramFiles\MicrosoftSQLServer\MSSQL\Data\',--恢复后的数据库存放目录,不指定则为SQL的默认数据目录
@retypenvarchar(10)='DB',--恢复类型:'DB'完事恢复数据库,'DBNOR'为差异恢复,日志恢复进行完整恢复,'DF'差异备份的恢复,'LOG'日志恢复
@filenumberint=1,--恢复的文件号
@overexistbit=1,--是否覆盖已经存在的数据库,仅@retype为
@killuserbit=1--是否关闭用户使用进程,仅@overexist=1时有效
as
declare@sqlvarchar(8000)
--得到恢复后的数据库名
ifisnull(@dbname,'')=''
select@sql=reverse(@bkfile)
,@sql=casewhencharindex('.',@sql)=0then@sql
elsesubstring(@sql,charindex('.',@sql)+1,1000)end
,@sql=casewhencharindex('\',@sql)=0then@sql
elseleft(@sql,charindex('\',@sql)-1)end
,@dbname=reverse(@sql)
--得到恢复后的数据库存放目录
ifisnull(@dbpath,'')=''set@dbpath=dbo.f_getdbpath('')
--生成数据库恢复语句
set@sql='restore'+case@retypewhen'LOG'then'log'else'database'end+@dbname
+'fromdisk='''+@bkfile+''''
+'withfile='+cast(@filenumberasvarchar)
+casewhen@overexist=1and@retypein('DB','DBNOR')then',replace'else''end
+case@retypewhen'DBNOR'then',NORECOVERY'else',RECOVERY'end
print@sql
--添加移动逻辑文件的处理
if@retype='DB'or@retype='DBNOR'
begin
--从备份文件中获取逻辑文件名
declare@lfnnvarchar(128),@tpchar(1),@iint
--创建临时表,保存获取的信息
createtable#tb(lnnvarchar(128),pnnvarchar(260),tpchar(1),fgnnvarchar(128),sznumeric(20,0),Msznumeric(20,0))
--从备份文件中获取信息
insertinto#tbexec('restorefilelistonlyfromdisk='''+@bkfile+'''')
declare#fcursorforselectln,tpfrom#tb
open#f
fetchnextfrom#finto@lfn,@tp
set@i=0
while@@fetch_status=0
begin
select@sql=@sql+',move'''+@lfn+'''to'''+@dbpath+@dbname+cast(@iasvarchar)
+case@tpwhen
'D'then'.mdf'''else'.ldf'''end
,@i=@i+1
fetchnextfrom#finto@lfn,@tp
end
close#f
deallocate#f
end
--关闭用户进程处理
if@overexist=1and@killuser=1
begin
declare@spidvarchar(20)
declare#spidcursorfor
selectspid=cast(spidasvarchar(20))frommaster..sysprocesseswheredbid=db_id(@dbname)
open#spid
fetchnextfrom#spidinto@spid
while@@fetch_status=0
begin
exec('kill'+@spid)
fetchnextfrom#spidinto@spid
end
close#spid
deallocate#spid
end
--恢复数据库
exec(@sql)
go
execp_RestoreDb