2011-08-17 8 views
25

Stavo osservando i passaggi su come Restore Database Backup using SQL Script (T-SQL). Ecco i passaggi:Come recuperare il nome file logico del database dal file di backup

Database YourDB ha backup completo YourBackUpFile.bak. Può essere ripristinato utilizzando i seguenti due passi:

Passaggio 1: Recupera il nome file logico del database dal backup.

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

Fase 2: Utilizzare i valori nella colonna LogicalName nel passaggio seguente.

----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' 

Sto solo avendo problema su come ottenere il YourMDFLogicalName e YourLDFLogicalName. Qualcuno può aiutarmi con quello?

risposta

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

Secondo Microsoft site:

file di SQL Server hanno due nomi:

logical_file_name

Il logical_file_name è il nome usato per riferirsi al file fisico in tutte le istruzioni Transact-SQL. Il nome del file logico deve essere conforme alle regole per gli identificatori di SQL Server e deve essere univoco tra i nomi di file logici nel database.

os_file_name

L'os_file_name è il nome del file fisico incluso il percorso directory. Deve seguire le regole per i nomi del file del sistema operativo .

+3

La definizione di RESTORE FILELISTONLY cambia ogni tanto, interrompendo questo script. C'è un modo per fare una specie di "SELECT INTO" o "DECLARE CURSOR FOR"? – Brain2000

13

logical_file_name: è il nome utilizzato in Microsoft SQL Server quando si fa riferimento al file. Il nome deve essere univoco all'interno del database e conforme alle regole per gli identificatori. Il nome può essere un carattere o costante Unicode, un identificatore regolare o un identificatore delimitato.

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

Inoltre, da uno script di Dalex, si può semplicemente eseguire (senza tutta la logica tabella):

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

Su SO, codice prefisso con 4 spazi per formattarlo come codice. http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks – Amy

+0

questo codice "LogicalName + '' 'TO' '' + @RestorePath + LogicalName + '.ldf' '"potrebbe non funzionare. perché il nome logico può essere diverso dal nome fisico. –

1

Se avete l'originale DB (da cui il backup file è stato preso) quindi il modo più semplice per ottenere il suo nome logico è via:

use [original_db] 
go 
select file_name(1) 
go 

o con o NE T-SQL

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

Questo sarebbe lo stesso logical_name si usa nel comando RESTORE.

Problemi correlati