自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何還原某一個目錄下的所有數(shù)據(jù)庫備份文件

數(shù)據(jù)庫 SQL Server 數(shù)據(jù)庫運維
在工作中,經(jīng)常為測試或開發(fā)部門搭建數(shù)據(jù)庫環(huán)境,每一次搭建環(huán)境,需要還原某一個目錄下的所有數(shù)據(jù)庫備份文件,也就是,一次需要還原一百多個數(shù)據(jù)庫。

引述

在工作中,經(jīng)常為測試或開發(fā)部門搭建數(shù)據(jù)庫環(huán)境,每一次搭建環(huán)境,需要還原某一個目錄下的所有數(shù)據(jù)庫備份文件,也就是,一次需要還原一百多個數(shù)據(jù)庫。

每碰到類似的情況,需要編寫一個SQL腳本來實現(xiàn)還原數(shù)據(jù)庫的功能。這里就簡單介紹如何編寫存儲過程來實現(xiàn),還原某一個目錄下的所有數(shù)據(jù)庫備份文件。

要實現(xiàn)還原某一個目錄下的所有數(shù)據(jù)庫備份文件,首先要實現(xiàn)還原某一個目錄下的某一個備份文件。真實世界中,只提供數(shù)據(jù)庫備份路徑,和備份數(shù)據(jù)庫文件名,及還原到的本地路徑。接下來,將講述以下內(nèi)容:

  • 根據(jù)備份文件找出數(shù)據(jù)庫名
  • 根據(jù)備份文件找出數(shù)據(jù)、日志目錄列表
  • 構(gòu)造還原數(shù)據(jù)庫SQL語句
  • 還原單個數(shù)據(jù)庫的存儲過程代碼
  • 還原多個數(shù)據(jù)庫的存儲過程代碼(一個目錄下)

●根據(jù)備份文件找出數(shù)據(jù)庫名

在還原數(shù)據(jù)庫的開始,我們先要知道把備份數(shù)據(jù)庫文件還原到哪一個數(shù)據(jù)庫上。在真實世界中,我們無法保證備份數(shù)據(jù)庫文件都為”數(shù)據(jù)庫名+.bak”格式 (如:myDB.bak,其中myDB就是數(shù)據(jù)庫名)。通常情況,只知道備份文件,需要知道數(shù)據(jù)庫名,我們可以通過SQL Server提供的T-SQL語句“Restore HeaderOnly”來找出原來的數(shù)據(jù)庫名,簡單語法這樣:Restore HeaderOnly From

返回的結(jié)果集中,有一列”DatabaseName”描述備份的數(shù)據(jù)名。通過”DatabaseName”列,就可以找出我們需要的原來數(shù)據(jù)庫名了。

e.g.

  1. Restore HeaderOnly From Disk = 'E:\DBBackup\dbA2011-09-05.bak' 

【注:】在結(jié)果集中, SQL Server 2008/R2 比 SQL Server 2005 多一個列”CompressedBackupSize”。

●根據(jù)備份文件找出數(shù)據(jù)、日志列表

接下來,我們需要知道備份文件中包含哪些數(shù)據(jù)、日志文件,及要知道原來的文件路徑是什么。要是原來的數(shù)據(jù)庫文件存儲路徑與新路徑不一致,我們需要在”Restore Database …” 里面使用” Move”選項。這里我們可以通過使用SQL Server 提供的T-SQL語句”Restore FileListOnly”,返回數(shù)據(jù)庫和日志文件列表組成的結(jié)果集,簡單語法這樣:Restore FileListOnly From <backup_device>

e.g.

  1. Restore FileListOnly From Disk = 'E:\DBBackup\dbA2011-09-05.bak'

【注:】在結(jié)果集中, SQL Server 2008/R2 比 SQL Server 2005 多一個列”TDEThumbprint”,應(yīng)用于顯示數(shù)據(jù)庫加密密鑰的指紋。

●構(gòu)造還原數(shù)據(jù)庫SQL語句

上面兩點內(nèi)容,我們根據(jù)備份文件,知道了要還原的數(shù)據(jù)庫名和數(shù)據(jù)庫文件列表,那么,我們基本可以構(gòu)造出還原數(shù)據(jù)庫的SQL語句了。

e.g.

  1. Restore DataBase dbA  
  2.     From Disk='E:\DBBackup\dbA2011-09-05.bak'  
  3.     With File=1, 
  4.         Move 'dbA' To 'E:\DATA\SQL2008DE01\dbA.mdf'
  5.         Move 'dbA_log' To 'E:\DATA\SQL2008DE01\dbA_Log.LDF',Replace,Recovery 

