Вопрос:
Я получаю сообщение об ошибке с помощью SQL Server 2012 при восстановлении резервной копии, сделанной с предыдущей версией (SQL Server 2008). На самом деле у меня есть несколько файлов резервных копий одной и той же базы данных (взятых в разное время в прошлом). Новейшие восстанавливаются без проблем; однако одна из них дает следующую ошибку:
System.Data.SqlClient.SqlError: поиск в каталоге для файла “C:PROGRAM FILESMICROSOFT SQL SERVERMSSQL.1MSSQLDATAMYDB_ABC.MDF” не удалось выполнить системная ошибка 3 (система не может найти указанный путь). (Microsoft.SqlServer.SmoExtended)
Это машина x64, и мои файлы базы данных находятся в этом месте: c:Program FilesMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQL.
Я не понимаю, почему он пытается восстановить на MSSQL.1, а не MSSQL11.MSSQLSERVER.
Лучший ответ:
Мне удалось сделать это из кода. Этого было недостаточно
Restore bkp = new Restore(); bkp.PercentCompleteNotification = 1; bkp.Action = RestoreActionType.Database; bkp.Database = sDatabase; bkp.ReplaceDatabase = true;
Свойство RelocateFiles должно быть заполнено именами и путями файлов, подлежащих перемещению. Для каждого файла вы должны указать имя файла и новый физический путь. Итак, я сделал поиск PrimaryFilePath базы данных, которую я восстанавливал, и использовал это как физическое местоположение. Что-то вроде этого:
if (!string.IsNullOrEmpty(sDataFileName) && !File.Exists(sDataFileName)) { if (originaldb != null) { if (string.Compare(Path.GetDirectoryName(sDataFileName), originaldb.PrimaryFilePath, true) != 0) { string sPhysicalDataFileName = Path.Combine(originaldb.PrimaryFilePath, sDatabase + «.MDF»); bkp.RelocateFiles.Add(new RelocateFile(sLogicalDataFileName, sPhysicalDataFileName)); } } }
То же самое для файла журнала.
Ответ №1
Похоже, что резервная копия была сделана на машине, чьи пути не совпадают с вашими. Попробуйте выполнить резервное копирование с использованием T-SQL вместо пользовательского интерфейса. Также убедитесь, что пути, которые вы указываете, действительно существуют и что в них нет копии этих файлов mdf/ldf.
RESTORE DATABASE MYDB_ABC FROM DISK = ‘C:pathfile.bak’ WITH MOVE ‘mydb’ TO ‘c:valid_data_pathMYDB_ABC.mdf’, MOVE ‘mydb_log’ TO ‘c:valid_log_pathMYDB_ABC.ldf’; Ответ №2
Резервное копирование сохраняет исходное местоположение файлов базы данных и по умолчанию пытается восстановить его в том же месте. Поскольку ваша новая установка сервера находится в новых каталогах, и, по-видимому, старые каталоги больше не существуют, вам нужно изменить каталоги по умолчанию, чтобы они соответствовали местоположению, которое вы хотите использовать.
В зависимости от того, как вы восстанавливаете базу данных, способ сделать это будет отличаться. Если вы используете SSMS, просмотрите вкладки и списки до тех пор, пока не найдете список файлов и связанных с ними мест на диске – вы можете затем отредактировать эти места перед восстановлением.
Ответ №3
У меня была та же проблема, и это исправлено без кода С#:
USE [master] ALTER DATABASE [MyDb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE RESTORE DATABASE [MyDb] FROM DISK = N’D:backupsmydb.bak’ WITH FILE = 1, MOVE N’MyDb’ TO N»c:valid_data_pathMyDb.mdf’, MOVE N’MyDb_log’ TO N’valid_log_pathMyDb.ldf’, NOUNLOAD, REPLACE, STATS = 5 ALTER DATABASE [MyDb] SET MULTI_USER GO Ответ №4
При восстановлении в разделе “Файлы” установите флажок “Переместить все файлы в папку”
Ответ №5
Как уже было сказано несколько раз, восстановление резервной копии, когда новые и старые пути для файлов mdf и ldf не совпадают, может вызвать эту ошибку. Здесь уже есть несколько хороших примеров того, как работать с SQL, но ни один из них не работал у меня, пока я не понял, что в моем случае мне нужно включить расширения .mdf и .ldf в часть из оператор ‘MOVE’, например:
RESTORE DATABASE [SomeDB] FROM DISK = N’D:SomeDB.bak’ WITH MOVE N’SomeDB.mdf’ TO N’D:SQL ServerMSSQL12.MyInstanceMSSQLDATASomeDB.mdf’, MOVE N’SomeDb_log.ldf’ TO N’D:SQL ServerMSSQL12.MyInstanceMSSQLDATASomeDB_log.ldf’
Надеюсь, что это избавит кого-то от боли, я не мог понять, почему SQL предлагал мне использовать параметр WITH MOVE, когда я уже это делал.
Ответ №6
Попробуйте снять флажок “Резервное копирование журнала” на странице “Параметры” диалогового окна “Восстановить базу данных”
Ответ №7
В этом есть проблема с версией. Вы можете перенести свою базу данных на 2012 еще двумя способами: –
1) откройте базу данных в автономном режиме > скопируйте файлы .mdf и .ldf в папку данных целевого сервера и прикрепите базу данных. см. это: –
https://dba.stackexchange.com/questions/30440/how-do-i-attach-a-database-in-sql-server
2) Создайте script всей базы данных со схемой и данными и запустите ее на целевом сервере (очень медленный процесс требует времени). см. это: –
Создать script в SQL Server Management Studio
Ответ №8
Попробуйте перезапустить службу SQL. Работал для меня.
Ответ №9
На всякий случай это полезно для тех, кто работает непосредственно с Powershell (используя библиотеку SMO), в этом конкретном случае были вторичные файлы данных. Я немного улучшил script, убив любые открытые процессы, а затем выполнив восстановление.
Import-module SQLPS $svr = New-Object («Microsoft.SqlServer.Management.Smo.Server») «server name»; $svr.KillAllProcesses(«database_name»); $RelocateData1 = New-Object «Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91» («primary_logical_name»,»C:…SQLDATADATAdatabase_name.mdf») $RelocateData2 = New-Object «Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91» («secondary_logical_name_2″,»C:…SQLDATADATAsecondary_file_2.mdf») $RelocateData3 = New-Object «Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91» («secondary_logical_name_3″,»C:…SQLDATADATAsecondary_file_3.mdf») $RelocateLog = New-Object «Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91» («database_name_log»,»C:…SQLDATALOGSdatabase_name_log.ldf») Restore-SqlDatabase -ServerInstance «server-name» -Database «database_name» -BackupFile «\BACKUPS\database_name.bak» -RelocateFile @($RelocateData1, $RelocateData2, $RelocateData3, $RelocateLog) -ReplaceDatabase Ответ №10
Вы должны удалить эти строки из вашего скрипта.
CONTAINMENT = NONE ON PRIMARY ( NAME = N’StudentManagement’, FILENAME = N’C:Program FilesMicrosoft SQL ServerMSSQL11.SQLEXPRESSMSSQLDATAStudentManagement.mdf’ , SIZE = 10240KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N’StudentManagement_log’, FILENAME = N’C:Program FilesMicrosoft SQL ServerMSSQL11.SQLEXPRESSMSSQLDATAStudentManagement_log.ldf’ , SIZE = 5696KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO ALTER DATABASE [StudentManagement] SET COMPATIBILITY_LEVEL = 110 GO IF (1 = FULLTEXTSERVICEPROPERTY(‘IsFullTextInstalled’)) begin EXEC [StudentManagement].[dbo].[sp_fulltext_database] @action = ‘enable’ end GO ALTER DATABASE [StudentManagement] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [StudentManagement] SET ANSI_NULLS OFF GO ALTER DATABASE [StudentManagement] SET ANSI_PADDING OFF GO ALTER DATABASE [StudentManagement] SET ANSI_WARNINGS OFF GO ALTER DATABASE [StudentManagement] SET ARITHABORT OFF GO ALTER DATABASE [StudentManagement] SET AUTO_CLOSE OFF GO ALTER DATABASE [StudentManagement] SET AUTO_CREATE_STATISTICS ON GO ALTER DATABASE [StudentManagement] SET AUTO_SHRINK OFF GO ALTER DATABASE [StudentManagement] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [StudentManagement] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [StudentManagement] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [StudentManagement] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [StudentManagement] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [StudentManagement] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [StudentManagement] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [StudentManagement] SET DISABLE_BROKER GO ALTER DATABASE [StudentManagement] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [StudentManagement] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [StudentManagement] SET TRUSTWORTHY OFF GO ALTER DATABASE [StudentManagement] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [StudentManagement] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [StudentManagement] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [StudentManagement] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [StudentManagement] SET RECOVERY SIMPLE GO ALTER DATABASE [StudentManagement] SET MULTI_USER GO ALTER DATABASE [StudentManagement] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [StudentManagement] SET DB_CHAINING OFF GO ALTER DATABASE [StudentManagement] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO ALTER DATABASE [StudentManagement] SET TARGET_RECOVERY_TIME = 0 SECONDS Ответ №11
Обычно это происходит, когда вы используете одну MSSQL Studio для резервного копирования (подключена к старому серверу) и восстановления (подключена к новому). Просто убедитесь, что вы выполняете восстановление на правильном сервере. Либо проверьте имя сервера и IP в левой панели в пользовательском интерфейсе или доу
Ответ №12
Измените путь к файлу .mdf. Просто создайте папку на любом диске, т.е. На диске “D”, просто создайте папку с настраиваемым именем (dbase) и укажите путь к новой папке, mssql автоматически создаст файлы.
“C:PROGRAM FILESMICROSOFT SQL SERVERMSSQL.1MSSQLDATAMYDB_ABC.MDF”
в
“D:DBaseMYDB_ABC.MDF”