CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

您现在的位置: IT专家网 > 数据库子站 > 数据库技巧

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

作者: OK_008,  出处:博客园, 责任编辑: 王晓晨, 
2008-07-29 09:12
  根据备份文件直接还原数据库:方法是先提取原数据库名,再提取数据库相关的数据文件(数据文件和日志文件),然后还原数据库。

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

  代码如下: 


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
  Exec sp_executesql N'Restore HeaderOnly From Disk=@DataBaseBakPath',N'@DataBaseBakPath nvarchar(260)',@DataBaseBakPath
  Insert Into @DataBakFileList
  Exec sp_executesql 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
  Exec sp_executesql @Sql,N'@DataBase nvarchar(128),@DataBaseBakPath nvarchar(260)',@DataBase,@DataBaseBakPath

  e.g:


 Exec sp_RestoreDataBase 'F:\SQL2005\test1\deadlocktest.bak','F:\SQL2005\test2\'
  /*
  还原数据库: 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/秒)。
  */

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i