2011-08-17 53 views
25

我正在查看如何處理Restore Database Backup using SQL Script (T-SQL)的步驟。這裏是步驟:如何從備份文件中檢索數據庫的邏輯文件名

數據庫YourDB已完全備份YourBackUpFile.bak。它可以使用以下兩個步驟來恢復:

步驟1:從備份中檢索數據庫的邏輯文件名。

RESTORE FILELISTONLY 
FROM DISK = 'D:BackUpYourBackUpFile.bak' 
GO 

步驟2:使用在以下的步驟中的LogicalName列中的值。

----Make Database to single user Mode 
ALTER DATABASE YourDB 
SET SINGLE_USER WITH 
ROLLBACK IMMEDIATE 

----Restore Database 
RESTORE DATABASE YourDB 
FROM DISK = 'D:BackUpYourBackUpFile.bak' 
WITH MOVE 'YourMDFLogicalName' TO 'D:DataYourMDFFile.mdf', 
MOVE 'YourLDFLogicalName' TO 'D:DataYourLDFFile.ldf' 

我只是有關於如何讓YourMDFLogicalNameYourLDFLogicalName問題。 任何人都可以幫助我嗎?

回答

34
DECLARE @Table TABLE (LogicalName varchar(128),[PhysicalName] varchar(128), [Type] varchar, [FileGroupName] varchar(128), [Size] varchar(128), 
      [MaxSize] varchar(128), [FileId]varchar(128), [CreateLSN]varchar(128), [DropLSN]varchar(128), [UniqueId]varchar(128), [ReadOnlyLSN]varchar(128), [ReadWriteLSN]varchar(128), 
      [BackupSizeInBytes]varchar(128), [SourceBlockSize]varchar(128), [FileGroupId]varchar(128), [LogGroupGUID]varchar(128), [DifferentialBaseLSN]varchar(128), [DifferentialBaseGUID]varchar(128), [IsReadOnly]varchar(128), [IsPresent]varchar(128), [TDEThumbprint]varchar(128) 
) 
DECLARE @Path varchar(1000)='C:\SomePath\Base.bak' 
DECLARE @LogicalNameData varchar(128),@LogicalNameLog varchar(128) 
INSERT INTO @table 
EXEC(' 
RESTORE FILELISTONLY 
    FROM DISK=''' [email protected]+ ''' 
    ') 

    SET @LogicalNameData=(SELECT LogicalName FROM @Table WHERE Type='D') 
    SET @LogicalNameLog=(SELECT LogicalName FROM @Table WHERE Type='L') 

SELECT @LogicalNameData,@LogicalNameLog 

UPDATE

根據Microsoft site

SQL Server文件有兩個名稱:

logical_file_name

的logical_file_name是用來指的名字物理文件所有Transact-SQL語句中的。邏輯文件名必須符合 SQL Server標識符的規則,並且在數據庫中的邏輯 文件名中必須是唯一的。

則os_file_name

的則os_file_name是物理文件包括 目錄路徑名。它必須遵循操作系統文件 名稱的規則。

+3

RESTORE FILELISTONLY的定義經常發生變化,打破了這個腳本。有沒有辦法做一個「SELECT INTO」或「DECLARE CURSOR FOR」? – Brain2000

13

logical_file_name:是Microsoft SQL Server在引用文件時使用的名稱。該名稱在數據庫中必須是唯一的,並符合標識符的規則。名稱可以是字符或Unicode常量,常規標識符或分隔標識符。

來源:http://msdn.microsoft.com/en-us/library/aa275464(v=sql.80).aspx

此外,從Dalex的劇本,你可以只運行(不包括所有的表邏輯):

RESTORE FILELISTONLY FROM DISK = 'D:\MyBackups\Backup.bak' 
1
DECLARE @Path VARCHAR(1000)= N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\aaa.bak', 
     @RestorePath NVARCHAR(max)='C:\' 

DECLARE @Table TABLE 
    (
     LogicalName VARCHAR(128) , 
     [PhysicalName] VARCHAR(128) , 
     [Type] VARCHAR , 
     [FileGroupName] VARCHAR(128) , 
     [Size] VARCHAR(128) , 
     [MaxSize] VARCHAR(128) , 
     [FileId] VARCHAR(128) , 
     [CreateLSN] VARCHAR(128) , 
     [DropLSN] VARCHAR(128) , 
     [UniqueId] VARCHAR(128) , 
     [ReadOnlyLSN] VARCHAR(128) , 
     [ReadWriteLSN] VARCHAR(128) , 
     [BackupSizeInBytes] VARCHAR(128) , 
     [SourceBlockSize] VARCHAR(128) , 
     [FileGroupId] VARCHAR(128) , 
     [LogGroupGUID] VARCHAR(128) , 
     [DifferentialBaseLSN] VARCHAR(128) , 
     [DifferentialBaseGUID] VARCHAR(128) , 
     [IsReadOnly] VARCHAR(128) , 
     [IsPresent] VARCHAR(128) , 
     [TDEThumbprint] VARCHAR(128) 
    ) 

DECLARE @LogicalNameData VARCHAR(128) , 
    @LogicalNameLog VARCHAR(128) 
INSERT INTO @table 
     EXEC (' 
RESTORE FILELISTONLY 
    FROM DISK=''' + @Path + ''' 
    ' 
      ) 

DECLARE @restoreScript NVARCHAR(max)='RESTORE DATABASE [aaa] FROM DISK =''' + @Path + ''' WITH FILE = 1 ' 

SELECT @restoreScript +=CHAR(10) + ' ,MOVE ''' + LogicalName + ''' TO ''' + 
     @RestorePath + LogicalName + RIGHT(PhysicalName,4) + '''' 
         FROM @Table 
         WHERE Type = 'D' 

SELECT @restoreScript += ' ,MOVE ''' + LogicalName + ''' TO ''' + @RestorePath + LogicalName + '.ldf''' 
         FROM @Table 
         WHERE Type = 'L' 

SET @restoreScript += ' , NOUNLOAD, REPLACE, STATS = 10 ' 
SELECT @restoreScript 
+1

在SO上,用4個空格前綴代碼將其格式化爲代碼。 http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks – Amy

+0

此代碼「LogicalName +'''TO'''+ @RestorePath + LogicalName +'.ldf' '「可能不起作用。因爲邏輯名稱可能與物理名稱不同。 –

1

如果您有原始數據庫(從中進行備份那麼獲取其邏輯名稱的最簡單方法是:

use [original_db] 
go 
select file_name(1) 
go 

或帶o ne T-SQL

> sqlcmd [connection parameters and credentials] -d [original_db] -Q "set nocount on; select file_name(1)" -h-1 -W 

這將與您在RESTORE命令中使用的logical_name相同。

相關問題