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

Ошибка восстановления резервной копии базы данных

Я получаю сообщение об ошибке с помощью SQL Server 2012 при восстановлении резервной копии, сделанной с предыдущей версией (SQL Server 2008). На самом деле у меня есть несколько файлов резервных копий одной и той же базы данных (взятых в разное время в прошлом). Новейшие восстанавливаются без проблем; однако одна из них дает следующую ошибку:

System.Data.SqlClient.SqlError: поиск в каталоге для файла "C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL.1\MSSQL\DATA\MYDB_ABC.MDF" не удалось выполнить системная ошибка 3 (система не может найти указанный путь). (Microsoft.SqlServer.SmoExtended)

Это машина x64, и мои файлы базы данных находятся в этом месте: c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL.

Я не понимаю, почему он пытается восстановить на MSSQL.1, а не MSSQL11.MSSQLSERVER.

4b9b3361

Ответ 1

Мне удалось сделать это из кода. Этого было недостаточно

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));
      }                  
   }
}

То же самое для файла журнала.

Ответ 2

Похоже, что резервная копия была сделана на машине, чьи пути не совпадают с вашими. Попробуйте выполнить резервное копирование с использованием T-SQL вместо пользовательского интерфейса. Также убедитесь, что пути, которые вы указываете, действительно существуют и что в них нет копии этих файлов mdf/ldf.

RESTORE DATABASE MYDB_ABC FROM DISK = 'C:\path\file.bak'
WITH MOVE 'mydb' TO 'c:\valid_data_path\MYDB_ABC.mdf',
MOVE 'mydb_log' TO 'c:\valid_log_path\MYDB_ABC.ldf';

Ответ 3

Резервное копирование сохраняет исходное местоположение файлов базы данных и по умолчанию пытается восстановить его в том же месте. Поскольку ваша новая установка сервера находится в новых каталогах, и, по-видимому, старые каталоги больше не существуют, вам нужно изменить каталоги по умолчанию, чтобы они соответствовали местоположению, которое вы хотите использовать.

В зависимости от того, как вы восстанавливаете базу данных, способ сделать это будет отличаться. Если вы используете SSMS, просмотрите вкладки и списки до тех пор, пока не найдете список файлов и связанных с ними мест на диске - вы можете затем отредактировать эти места перед восстановлением.

Ответ 4

У меня была та же проблема, и это исправлено без кода С#:

USE [master]
ALTER DATABASE [MyDb] 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [MyDb] 
FROM  DISK = N'D:\backups\mydb.bak' 
WITH  FILE = 1,  
MOVE N'MyDb' TO N''c:\valid_data_path\MyDb.mdf',  
MOVE N'MyDb_log' TO N'\valid_log_path\MyDb.ldf',  
NOUNLOAD,  
REPLACE,  
STATS = 5
ALTER DATABASE [MyDb] SET MULTI_USER
GO

Ответ 5

При восстановлении в разделе "Файлы" установите флажок "Переместить все файлы в папку"

check

Ответ 6

Как уже было сказано несколько раз, восстановление резервной копии, когда новые и старые пути для файлов mdf и ldf не совпадают, может вызвать эту ошибку. Здесь уже есть несколько хороших примеров того, как работать с SQL, но ни один из них не работал у меня, пока я не понял, что в моем случае мне нужно включить расширения .mdf и .ldf в часть из оператор 'MOVE', например:

RESTORE DATABASE [SomeDB] 
FROM DISK = N'D:\SomeDB.bak' 
WITH MOVE N'SomeDB.mdf' TO N'D:\SQL Server\MSSQL12.MyInstance\MSSQL\DATA\SomeDB.mdf', 
MOVE N'SomeDb_log.ldf' TO N'D:\SQL Server\MSSQL12.MyInstance\MSSQL\DATA\SomeDB_log.ldf'

Надеюсь, что это избавит кого-то от боли, я не мог понять, почему SQL предлагал мне использовать параметр WITH MOVE, когда я уже это делал.

Ответ 7

Попробуйте снять флажок "Резервное копирование журнала" на странице "Параметры" диалогового окна "Восстановить базу данных"

Ответ 8

В этом есть проблема с версией. Вы можете перенести свою базу данных на 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

Ответ 9

Попробуйте перезапустить службу SQL. Работал для меня.

Ответ 10

На всякий случай это полезно для тех, кто работает непосредственно с 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:\...\SQLDATA\DATA\database_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:\...\SQLDATA\DATA\secondary_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:\...\SQLDATA\DATA\secondary_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:\...\SQLDATA\LOGS\database_name_log.ldf")
Restore-SqlDatabase -ServerInstance "server-name" -Database "database_name" -BackupFile "\\BACKUPS\\database_name.bak" -RelocateFile @($RelocateData1, $RelocateData2, $RelocateData3, $RelocateLog) -ReplaceDatabase

Ответ 11

Вы должны удалить эти строки из вашего скрипта.

CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'StudentManagement', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\StudentManagement.mdf' , SIZE = 10240KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'StudentManagement_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\StudentManagement_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 

Ответ 12

Обычно это происходит, когда вы используете одну MSSQL Studio для резервного копирования (подключена к старому серверу) и восстановления (подключена к новому). Просто убедитесь, что вы выполняете восстановление на правильном сервере. Либо проверьте имя сервера и IP в левой панели в пользовательском интерфейсе или доу

Ответ 13

Измените путь к файлу .mdf. Просто создайте папку на любом диске, т.е. На диске "D", просто создайте папку с настраиваемым именем (dbase) и укажите путь к новой папке, mssql автоматически создаст файлы.

"C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL.1\MSSQL\DATA\MYDB_ABC.MDF" в "D:\DBase\MYDB_ABC.MDF"