#p#

●還原單個數(shù)據(jù)庫的存儲過程代碼

根據(jù)上面分析的方法,這里演示我寫的一個還原單個數(shù)據(jù)庫的存儲過程代碼,因為代碼是之前寫的,中間因真實世界的特殊情況,修改成幾個版本的存儲過程。當然,如有可能,你可以根據(jù)自己所在的真實環(huán)境,修改對應(yīng)部分的代碼,以便滿足自己的需要。

存儲過程sp_RestoreDataBase代碼:

  1. Use master 
  2. Go 
  3. if object_ID('[sp_restoredatabase]'is not null 
  4.     Drop Procedure [sp_restoredatabase] 
  5. Go 
  6. /* 
  7.     --還原數(shù)據(jù)庫(v3.2) Andy 2011-2-22 
  8.     @DatabBaseBakPath nvarchar(260), --數(shù)據(jù)庫備份路徑(包含備份文件名) 
  9.     @DatabBaseNewPath nvarchar(260)  --新數(shù)據(jù)庫路徑 
  10.     @NewDataBaseName nvarchar(128)   --新數(shù)據(jù)庫名 
  11.     e.g: 
  12.     --Exec sp_RestoreDataBase 'E:\DatabaseBackup\DE\Support_2008722_14_33_39.bak','D:\SQL2005\DE' 
  13.     V3.0版本修改說明: 
  14.         1.修正了之前版本在還原包含全文索引文件的時候發(fā)生的錯誤。 
  15.         2.修正了之前版本在還原包含多個數(shù)據(jù)庫文件和日志文件時發(fā)生的錯誤。 
  16.     V3.1版本說明,增加了參數(shù)@Keep_Replication,表示是否保存復(fù)制設(shè)定 
  17.     V3.2版本說明,增加了FILE ={ file_number | @file_number } 邏輯判斷,在包含多個備份組,還原最后一個備份組 
  18.     V3.3 版本說明 ,還原發(fā)生錯誤時返回 1 
  19. */ 
  20. CREATE Proc sp_RestoreDataBase 
  21.     @DatabBaseBakPath nvarchar(260), 
  22.     @DatabBaseNewPath nvarchar(260), 
  23.     @NewDataBaseName nvarchar(128)=null
  24.     @Keep_Replication bit=0 
  25. As 
  26.  
  27. Set Nocount On 
  28. Begin Try 
  29.     Declare 
  30.         @DataBaseName nvarchar(128), 
  31.         @Sql nvarchar(max), 
  32.         @SqlDatabaseRename nvarchar(max), 
  33.         @Enter nvarchar(10) 
  34.     --檢查文件路徑是否正確 
  35.     Declare 
  36.         @Dir nvarchar(4000), 
  37.         @i int 
  38. --    Set @Dir='Dir '+@DatabBaseBakPath 
  39. --    Exec @i=xp_cmdshell  @Dir,no_output 
  40. --    If @i<>0     
  41.     Exec master.dbo.xp_fileexist @DatabBaseBakPath,@i Output 
  42.     If @i=0 
  43.     Begin 
  44.         Raiserror 50001 N'無效的備份數(shù)據(jù)庫路徑/文件名!' 
  45.         Return 1 
  46.     End 
  47.      
  48.     If Charindex('\\',@DatabBaseNewPath)>0 
  49.     Begin 
  50.         Raiserror 50001 N'數(shù)據(jù)庫還原路徑中不能含有''\\''!' 
  51.         Return 1 
  52.     End   
  53.     If Right(Rtrim(@DatabBaseNewPath),1)='\' 
  54.     Begin 
  55.         Raiserror 50001 N'數(shù)據(jù)庫還原路徑的最后一位能含有''\''!' 
  56.         Return 1 
  57.     End 
  58.     Set @Dir='Dir '+@DatabBaseNewPath 
  59.     Exec @i=xp_cmdshell  @Dir,no_output 
  60.     If @i<>0 
  61.     Begin 
  62.         Raiserror 50001 N'無效的數(shù)據(jù)庫還原路徑!' 
  63.         Return 1 
  64.     End 
  65.     set @DatabBaseNewPath=replace(@DatabBaseNewPath,'"',''
  66.     /* 
  67.     --SQL Server 2005 
  68.     Declare @BakFileList 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
  69.     */ 
  70.     --SQL Server 2008 
  71.     Declare @BakFileList 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,TDEThumbprint varbinary(32)) 
  72.     Insert Into @BakFileList 
  73.         Exec sp_executesql N'Restore FileListOnly From Disk=@DatabBaseBakPath',N'@DatabBaseBakPath nvarchar(260)',@DatabBaseBakPath 
  74.     /* 
  75.     --SQL Server 2005 
  76.     Declare @BakHeaderInfo 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
  77.     */ 
  78.     --SQL Server 2008 
  79.     Declare @BakHeaderInfo 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,CompressedBackupSize numeric(20,0)) 
  80.     Insert Into @BakHeaderInfo 
  81.         Exec sp_executesql N'Restore HeaderOnly From Disk=@DatabBaseBakPath',N'@DatabBaseBakPath nvarchar(260)',@DatabBaseBakPath 
  82.   
  83.      
  84.     If Isnull(@NewDataBaseName,'')>'' --使用新的數(shù)據(jù)庫名,要是沒有指定就使用原來的數(shù)據(jù)庫名 
  85.         Set @DataBaseName=@NewDataBaseName 
  86.     Else 
  87.     Begin   
  88.         Select @DataBaseName=DatabaseName From @BakHeaderInfo 
  89.     End 
  90.   
  91.      
  92.     Set @Enter=char(13)+Char(10) 
  93.     Select @Sql=Isnull(@Sql+@Enter,'')+'Kill '+Rtrim(spid) From master.sys.sysprocesses Where dbid=db_id(@DataBaseName) 
  94.     Exec(@Sql) 
  95.      
  96.     Set @Sql=N'Restore DataBase @DataBaseName From Disk=@DatabBaseBakPath With File=??,' --+(Select 'File='+rtrim(max(Position))+', ' From @BakHeaderInfo) 
  97.   
  98.     Select  @Sql=@Sql+'Move '''+LogicalName+''' To '''+@DatabBaseNewPath+'\'+@DataBaseName+ 
  99.             Case 
  100.                 When [Type]='D' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '' 
  101.                 When [Type]='D' Then '_'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  102.                 When [Type]='L' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '_Log' 
  103.                 When [Type]='L' Then '_Log'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  104.                 Else '' 
  105.             End+Right(PhysicalName,Charindex('.',Reverse(PhysicalName)))+''','
  106.             @SqlDatabaseRename=Isnull(@SqlDatabaseRename+@Enter,'')+ 
  107.                 Case 
  108.                     When [Type]='D' And LogicalName=@DataBaseName Then '' 
  109.                     When [Type]='D' And LogicalName Like @DataBaseName+'[_]%' Then '' 
  110.                     When [Type]='L' And LogicalName Like @DataBaseName+'[_]Log%' Then '' 
  111.                     When [Type]='F' Then '' 
  112.                     Else 
  113.                         'Alter DataBase '+Quotename(@DataBaseName)+' Modify File(Name='''+LogicalName+''',NewName='''+@DataBaseName+ 
  114.                         Case 
  115.                             When [Type]='D' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '' 
  116.                             When [Type]='D' Then '_'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  117.                             When [Type]='L' And Not Exists(Select 1 From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) Then '_Log' 
  118.                             When [Type]='L' Then '_Log'+(Select Rtrim(Count(*)) From @BakFileList Where [Type]=a.[Type] And FileID<a.FileID) 
  119.                             Else '' 
  120.                         End+''')' 
  121.                 End 
  122.         From @BakFileList As a 
  123.      
  124.      
  125.     Set @Sql=@Sql+'Replace' 
  126.      
  127.     If @Keep_Replication=1 
  128.         Set @Sql=@Sql+'Keep_Replication' 
  129.      
  130.     Declare @sql1 nvarchar(max), 
  131.             @MaxPosition int 
  132.      
  133.     Select @MaxPosition=Position 
  134.         From @BakHeaderInfo As a 
  135.         Where a.BackupType=1 
  136.                 And Not Exists(Select 1 From @BakHeaderInfo Where BackupType=a.BackupType And Position>a.Position) 
  137.      
  138.      
  139.     Select @sql1=isnull(@sql1+char(13)+char(10),'')+replace(@sql,'??',rtrim(Position)) + 
  140.             Case When Exists(Select 1 From @BakHeaderInfo Where Position>a.Position) Then N',Norecovery' Else N',Recovery' End 
  141.         From @BakHeaderInfo As a 
  142.         Where Position>=@MaxPosition 
  143.         Order By Position 
  144.          
  145.     Print '還原數(shù)據(jù)庫: '+@DataBaseName 
  146.   
  147.      
  148. --    Print @sql1 
  149.     Exec sp_executesql @sql1,N'@DataBaseName nvarchar(128),@DatabBaseBakPath nvarchar(260)',@DataBaseName,@DatabBaseBakPath 
  150.   
  151.     If @SqlDatabaseRename>'' 
  152.         Exec(@SqlDatabaseRename) 
  153.   
  154. End Try 
  155. Begin Catch 
  156.     Declare @Error nvarchar(1024) 
  157.     Set @Error=ERROR_MESSAGE() 
  158.     Raiserror 50001 @Error 
  159.     Return 1 
  160. End Catch 
  161.     Set Nocount Off 
  162.   
  163.   
  164. Go 

存儲過程測試:

  1. use master 
  2. Go 
  3. Exec dbo.sp_RestoreDataBase 'E:\DBBackup\dbA2011-09-05.bak','E:\DATA\SQL2008DE01' 
  4. go 

#p#

●還原多個數(shù)據(jù)庫的存儲過程代碼(一個目錄下)

當一個目錄下,存放這很多個備份文件的時候,我們需要還原整個目錄,或者部分數(shù)據(jù)庫備份文件,這時我們另外一個存儲過程能實現(xiàn)這樣的操作。這里我寫一個存儲過程sp_RestoreDataBase2:

  1. if object_id('sp_restoredatabase2'Is Not Null 
  2.     Drop proc sp_restoredatabase2 
  3. Go 
  4. create proc sp_restoredatabase2 
  5.     @Path_bak nvarchar(1024), 
  6.     @Path_new nvarchar(1024)=null
  7.     @DataBaseList nvarchar(max)=null 
  8. As 
  9. /* 
  10.  
  11. @DataBaseList 數(shù)據(jù)庫列表,可留空,或數(shù)據(jù)庫之間使用回車、空格、逗號分隔都ok 
  12.  
  13. */ 
  14.  
  15.  
  16. Set Nocount On 
  17. Declare @subdirectory nvarchar(1024),@ErrorMsg nvarchar(1024),@flag smallint 
  18.  
  19. if isnull(@Path_new,'')=''         
  20.     exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @Path_new Output     
  21.  
  22.  
  23. If Not Exists(Select 1 From master.sys.procedures Where name='sp_RestoreDataBase'
  24. Begin 
  25.     Raiserror 50001 N'找不到存儲過程 sp_RestoreDataBase ' 
  26.     Goto ExitFLag 
  27. End 
  28.  
  29.  
  30. Declare @Dir Table(subdirectory nvarchar(1024),depth int,[file] int
  31. Declare @DBList table (DatabaseName nvarchar(128)) 
  32. Declare @DBListNull table (DatabaseName nvarchar(128)) 
  33.  
  34. /* 
  35. --SQL Server 2005 
  36. Declare @BakHeaderTMP 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
  37. */ 
  38. --SQL Server 2008 
  39. Declare @BakHeaderTMP 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,CompressedBackupSize numeric(20,0)) 
  40.  
  41.      
  42.  
  43.  
  44. While charindex(char(13)+Char(10),@DataBaseList)>0 
  45.     Set @DataBaseList=Replace(@DataBaseList,char(13)+Char(10),','
  46. While charindex(char(13),@DataBaseList)>0 
  47.     Set @DataBaseList=Replace(@DataBaseList,char(13),','
  48. While charindex(char(9),@DataBaseList)>0 
  49.     Set @DataBaseList=Replace(@DataBaseList,char(9),','
  50. While charindex(char(32),@DataBaseList)>0 
  51.     Set @DataBaseList=Replace(@DataBaseList,Char(32),','
  52.  
  53.          
  54. Set @DataBaseList='Select '''+Replace(@DataBaseList,',',''' Union All Select ''')+'''' 
  55. Insert Into @DBList  Exec(@DataBaseList) 
  56.  
  57. Delete @DBList Where DatabaseName ='' 
  58.  
  59. Insert Into @Dir Exec xp_dirtree @Path_bak,1,1 
  60.  
  61. If Not Exists(Select subdirectory From @Dir Where Charindex('.bak',subdirectory)>0) 
  62. Begin 
  63.     Set @ErrorMsg= N'無效的數(shù)據(jù)庫路徑: '+ rtrim(@Path_bak) 
  64.     Raiserror 50001 @ErrorMsg 
  65.     Goto ExitFlag 
  66. End 
  67.  
  68.  
  69.  
  70. Declare cur_x cursor For Select subdirectory From @Dir Where Charindex('.bak',subdirectory)>0 
  71. Open cur_x 
  72. Fetch Next From cur_x Into @subdirectory 
  73. While @@Fetch_status=0 
  74. Begin 
  75.      
  76.     Set @subdirectory=Case When Right(@Path_bak,1)='\' Then @Path_bak Else   @Path_bak+'\' End+@subdirectory 
  77.      
  78.     Delete From @BakHeaderTMP 
  79.  
  80.     Insert Into @BakHeaderTMP 
  81.         Exec sp_executesql N'Restore HeaderOnly From Disk=@DatabBaseBakPath',N'@DatabBaseBakPath nvarchar(260)',@subdirectory 
  82.          
  83.     IF @@ERROR <> 0             
  84.         Break 
  85.     Else if Exists(Select 1 From @BakHeaderTMP As a Where Exists(Select 1 From @DBList Where DatabaseName=a.DatabaseName) Or Not Exists(Select 1 From @DBList))         
  86.         Begin 
  87.             Exec @flag=sp_RestoreDataBase @subdirectory,@Path_new             
  88.             If @flag <>0 Break 
  89.         End 
  90.  
  91.     Insert Into @DBListNull(DatabaseName) 
  92.         Select DatabaseName From @BakHeaderTMP     
  93.                          
  94.     Fetch Next From cur_x Into @subdirectory 
  95. End 
  96. CLose cur_x 
  97. Deallocate cur_x 
  98.  
  99.  
  100.  
  101. If Exists(Select 1 From @DBList a Where Not Exists(Select 1 From @DBListNull Where DatabaseName=a.DatabaseName)) 
  102.     Select DatabaseName As [無效的數(shù)據(jù)庫] From @DBList a Where Not Exists(Select 1 From @DBListNull Where DatabaseName=a.DatabaseName) 
  103.  
  104. print replicate('=',60) 
  105. Print N'@Path_new :  '+@Path_new 
  106.  
  107. ExitFLag: 
  108.  
  109. Go 

存儲過程測試:

  1. use master 
  2. Go 
  3. Exec dbo.sp_RestoreDataBase2 'E:\DBBackup' 
  4. go 

小結(jié)

上面還原數(shù)據(jù)庫的存儲過程,它們給我們在工作中還原數(shù)據(jù)庫的時候,帶來許多便捷,如,不用我們一個個通過Microsoft SQL Server Management Studio(MSSMS)中的還原數(shù)據(jù)庫向?qū)ミ€原數(shù)據(jù)庫,或也不用我們一個個執(zhí)行”Restore Database”SQL語句去還原數(shù)據(jù)庫。當然,在上面的代碼中,我沒有對每一個存儲過程的每一個具體位置,進行解釋。沒有全部應(yīng)用到”Restore Database”中”WITH”選項,我編寫的主要目的是,存儲過程參數(shù)盡可能的少,操作起來更方便,盡可能滿足真實環(huán)境中的需要。如果你應(yīng)用到以上的代碼,可以根據(jù)自己所在的真實環(huán)境,進行修改補充。

原文鏈接:http://www.cnblogs.com/wghao/archive/2011/09/07/2169409.html

【編輯推薦】

  1. 數(shù)據(jù)挖掘中易犯的幾大錯誤
  2. 整理索引碎片,提升SQL Server速度
  3. 大數(shù)據(jù)平臺:探索數(shù)據(jù)價值
  4. Big Data技術(shù)綜述
  5. SQL Server引入Hadoop大數(shù)據(jù)處理能力

 

 

 

 

 

 

責任編輯:艾婧 來源: OK_008 blog
相關(guān)推薦

2010-07-02 11:00:59

SQL Server備

2010-09-03 13:40:24

SQL刪除

2010-05-31 10:56:48

MySQL數(shù)據(jù)庫

2024-11-13 09:27:04

2011-03-03 16:10:04

Mysql數(shù)據(jù)庫備份還原

2011-07-25 13:08:31

MySQL數(shù)據(jù)庫二進制日志

2021-05-17 06:57:34

SQLServer數(shù)據(jù)庫

2016-11-15 09:27:37

Linux刪除文件

2010-09-07 11:09:33

SQL語句

2010-07-06 15:07:37

SQL Server

2010-05-17 15:58:05

MySQL Admin

2011-05-17 10:04:18

Python

2009-08-10 18:00:30

C#數(shù)據(jù)庫備份及還原

2011-07-25 09:32:28

2011-05-06 16:36:48

SQL備份還原

2018-02-25 17:30:18

2009-12-11 13:43:55

PHP獲得所有數(shù)據(jù)庫

2020-12-11 07:00:42

MySQL數(shù)據(jù)庫備份腳本

2019-11-01 14:50:18

Windows 10刪除備份文件

2011-03-10 08:42:15

SQL Server備份還原
點贊
收藏

51CTO技術(shù)棧公眾號