2014-03-05 71 views
3

在SQL Server 2008R2,我試圖恢復位於一個文件夾中的多個數據庫/ BAK文件,使用這裏給出一個SQL查詢 - http://www.karaszi.com/sqlserver/code/sp_RestoreFromAllFilesInDirectory_2008sp1.txt需要幫助恢復多個數據庫/ BAK文件從一個文件夾

它, 'd:\ Mydatabasesdirectory \', 'C:\ MylogDirectory \': -

exec sp_RestoreFromAllFilesInDirectory 'C:\Mybakfiles\', 
'D:\Mydatabasesdirectory\' , 
'C:\MylogDirectory\' 

夾invloved - '\ Mybakfiles \ C' 使用存儲過程像這樣,對於其中碼在最後給出

你應該知道pat h到第一個文件夾。第二個和第三個可以通過查詢或SSMS找到 。有關查詢,請參閱alexaza的答案 - What is the most efficient way to restore multiple databases in SQL 2008。我還在最後提出了他的問題。

我複製了我所有的BAK文件 - C:\ Program Files文件\ Microsoft SQL Server的\ MSSQL10_50.SS2008 \ MSSQL \備份\

然後,我進入執行如下的SP -

exec sp_RestoreFromAllFilesInDirectory 'C:\Program Files\ 
Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\', 
'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL 
\DATA\' , 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\ 
MSSQL\DATA\' 

,得到了下面的示例輸出 -

RESTORE DATABASE AdventureWorksDW FROM DISK = 'C:\Program Files\ 
Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\AdventureWorksDW.bak' 
WITH MOVE 'AdventureWorksDW_Data' TO 'C:\Program Files\Microsoft SQL 
Server\MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_Data.mdf', MOVE 
'AdventureWorksDW_Log' TO 'C:\Program Files\Microsoft SQL Server\ 
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_Log.ldf' 

問題 -我刷新我的服務器管理工​​作室,並沒有看到新的數據庫。爲什麼?我是否正確恢復了我的數據庫?如果不是,我該如何使用我在下面提供的代碼進行操作?如果您認爲代碼不好,是否有其他可靠的方法 來做到這一點?

PS - 它是一個恥辱,MS不會讓你輕鬆做到這一點。


附加信息 -

這裏是恢復多個數據庫的SP -

CREATE PROC [dbo].[sp_RestoreFromAllFilesInDirectory] 
@SourceDirBackupFiles nvarchar(200), @DestDirDbFiles 
nvarchar(200),@DestDirLogFiles nvarchar(200) 
AS 
--Originally written by Tibor Karaszi 2004. Use at own risk. 
--Restores from all files in a certain directory. Assumes that: 
-- There's only one backup on each backup device. 
-- Each database uses only two database files and the mdf file 
is returned first from the RESTORE FILELISTONLY command. 
--Sample execution: 
-- EXEC sp_RestoreFromAllFilesInDirectory 'C:\Mybakfiles\', 
'D:\Mydatabasesdirectory\' ,’C:\MylogDirectory\’ 
SET NOCOUNT ON 

--Table to hold each backup file name in 
CREATE TABLE #files(fname varchar(200),depth int, file_ int) 
INSERT #files 
EXECUTE master.dbo.xp_dirtree @SourceDirBackupFiles, 1, 1 

--Table to hold the result from RESTORE HEADERONLY. Needed to get 
the database name out from 
CREATE TABLE #bdev( 
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 int 
,IsSnapshot int 
,IsReadOnly int 
,IsSingleUser int 
,HasBackupChecksums int 
,IsDamaged int 
,BegibsLogChain int 
,HasIncompleteMetaData int 
,IsForceOffline int 
,IsCopyOnly int 
,FirstRecoveryForkID uniqueidentifier 
,ForkPointLSN numeric(25,0) 
,RecoveryModel nvarchar(128) 
,DifferentialBaseLSN numeric(25,0) 
,DifferentialBaseGUID uniqueidentifier 
,BackupTypeDescription nvarchar(128) 
,BackupSetGUID uniqueidentifier 
,CompressedBackupSize nvarchar(128) 
) 

