Ошибка. Логический файл не является частью базы данных. Используйте 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
Ответы
Ответ 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
То, о чем вы просите, не является тривиальным и имеет несколько потенциальных ошибок (вы хотите перезаписать базу данных, если она существует?) Что делать, если база данных используется, когда вы пытаетесь перезаписать? физические файлы в том же каталоге все время? и т.д.)..
К счастью, это было задано раньше, смотрите здесь, я его не тестировал, но он выглядит здорово.