Вопрос:
Я создал 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 FilesMicrosoft SQL ServerMSSQL10_50.SS2008MSSQLBackupNorthwind.bak’ WITH FILE = 1, MOVE N’Northwind_Data’ TO N’C:Program FilesMicrosoft SQL ServerMSSQL10_50.SS2008MSSQLDATANorthwind.mdf’, MOVE N’Northwind_Log’ TO N’C:Program FilesMicrosoft SQL ServerMSSQL10_50.SS2008MSSQLDATANorthwind_0.LDF’, NOUNLOAD, STATS = 10 END Ответ №1
Пройдите ниже sql и проверьте логические имена
RESTORE FILELISTONLY FROM DISK = ‘C:Program FilesMicrosoft SQL ServerMSSQL10_50.SS2008MSSQLBackupNorthwind.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 FilesMicrosoft SQL ServerMSSQL10_50.SS2008MSSQLBackupNorthwind.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 FilesMicrosoft SQL ServerMSSQL10_50.SS2008MSSQLDATANorthwind.mdf’, MOVE N’YOUR logical name of Log file as shown by RESTORE FILELISTONLY command’ TO N’C:Program FilesMicrosoft SQL ServerMSSQL10_50.SS2008MSSQLDATANorthwind_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
То, о чем вы просите, не является тривиальным и имеет несколько потенциальных ошибок (вы хотите перезаписать базу данных, если она существует?) Что делать, если база данных используется, когда вы пытаетесь перезаписать? физические файлы в том же каталоге все время? и т.д.)..
К счастью, это было задано раньше, смотрите здесь, я его не тестировал, но он выглядит здорово.