web-dev-qa-db-ja.com

データベースバックアップの復元エラー

以前のバージョン(SQL Server 2008)で作成されたバックアップを復元すると、SQL Server 2012を使用してエラーが発生します。実際には、同じデータベースのバックアップファイルがいくつかあります(過去に異なる時間に取得されました)。最新のものは問題なく復元されます。ただし、そのうちの1つは次のエラーを返します。

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で復元しようとする理由がわかりません。

21
Marius Bancila

私はコードからこれを行うことができました。これでは十分ではありませんでした

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

ログファイルについても同じです。

5
Marius Bancila

バックアップがあなたのパスと一致しないマシンで行われたように聞こえます。 UIの代わりに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';
35
Aaron Bertrand

バックアップは、データベースファイルの元の場所を保存し、デフォルトでは同じ場所に復元しようとします。新しいサーバーのインストールは新しいディレクトリにあり、おそらく古いディレクトリはもう存在しないので、使用する場所に合わせてディレクトリをデフォルトから変更する必要があります。

データベースの復元方法に応じて、これを行う方法は異なります。 SSMSを使用している場合は、ファイルとそれに関連するディスクの場所のリストが見つかるまでタブとリストを確認します。復元する前にそれらの場所を編集できます。

9
Daniel Renshaw

私は同じ問題を抱えていましたが、これはC#コードなしで修正しました:

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
Paul W

復元する場合、[ファイル]の下の[すべてのファイルをフォルダーに再配置する]をオンにします。

check 'Relocate all files to folder'

4
Hypenate

すでに何度か言われているように、mdfファイルとldfファイルの新しいパスと古いパスが一致しないバックアップを復元すると、このエラーが発生する可能性があります。ここにはすでにSQLでそれを処理する方法のいくつかの良い例がありますが、私の場合、fromの部分に「.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オプション。すでにそうしていたとき。

2
tomRedox

[データベースの復元]ダイアログの[オプション]ページで[テールログバックアップ]オプションのチェックを外してください。

0
user5167194

これらの行をスクリプトから削除する必要があります。

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 
0
Habib Ur Rehman

SQLサービスを再起動してください。私のために働いた。

0
Chris

これがPowershellで直接作業する( [〜#〜] smo [〜#〜] ライブラリを使用する)場合に便利な場合に備えて、この特定のケースではセカンダリデータファイルもありました。開いているプロセスをすべて強制終了してから復元することで、スクリプトを少し強化しました。

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
0
dim_user

これは通常、1つのMSSQL Studioをバックアップ(古いサーバーに接続)と復元(新しいサーバーに接続)に使用している場合に発生します。正しいサーバーで復元を実行していることを確認してください。 UIの左ペインでサーバー名とIPを確認するか、

0
kafe

これにはいくつかのバージョンの問題があります。次の2つの方法でデータベースを2012に移行できます。

1)データベースをオフラインにし、.mdfファイルと.ldfファイルをターゲットサーバーのデータフォルダーにコピーして、データベースをアタッチします。これを参照してください: https://dba.stackexchange.com/questions/30440/how-do-i-attach-a-database-in-sql-server

2)スキーマとデータを使用してデータベース全体のスクリプトを作成し、ターゲットサーバーで実行します(非常に遅いプロセスには時間がかかります)。これを参照してください: SQL Server Management Studioでスクリプトを生成

0
vinod meena