【问题标题】:How can I retrieve the logical file name of the database from backup file如何从备份文件中检索数据库的逻辑文件名
【发布时间】:2011-10-28 17:05:06
【问题描述】:

我正在研究如何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 有疑问。 谁能帮我解决这个问题?

【问题讨论】:

    标签: sql sql-server backup restore


    【解决方案1】:

    如果您手动进行更改,则可以通过以下查询找到相应的名称:

    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;
    

    【讨论】:

    • 欢迎来到 StackOverflow!虽然这段代码回答了这个问题似乎是合理的,但通常最好包含一些关于它在做什么以及它如何解决特定问题的描述,也许还有这个和其他现有答案之间的区别,以帮助未来的读者了解哪个选项最适合他们。
    【解决方案2】:

    脚本的更新版本:

    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
    

    【讨论】:

      【解决方案3】:

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

      use [original_db]
      go
      select file_name(1)
      go
      

      或使用一个 T-SQL

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

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

      【讨论】:

      • use [my_db_name] go select file_name(1), file_name(2) go - 我用它来选择日志文件..
      • 这是迄今为止最好的答案。
      【解决方案4】:
      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
      

      【讨论】:

      • 在 SO 上,使用 4 个空格作为前缀的代码以将其格式化为代码。 meta.stackexchange.com/questions/22186/…
      • 此代码“LogicalName + ''' TO ''' + @RestorePath + LogicalName + '.ldf''”可能不起作用。因为逻辑名称可以不同于物理名称。
      【解决方案5】:

      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'
      

      【讨论】:

        【解决方案6】:
        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
        

        更新

        根据Microsoft site

        SQL Server 文件有两个名称:

        逻辑文件名

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

        os_file_name

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

        【讨论】:

        • RESTORE FILELISTONLY 的定义经常改变,破坏了这个脚本。有没有办法做“SELECT INTO”或“DECLARE CURSOR FOR”?
        猜你喜欢
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 2020-09-27
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多