Comment puis-je récupérer le nom de fichier logique de la base de données à partir du fichier de sauvegarde
je suis à la recherche dans les étapes de la façon de Restaurer la Base de données de Sauvegarde à l'aide de Script SQL (T-SQL). Voici les étapes:
Base de données
YourDB
a une sauvegarde complèteYourBackUpFile.bak
. Il peut être restauré en deux étapes:Etape 1: Récupérer le nom de fichier logique de la base de données à partir de la sauvegarde.
RESTORE FILELISTONLY FROM DISK = 'D:BackUpYourBackUpFile.bak' GO
Etape 2: utilisez les valeurs de
LogicalName
colonne à la suivante étape.----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'
je suis juste avoir un problème sur la façon d'obtenir le YourMDFLogicalName
et YourLDFLogicalName
.
Quelqu'un peut-il m'aider?
6 réponses
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=''' +@Path+ '''
')
SET @LogicalNameData=(SELECT LogicalName FROM @Table WHERE Type='D')
SET @LogicalNameLog=(SELECT LogicalName FROM @Table WHERE Type='L')
SELECT @LogicalNameData,@LogicalNameLog
UPDATE
Selon site de Microsoft:
les fichiers SQL Server ont deux noms:
logical_file_name
le logical_file_name est Le nom utilisé pour désigner le fichier physique dans toutes les instructions Transact-SQL. Le nom du fichier logique doit être conforme les règles pour les identificateurs de Serveur SQL et doit être unique parmi logique noms de fichiers dans la base de données.
os_file_name
os_file_name est le nom du fichier physique, y compris la chemin d'accès au répertoire. Il doit suivre les règles pour le fichier de système d'exploitation nom.
logical_file_name: est le nom utilisé dans Microsoft SQL Server lors du référencement du fichier. Le nom doit être unique dans la base de données et être conforme aux règles relatives aux identificateurs. Le nom peut être un caractère ou une constante Unicode, un identifiant régulier ou un identifiant délimité.
From:http://msdn.microsoft.com/en-us/library/aa275464 (v=sql.80).aspx
aussi, à partir du script de Dalex, vous pouvez simplement lancer (sans toute la logique de la table):
RESTORE FILELISTONLY FROM DISK = 'D:\MyBackups\Backup.bak'
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
si vous avez la base de données originale (à partir de laquelle le fichier de sauvegarde a été pris) alors la façon la plus facile d'obtenir son nom logique est via:
use [original_db]
go
select file_name(1)
go
ou avec un T-SQL
> sqlcmd [connection parameters and credentials] -d [original_db] -Q "set nocount on; select file_name(1)" -h-1 -W
ce serait le même logical_name que vous utiliseriez dans la commande RESTORE.
mise à Jour de la version du script:
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),
[SnapshotUrl]varchar(128)
)
DECLARE @Path varchar(1000)='/path/to/backup.bak'
DECLARE @LogicalNameData varchar(128),@LogicalNameLog varchar(128)
INSERT INTO @table
EXEC('
RESTORE FILELISTONLY
FROM DISK=''' +@Path+ '''
')
SET @LogicalNameData=(SELECT LogicalName FROM @Table WHERE Type='D')
SET @LogicalNameLog=(SELECT LogicalName FROM @Table WHERE Type='L')
SELECT @LogicalNameData,@LogicalNameLog
Si vous effectuez vos modifications manuellement, vous pouvez trouver les noms correspondants avec la requête suivante:
SELECT db.name AS [DB Name], mf.name AS [Full logical name],
CASE
WHEN CHARINDEX('_', mf.name) > 0 THEN LEFT (mf.name, CHARINDEX('_', mf.name)-1)
ELSE mf.name
END AS [Shortened logical name]
FROM sys.master_files mf
INNER JOIN sys.databases db ON db.database_id = mf.database_id
WHERE mf.type_desc != 'LOG'
ORDER BY db.name;