根据备份文件直接还原数据库

日期: 2008-07-29 作者:OK_008 来源:TechTarget中国 英文

  根据备份文件直接还原数据库:方法是先提取原数据库名,再提取数据库相关的数据文件(数据文件和日志文件),然后还原数据库。
 
  方法是先提取原数据库名,再提取数据库相关的数据文件(数据文件和日志文件),然后还原数据库。


  代码如下: 







Use master 
  Go 
  If Object_id(’sp_RestoreDataBase’) Is Not Null 
  drop Proc sp_RestoreDataBase 
  Go 
  create Proc sp_RestoreDataBase 
  ( 
  @DataBaseBakPath nvarchar(260), 
  @DataBaseNewPath nvarchar(260) 
  ) 
  As 
  Set Nocount On 
  Declare 
  @Sql nvarchar(max), 
  @DataBase nvarchar(128) 
  Declare @DataBakHeader table(BackupName nvarchar(128),BackupDescription nvarchar(255),BackupType smallint,ExpirationDate datetime,Compressed tinyint,Position smallint,DeviceType tinyint,UserName nvarchar(128),ServerName nvarchar(128),DatabaseName nvarchar(128),DatabaseVersion int,DatabaseCreationDate datetime,BackupSize numeric(20,0),FirstLSN numeric(25,0),LastLSN numeric(25,0),CheckpointLSN numeric(25,0),DatabaseBackupLSN numeric(25,0),BackupStartDate datetime,BackupFinishDate datetime,SortOrder smallint,CodePage smallint,UnicodeLocaleId int,UnicodeComparisonStyle int,CompatibilityLevel tinyint,SoftwareVendorId int,SoftwareVersionMajor int,SoftwareVersionMinor int,SoftwareVersionBuild int,MachineName nvarchar(128),Flags int,BindingID uniqueidentifier,RecoveryForkID uniqueidentifier,Collation nvarchar(128),FamilyGUID uniqueidentifier,HasBulkLoggedData bit,IsSnapshot bit,IsReadOnly bit,IsSingleUser bit,HasBackupChecksums bit,IsDamaged bit,BeginsLogChain bit,HasIncompleteMetaData bit,IsForceOffline bit,IsCopyOnly bit,FirstRecoveryForkID uniqueidentifier,ForkPointLSN numeric(25,0) NULL,RecoveryModel nvarchar(60),DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,BackupTypeDescription nvarchar(60),BackupSetGUID uniqueidentifier NULL) 
  Declare @DataBakFileList table(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId bigint,createLSN numeric(25,0),dropLSN numeric(25,0) NULL,UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0) NULL,ReadWriteLSN numeric(25,0) NULL,BackupSizeInBytes bigint,SourceBlockSize int,FileGroupID int,LogGroupGUID uniqueidentifier NULL,DifferentialBaseLSN numeric(25,0) NULL,DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit) 
  insert Into @DataBakHeader 
  &#101xec sp_&#101xecutesql N’Restore HeaderOnly From Disk=@DataBaseBakPath’,N’@DataBaseBakPath nvarchar(260)’,@DataBaseBakPath 
  insert Into @DataBakFileList 
  &#101xec sp_&#101xecutesql N’Restore FileListOnly From Disk=@DataBaseBakPath’,N’@DataBaseBakPath nvarchar(260)’,@DataBaseBakPath 
  select @DataBase=DatabaseName From @DataBakHeader 
  select @Sql=Isnull(@Sql+char(13)+char(10),’’)+’Kill ’+Rtrim(spid) From master.sys.sysprocesses where dbid=db_id(@DataBase) 
  Set @Sql=Isnull(@Sql+char(13)+char(10),’’)+’Restore DataBase @DataBase From Disk=@DataBaseBakPath With ’ 
  select @Sql=@Sql+’Move’’’+LogicalName+’’’ To ’’’+@DataBaseNewPath+’’+LogicalName+Right(PhysicalName,charindex(’.’,Reverse(PhysicalName)))+’’’,’ 
  From @DataBakFileList 
  Set @Sql=@Sql+’Replace,Stats=10’ 
  Set Nocount Off 
  Print ’还原数据库: ’+@DataBase 
  &#101xec sp_&#101xecutesql @Sql,N’@DataBase nvarchar(128),@DataBaseBakPath nvarchar(260)’,@DataBase,@DataBaseBakPath 
  e.g:







&#101xec sp_RestoreDataBase ’F:SQL2005test1deadlocktest.bak’,’F:SQL2005test2’ 
  /* 
  还原数据库: deadlocktest 
  已处理百分之 10。 
  已处理百分之 20。 
  已处理百分之 30。 
  已处理百分之 40。 
  已处理百分之 50。 
  已处理百分之 60。 
  已处理百分之 70。 
  已处理百分之 80。 
  已处理百分之 90。 
  已处理百分之 100。 
  已为数据库 ’deadlocktest’,文件 ’deadlocktest’ (位于文件 1 上)处理了 1184 页。 
  已为数据库 ’deadlocktest’,文件 ’deadlocktest_log’ (位于文件 1 上)处理了 2 页。 
  RESTORE DATABASE 成功处理了 1186 页,花费 0.495 秒(19.613 MB/秒)。 
  */ 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

OK_008
OK_008

相关推荐