Je cherchais les étapes de la façon de restaurer la sauvegarde de la base de données à l'aide de SQL Script (T-SQL) . Voici les étapes:
La base de données
YourDB
a une sauvegarde complèteYourBackUpFile.bak
. Il peut être restauré en suivant les deux étapes suivantes:Étape 1: Récupérez le nom de fichier logique de la base de données à partir de la sauvegarde.
RESTORE FILELISTONLY FROM DISK = 'D:BackUpYourBackUpFile.bak' GO
Étape 2: Utilisez les valeurs de la colonne
LogicalName
à l'étape suivante.----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'
J'ai juste un problème sur la façon d'obtenir les YourMDFLogicalName
et YourLDFLogicalName
. Est-ce que quelqu'un peut m'aider avec cela?
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
[~ # ~] mise à jour [~ # ~]
Selon site Microsoft :
Les fichiers SQL Server ont deux noms:
nom_fichier_logique
Le nom_fichier_logique est le nom utilisé pour faire référence au fichier physique dans toutes les instructions Transact-SQL. Le nom de fichier logique doit respecter les règles relatives aux identificateurs SQL Server et doit être unique parmi les noms de fichiers logiques de la base de données.
os_file_name
Os_file_name est le nom du fichier physique, y compris le chemin du répertoire. Il doit suivre les règles pour les noms de fichiers du système d'exploitation.
nom_fichier_logique: 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 conforme aux règles des identifiants. Le nom peut être un caractère ou une constante Unicode, un identifiant régulier ou un identifiant délimité.
De: http://msdn.Microsoft.com/en-us/library/aa275464 (v = sql.80) .aspx
De plus, à partir du script de Dalex, vous pouvez simplement exécuter (sans toute la logique de la table):
RESTORE FILELISTONLY FROM DISK = 'D:\MyBackups\Backup.bak'
Si vous avez la base de données d'origine (à partir de laquelle le fichier de sauvegarde a été extrait), le moyen le plus simple 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 nom_logique que vous utiliseriez dans la commande RESTORE.
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
Version mise à jour 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;