Подтвердить что ты не робот

Как получить логическое имя файла базы данных из файла резервной копии

Я изучил шаги Восстановить резервное копирование базы данных с помощью 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'

У меня просто проблема с тем, как получить YourMDFLogicalName и YourLDFLogicalName. Может ли кто-нибудь помочь мне в этом?

4b9b3361

Ответ 1

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

Согласно сайту Microsoft:

Файлы SQL Server имеют два имени:

logical_file_name

Логическое_файл_имя - это имя, используемое для ссылки на физический файл во всех операциях Transact-SQL. Логическое имя файла должно соответствовать правила для идентификаторов SQL Server и должны быть уникальными среди логических имена файлов в базе данных.

os_file_name

Имя os_file_name - это имя физического файла, включая путь к каталогу. Он должен следовать правилам для файла операционной системы имена.

Ответ 2

logical_file_name: это имя, используемое в Microsoft SQL Server при ссылке на файл. Имя должно быть уникальным в базе данных и соответствовать правилам для идентификаторов. Имя может быть символом или константой Unicode, регулярным идентификатором или идентификатором с разделителями.

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

Кроме того, из Dalex script вы можете просто запустить (без всей логики таблицы):

RESTORE FILELISTONLY FROM DISK = 'D:\MyBackups\Backup.bak'

Ответ 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.

Ответ 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

Ответ 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=''' [email protected]+ '''
   ')

   SET @LogicalNameData=(SELECT LogicalName FROM @Table WHERE Type='D')
   SET @LogicalNameLog=(SELECT LogicalName FROM @Table WHERE Type='L')

SELECT @LogicalNameData,@LogicalNameLog

Ответ 6

Я не смог найти ничего правильного или элегантного, поэтому взломал этот Sub в VB.NET. Этот код содержит подпрограмму, которая возвращает логические и физические имена в файле резервной копии. Эти имена затем могут быть использованы для восстановления базы данных с одного сервера на другой, если каталоги разные. Может быть, есть другие, которые не до конца понимают, как это может быть проблемой. Надеюсь, поможет.

Public Sub getDatabaseBackupFileInfo(ByVal server As String, ByVal databaseBackupFileNameAndPath As String, ByRef physName As String, ByRef logName As String, ByRef physNameLog As String, ByRef logNameLog As String)
                Dim connstr As String = ("Data Source=" + server + ";Initial Catalog=master;Integrated Security=True;")
                Dim Con As New SqlConnection(connstr)
                Dim objCmd As SqlCommand
                Dim bRet As Boolean = False
                Dim ret As String = "unknown"
                Dim SQL As String = ""
                Con.Open()
                Try
                        objCmd = Con.CreateCommand()
                        SQL = "RESTORE FILELISTONLY FROM DISK = N'" + databaseBackupFileNameAndPath + "'"
                        objCmd.CommandText = SQL
                        objCmd.ExecuteNonQuery()

                        Dim myReader As SqlDataReader
                        myReader = objCmd.ExecuteReader
                        Try
                                If myReader.HasRows Then
                                        myReader.Read()
                                        physName = myReader.Item("physicalname")
                                        logName = myReader.Item("logicalname")
                                        myReader.Read()
                                        physNameLog = myReader.Item("physicalname")
                                        logNameLog = myReader.Item("logicalname")
                                        myReader.Close()
                                End If
                        Catch ex As Exception
                        End Try
                Catch ex As Exception
#If DEBUG Then
                        MsgBox("DBG: getBackupFilePhysicalName: " + SQL + vbCrLf + physName + vbCrLf + logName + vbCrLf + physNameLog + vbCrLf + logNameLog + vbCrLf + ex.Message, MsgBoxStyle.OkOnly, "DEBUG")
#End If
                End Try

                Con.Close()
        End Sub

Затем вы можете просто вызвать его, указав имя сервера, а также путь и имя файла резервной копии.

Сначала настройте переменные.

Dim server as String = ".\SQLEXPRESS"
Dim filePath as String = "C:\Folder\Database.bak"
Dim physicalName As String = ""
Dim physNameLog As String = ""
Dim logicalName As String = ""
Dim logNameLog As String = ""

А затем запустить Restore, как это...

Вызовите вышеуказанную функцию и затем создайте свой запрос.

getDatabaseBackupFileInfo(server, filePath, physicalName, logicalName, physNameLog, logNameLog)
'build the query
strQuery = "RESTORE DATABASE [" & logicalName & "] " &
                     "FROM disk=N'" & filePath & "' " &
                     "WITH REPLACE, " +
                     "MOVE N'" & logicalName & "' TO N'" & physicalName & "', " &
                     "MOVE N'" + logNameLog + "' TO N'" & physNameLog & "', " +
                     "NOUNLOAD, REPLACE, STATS = 5"

Затем используйте ExecuteNonQuery(), чтобы сделать это.

Ответ 7

Если вы вносите изменения вручную, вы можете найти соответствующие имена с помощью следующего запроса:

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;