24

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

4

14 に答える 14

39

パスが自分のパスと一致しないマシンでバックアップが作成されたようです。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';
于 2012-05-24T16:16:03.040 に答える
15

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

「すべてのファイルをフォルダに再配置する」にチェックを入れます

于 2018-01-18T09:56:29.853 に答える
10

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

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

于 2012-05-24T16:16:10.430 に答える
7

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

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

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

于 2012-05-25T09:17:09.470 に答える
6

私は同じ問題を抱えていました、そしてこれは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
于 2014-10-20T06:33:39.883 に答える
3

すでに数回述べたように、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私がすでにそうしているときにオプションを使用する必要があると示唆している理由を理解できませんでした。

于 2017-05-11T12:38:01.787 に答える
0

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

于 2015-07-29T00:22:51.280 に答える
0

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

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

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

于 2015-08-26T20:05:57.610 に答える
0

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

于 2016-01-04T14:48:08.453 に答える
0

これが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
于 2018-01-18T20:57:40.353 に答える
0

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

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 
于 2019-03-05T17:26:29.913 に答える
0

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

于 2019-04-24T11:24:34.230 に答える
0

これをC#で行っていて、物理パスが同じでない場合は、ここでも言及されている1つの答えとして、RelocateFilesを使用する必要があります。

ほとんどの場合、以下のコードは次のことを前提として機能します。

  1. 他の場所からデータベースのバックアップを復元しているだけです。それ以外の場合は同一です。たとえば、ローカルDbへのプロダクションのコピー。

  2. 非定型のデータベースレイアウトを使用していません。たとえば、行ファイルが複数のディスク上の複数のファイルに分散している場合などです。

また、以下は最初の復元時にのみ必要です。単一の正常な復元が発生すると、以下のファイルマッピングがSQLServerですでにセットアップされています。しかし、初めて-bakファイルを空のdbに復元する-基本的には、「はい、Dbファイルをおかしくするのではなく、デフォルトのローカルの場所で使用してください」と言う必要があります。同じ場所で、奇妙なことに、それらを再配置するように指示します。

var dbDataFile = db.FileGroups[0].Files[0];
restore.RelocateFiles.Add(new RelocateFile(dbDataFile.Name, dbDataFile.FileName));
var dbLogFile = db.LogFiles[0];
restore.RelocateFiles.Add(new RelocateFile(dbLogFile.Name, dbLogFile.FileName));

典型的なケースとは何か、そして復元をどのように行うかをより明確にするために、ローカルマシンへの.bakファイルの典型的な復元の完全なコードを次に示します。

var smoServer = new Microsoft.SqlServer.Management.Smo.Server(
    new Microsoft.SqlServer.Management.Common.ServerConnection(sqlServerInstanceName));

var db = smoServer.Databases[dbName];
if (db == null)
{
    db = new Microsoft.SqlServer.Management.Smo.Database(smoServer, dbName);
    db.Create();
}

restore.Devices.AddDevice(backupFileName, DeviceType.File);
restore.Database = dbName;
restore.FileNumber = 0;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;

var dbDataFile = db.FileGroups[0].Files[0];
restore.RelocateFiles.Add(new RelocateFile(dbDataFile.Name, dbDataFile.FileName));
var dbLogFile = db.LogFiles[0];
restore.RelocateFiles.Add(new RelocateFile(dbLogFile.Name, dbLogFile.FileName));

restore.SqlRestore(smoServer);

db.SetOnline();
smoServer.Refresh();
db.Refresh();

このコードは、以前にこのDbを手動で復元したか、名前だけでデータなしで手動で作成したか、何もしなかった場合でも機能します。SQLServerのみがインストールされ、データベースがまったくない、完全に空白のマシンで開始します。

于 2019-12-16T14:18:01.950 に答える
-1

.mdfファイルのパスを変更してください。任意のドライブにフォルダを作成するだけです。つまり、「D」ドライブにカスタム名(dbase)でフォルダを作成し、新しいフォルダへのパスを指定するだけで、mssqlがファイルを自動的に作成します。

「C:\ PROGRAMFILES \ MICROSOFT SQL SERVER \ MSSQL.1 \ MSSQL \ DATA \ MYDB_ABC.MDF」から「D:\ dbase\MYDB_ABC.MDF」

于 2013-10-03T06:06:06.190 に答える