以前のバージョン(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
で復元しようとする理由がわかりません。
私はコードからこれを行うことができました。これでは十分ではありませんでした
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));
}
}
}
ログファイルについても同じです。
バックアップがあなたのパスと一致しないマシンで行われたように聞こえます。 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';
バックアップは、データベースファイルの元の場所を保存し、デフォルトでは同じ場所に復元しようとします。新しいサーバーのインストールは新しいディレクトリにあり、おそらく古いディレクトリはもう存在しないので、使用する場所に合わせてディレクトリをデフォルトから変更する必要があります。
データベースの復元方法に応じて、これを行う方法は異なります。 SSMSを使用している場合は、ファイルとそれに関連するディスクの場所のリストが見つかるまでタブとリストを確認します。復元する前にそれらの場所を編集できます。
私は同じ問題を抱えていましたが、これは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
すでに何度か言われているように、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
オプション。すでにそうしていたとき。
[データベースの復元]ダイアログの[オプション]ページで[テールログバックアップ]オプションのチェックを外してください。
これらの行をスクリプトから削除する必要があります。
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
SQLサービスを再起動してください。私のために働いた。
これが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
これは通常、1つのMSSQL Studioをバックアップ(古いサーバーに接続)と復元(新しいサーバーに接続)に使用している場合に発生します。正しいサーバーで復元を実行していることを確認してください。 UIの左ペインでサーバー名とIPを確認するか、
これにはいくつかのバージョンの問題があります。次の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でスクリプトを生成