如何从备份文件中检索数据库的逻辑文件名

Bip*_*pul 31 sql sql-server backup restore

我正在研究如何使用SQL脚本(T-SQL)还原数据库备份的步骤.以下是步骤:

数据库YourDB有完整备份YourBackUpFile.bak.可以使用以下两个步骤恢复它:

步骤1:从备份中检索数据库的逻辑文件名.

RESTORE FILELISTONLY
FROM DISK = 'D:BackUpYourBackUpFile.bak'
GO
Run Code Online (Sandbox Code Playgroud)

第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'
Run Code Online (Sandbox Code Playgroud)

我只是对如何获得YourMDFLogicalName和的问题YourLDFLogicalName.任何人都可以帮助我吗?

Dal*_*lex 41

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
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据微软网站:

SQL Server文件有两个名称:

logical_file_name

logical_file_name是用于在所有Transact-SQL语句中引用物理文件的名称.逻辑文件名必须符合SQL Server标识符的规则,并且在数据库中的逻辑文件名之间必须是唯一的.

则os_file_name

os_file_name是包含目录路径的物理文件的名称.它必须遵循操作系统文件名的规则.

  • RESTORE FILELISTONLY的定义经常更改,打破了这个脚本.有没有办法做"SELECT INTO"或"DECLARE CURSOR FOR"? (4认同)

phh*_*lho 14

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'
Run Code Online (Sandbox Code Playgroud)


Kok*_*oka 5

如果您拥有原始数据库(从中获取了备份文件),那么获取其逻辑名称的最简单方法是通过:

use [original_db]
go
select file_name(1)
go
Run Code Online (Sandbox Code Playgroud)

或使用一个T-SQL

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

这将与在RESTORE命令中使用的逻辑名称相同。


She*_*dan 5

脚本的更新版本:

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
Run Code Online (Sandbox Code Playgroud)