--Table to hold result from RESTORE FILELISTONLY. Need to 
generate the MOVE options to the RESTORE command 
CREATE TABLE #dbfiles( 
LogicalName nvarchar(128) 
,PhysicalName nvarchar(260) 
,Type char(1) 
,FileGroupName nvarchar(128) 
,Size numeric(20,0) 
,MaxSize numeric(20,0) 
,FileId int 
,CreateLSN numeric(25,0) 
,DropLSN numeric(25,0) 
,UniqueId uniqueidentifier 
,ReadOnlyLSN numeric(25,0) 
,ReadWriteLSN numeric(25,0) 
,BackupSizeInBytes int 
,SourceBlockSize int 
,FilegroupId int 
,LogGroupGUID uniqueidentifier 
,DifferentialBaseLSN numeric(25) 
,DifferentialBaseGUID uniqueidentifier 
,IsReadOnly int 
,IsPresent int 
,TDEThumbprint nvarchar(128) 
) 


DECLARE @fname varchar(200) 
DECLARE @dirfile varchar(300) 
DECLARE @LogicalName nvarchar(128) 
DECLARE @PhysicalName nvarchar(260) 
DECLARE @type char(1) 
DECLARE @DbName sysname 
DECLARE @sql nvarchar(1000) 

DECLARE files CURSOR FOR 
SELECT fname FROM #files 

DECLARE dbfiles CURSOR FOR 
SELECT LogicalName, PhysicalName, Type FROM #dbfiles 

OPEN files 
FETCH NEXT FROM files INTO @fname 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @dirfile = @SourceDirBackupFiles + @fname 

--Get database name from RESTORE HEADERONLY, assumes there's 
only one backup on each backup file. 
TRUNCATE TABLE #bdev 
INSERT #bdev 
EXEC('RESTORE HEADERONLY FROM DISK = ''' + @dirfile + '''') 
SET @DbName = (SELECT DatabaseName FROM #bdev) 

--Construct the beginning for the RESTORE DATABASE command 
SET @sql = 'RESTORE DATABASE ' + @DbName + ' FROM DISK = ''' + 
@dirfile + ''' WITH MOVE ' 

--Get information about database files from backup device into temp table 
TRUNCATE TABLE #dbfiles 
INSERT #dbfiles 
EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @dirfile + '''') 

OPEN dbfiles 
FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type 
--For each database file that the database uses 
WHILE @@FETCH_STATUS = 0 
BEGIN 
IF @type = 'D' 
SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + 
@DestDirDbFiles + @LogicalName + '.mdf'', MOVE ' 
ELSE IF @type = 'L' 
SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + 
@DestDirLogFiles + @LogicalName + '.ldf''' 
FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type 
END 

--Here's the actual RESTORE command 
PRINT @sql 
--Remove the comment below if you want the procedure to 
actually execute the restore command. 
--EXEC(@sql) 
CLOSE dbfiles 
FETCH NEXT FROM files INTO @fname 
END 
CLOSE files 
DEALLOCATE dbfiles 
DEALLOCATE files 

查詢來獲取數據的文件夾位置和日誌文件 -

declare @DefaultData nvarchar(512) 
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', 
N'Software\Microsoft\MSSQLServer\MSSQLServer', 
N'DefaultData', @DefaultData output 

declare @DefaultLog nvarchar(512) 
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', 
N'Software\Microsoft\MSSQLServer\MSSQLServer', 
N'DefaultLog', @DefaultLog output 

declare @MasterData nvarchar(512) 
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\ 
Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg0', @MasterData output 
select @MasterData=substring(@MasterData, 3, 255) 
select @MasterData=substring(@MasterData, 1, len(@MasterData) - 
charindex('\', reverse(@MasterData))) 

declare @MasterLog nvarchar(512) 
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\ 
Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg2', @MasterLog output 
select @MasterLog=substring(@MasterLog, 3, 255) 
select @MasterLog=substring(@MasterLog, 1, len(@MasterLog) - 
charindex('\', reverse(@MasterLog))) 

select 
    isnull(@DefaultData, @MasterData) DefaultData, 
    isnull(@DefaultLog, @MasterLog) DefaultLog 

使用SSMS查找DATA和LOG文件夾 -

SSMS>您的服務器>右鍵單擊>屬性>數據庫設置節點。

enter image description here

回答

5

首先感謝你提供的sp_RestoreFromAllFilesInDirectory的腳本創作者的主頁不再可用。

腳本您提供,僅打印生成的SQL因此,所有你需要去掉註釋:

EXEC(@sql) 

我知道這個問題是太舊了,但我救別人

0

使腳本MS SQL Server 2012的上工作,將另一列添加到#bdev表:

Containment int 

此外,我不得不改變一些列#dbfiles表進行BIGINT。