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

Ошибка. Логический файл не является частью базы данных. Используйте RESTORE FILELISTONLY для отображения логических имен файлов

Я создал script для восстановления файлов .bak или backup. Он работает для некоторых баз данных, но не для одного. Как заставить его работать для любого типа .bak файла? Это в SQL Server 2008. Сообщение об ошибке -

Msg 3234, Level 16, State 1, Line 1
Logical file 'Northwind_Data' is not part of database 'Northwind'. 
Use RESTORE FILELISTONLY to list the logical file names.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

Script -

IF DB_ID('Northwind') IS NULL
BEGIN
RESTORE DATABASE [Northwind]
FILE = N'Northwind_Data'
FROM 
DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\Northwind.bak'
WITH  FILE = 1,
MOVE N'Northwind_Data'
TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind.mdf',
MOVE N'Northwind_Log'
 TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind_0.LDF',
NOUNLOAD,  STATS = 10
END
4b9b3361

Ответ 1

Пройдите ниже sql и проверьте логические имена

RESTORE FILELISTONLY 
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\Northwind.bak'

И затем замените логическое имя, показанное RESTORE FILELISTONLY в script ниже

--If database already exists do not restore
IF DB_ID('Northwind') IS NULL 
BEGIN
  RESTORE DATABASE [Northwind]
  FILE = N'Northwind_Data'
  FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\Northwind.bak'
  WITH 
    FILE = 1, NOUNLOAD, STATS = 10,
    MOVE N'YOUR logical name of data file as shown by RESTORE FILELISTONLY command'
    TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind.mdf',
    MOVE N'YOUR logical name of Log file as shown by RESTORE FILELISTONLY command'
    TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\Northwind_0.LDF'
END

Ответ 2

Проверьте свойства базы данных и убедитесь, что логическое имя совпадает с именем файла. Используйте команду "Изменить базу данных", чтобы изменить эти параметры:

ALTER DATABASE [Northwind] MODIFY FILE (NAME=N'Northwind_Data', NEWNAME=N'Northwind')
GO
ALTER DATABASE [Northwind] MODIFY FILE (NAME=N'Northwind_Data_log', NEWNAME=N'Northwind_log')
GO

Ответ 3

Я использовал Powershell, чтобы сделать это, и у меня была та же ошибка. Что меня привлекло, так это то, что я использовал "$ db_log.mdf" и символ подчеркивания являются допустимым символом для определений переменных, поэтому он действительно искал $ db_log и не конкатенировал.

Итак, мой код выглядел так:

  $db = "MyNewDb"
  $restoreSuffix = "_V1"
  $newDbName = $db
  $dataFileOrigin = $db
  $logFileOrigin = $db+"_log"
  $dataFileLocation = "$dataAndLogFileDestination\$db$restoreSuffix.mdf"
  $logFileLocation = "$dataAndLogFileDestination\$db$restoreSuffix"+"_log.ldf"

  echo "Renaming and Relocating files to ($newDbName)"

  $RelocateData = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("$dataFileOrigin", "$dataFileLocation")
  $RelocateLog = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("$logFileOrigin", "$logFileLocation")
  Restore-SqlDatabase -ServerInstance "." -Database "$newDbName" -BackupFile "$backupLocation$db.bak" -RelocateFile @($RelocateData,$RelocateLog)

Ответ 4

То, о чем вы просите, не является тривиальным и имеет несколько потенциальных ошибок (вы хотите перезаписать базу данных, если она существует?) Что делать, если база данных используется, когда вы пытаетесь перезаписать? физические файлы в том же каталоге все время? и т.д.)..

К счастью, это было задано раньше, смотрите здесь, я его не тестировал, но он выглядит здорово.