SQL Serverの別のデータベースに復元する方法は?


224

1 週間前のDatabase1のバックアップがあります。バックアップはスケジューラで毎週行われ、.bakファイルを取得します。次に、いくつかのデータをいじりたいので、別のデータベース(Database2)に復元する必要があります。

私はこの質問を見ました:SQL Serverデータベースを同じPCに別の名前で復元し、元のデータベースの名前を変更することをお勧めしますが、本番サーバーにいるため、そのオプションがなく、実際には実行できません。

Database2その.bakファイルのデータを参照するには、他の方法、または少なくとも、どのように復元しますか?

ありがとう。

ps:上記のリンクからの2番目の答えは有望に見えましたが、エラーで終了し続けます:

ファイルリストの復元が異常終了しています

回答:


304

新しいデータベースを作成してから、[復元ウィザード]を使用して[上書き]オプションを有効にするか、

コンテンツを表示します。

RESTORE FILELISTONLY FROM DISK='c:\your.bak'

結果からの.mdf&.ldfの論理名に注意してください。

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH 
   MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
   MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'

MyTempCopyの内容でデータベースを作成するにはyour.bak

例(「creditline」という名前のデータベースのバックアップを「MyTempCopy」に復元します。

RESTORE FILELISTONLY FROM DISK='e:\mssql\backup\creditline.bak'

>LogicalName
>--------------
>CreditLine
>CreditLine_log

RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak'
WITH 
   MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf',
   MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'

>RESTORE DATABASE successfully processed 186 pages in 0.010 seconds (144.970 MB/sec).

5
こんにちは、何かが足りないようですbackkup set holds a backup of a database other than existing "tmp" database。エラーが発生し続けます。なければならないtoフレーズは、実際の物理的なパスでMyTempCopy
LocustHorde

奇妙なことに、これtoは新しいデータベースのデータベースとログの場所です

52
MyTempCopyを作成しないでください。復元中に作成されます。
Blazes

3
REPLACE、RECOVERY、私の場合のオプション(SQL2012)crでのみ機能しました。dba.stackexchange.com/questions/51489/...
dc2009

7
これを解決するには、REPLACE、RECOVERYを使用する必要があります。だから、これは次のようになります RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak' WITH REPLACE, RECOVERY, MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf', MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'
Raihan

67

SQL Server 2008 R2:

「復元したい既存のデータベースの場合:別のデータベースのバックアップから、次の手順に従います。

  1. ツールバーから、[アクティビティモニター]ボタンをクリックします。
  2. プロセスをクリックします。復元するデータベースでフィルタリングします。各プロセスを右クリックし、「プロセスの強制終了」を選択して、実行中のすべてのプロセスを強制終了します。
  3. 復元するデータベースを右クリックし、[タスク]-> [復元]-> [データベースから]を選択します。
  4. [デバイスから:]ラジオボタンを選択します。
  5. ...を選択し、復元する他のデータベースのバックアップファイルを選択します。
  6. バックアップセットの左側にあるチェックボックスをオンにして、復元するバックアップセットを選択します。
  7. オプションを選択"。
  8. [既存のデータベースを上書きする(置換あり)]を選択します。
  9. 重要:「Restore As」行データファイル名を、上書きする既存のデータベースのファイル名に変更するか、単に新しい名前を付けます。
  10. ログファイルのファイル名についても同じことを行います。
  11. アクティビティモニター画面から、新しいプロセスが生成されていないことを確認します。彼らがいた場合、それらを殺します。
  12. OKをクリックします。

12
MS SQL Server 2010?
マーク・

3
いくつかのスクリーンショットがここにありますstackoverflow.com/questions/3829271/...
トマスKubes

プログラマーであるにもかかわらず、私はこのウィザードを使用したいと思います。より簡単でクリーン。
v1n1akabozo 2015年

1
私にとって重要なステップは#8でした。ダニエルありがとう
jbooker

SQL 2014 ..ステップ6a:宛先データベースを復元先のデータベースに変更します。ステップ9と10:宛先データベースを変更することで、これに対処する必要があります。しかし、二重のファイルに行くと、元のステップ9&10で説明したようにファイル名をチェックすることでこれを確認
JzInqXc9Dg

49

SQL Server 2012の場合、Sql Server Management Studioを使用して、別のデータベースファイルと名前に復元するのに役立つMicrosoftページの次の手順を見つけました:(ref:http : //technet.microsoft.com/en-us/library/ms175510 .aspx

ステップ4と7は、既存のデータベースを上書きするように設定されていないことが重要です。


データベースを新しい場所に復元し、オプションでデータベースの名前を変更するには

  1. SQL Serverデータベースエンジンの適切なインスタンスに接続し、オブジェクトエクスプローラーでサーバー名をクリックしてサーバーツリーを展開します。
  2. [ データベース ]を右クリックし、[ データベースの復元 ]をクリックします。[ データベース復元 ]ダイアログボックスが開きます。
  3. [ 全般]ページの[ ソース]セクションを使用して、復元するバックアップセットのソースと場所を指定します。次のオプションのいずれかを選択します。

    • データベース

      • ドロップダウンリストから復元するデータベースを選択します。リストには、msdbバックアップ履歴に従ってバックアップされたデータベースのみが含まれます 。

        バックアップが別のサーバーから行われる場合、宛先サーバーには、指定されたデータベースのバックアップ履歴情報がありません。この場合、[デバイス]を選択して、復元するファイルまたはデバイスを手動で指定します。

    • 端末

      • 参照(...)ボタンをクリックして、[バックアップデバイス選択 ]ダイアログボックスを開きます。ではバックアップメディアの種類ボックス、リストされているデバイスの種類のいずれかを選択します。[ バックアップメディア ]ボックスで1つ以上のデバイスを選択するには 、[ 追加 ] クリックします。必要なデバイスを[ バックアップメディア ]リストボックスに追加したら、[ OK ]をクリックして[ 全般]ページに戻り ます。[ ソース:デバイス:データベース]リストボックスで、復元するデータベースの名前を選択します。

        このリストは、[デバイス]が選択されている場合にのみ使用できます。選択したデバイスにバックアップがあるデータベースのみが使用可能になります。

  4. [ 宛先]セクションの[ データベース]ボックスに、復元するデータベースの名前が自動的に入力されます。データベースの名前を変更するには、[ データベース]ボックスに新しい名前を入力し ます。
  5. [ 復元先]ボックスで、デフォルトを[ 最後に行ったバックアップへ ]のままにするか、[ タイムライン ]をクリックして[ バックアップタイムライン ]ダイアログボックスにアクセスし、手動で特定の時点を選択してリカバリアクションを停止します。
  6. [ 復元するバックアップセット]グリッドで、復元するバックアップを選択します。このグリッドには、指定された場所で使用可能なバックアップが表示されます。デフォルトでは、回復計画が推奨されます。提案された復旧計画を上書きするために、グリッドの選択を変更できます。以前のバックアップの選択を解除すると、以前のバックアップの復元に依存するバックアップは自動的に選択解除されます。
  7. データベースファイルの新しい場所を指定するには、[ ファイル ]ページを選択し、[ すべてのファイルをフォルダーに再配置 ]をクリックしますデータファイルフォルダーログファイルフォルダーの新しい場所を指定します。または、同じフォルダを保持して、データベースとログファイルの名前を変更することもできます。

3
これは魅力のように機能します。ステップ4と7に対する特別な感謝
アナトリーヤキムチュク'19

さらに、[オプション]タブに移動して[既存のデータベースを上書きする(置換あり)]をオンにする必要がありました...それでうまくいきました。
John Kurtz

1
@JohnKurtz新しいデータベースに復元する場合は、その必要はありません。
2018年

復元先の空のデータベースをすでに作成していました。それが違いだろう。
John Kurtz

1
手順4で存在しないデータベースの名前を入力すると、説明どおりに機能することを確認しました。すでに存在する別のデータベースを選択した場合は、[既存のデータベースを上書きする(置換あり)]をオンにする必要があることを確認しました。オプションのタブ。お待ち頂きまして、ありがとうございます!
John Kurtz、

34

「データをいじりたい」「.bakファイルのデータを参照する」ため、実際にはデータベースをSQL Serverのネイティブ用語で復元する必要はありません。

ApexSQL Restoreを使用できます。これは、ネイティブおよびネイティブに圧縮されたSQLデータベースバックアップとトランザクションログバックアップの両方をライブデータベースとしてアタッチするSQL Serverツールであり、SQL Server Management Studio、Visual Studioまたはその他のサードパーティツールからアクセスできます。単一または複数の完全な差分およびトランザクションログバックアップをアタッチできます。

さらに、ツールが完全に機能する試用モード(14日間)の間に作業を行うことができると思います

免責事項:私はApexSQLで製品サポートエンジニアとして働いています


9

これは、バックアップを使用してデータベースをコピーし、物理的な場所を修正するための移動と論理名を修正するための追加のSQLを使用してデータベースをコピーするために私がさまざまな投稿からまとめたものです。

/**
 * Creates (or resets) a Database to a copy of the template database using backup and restore.
 *
 * Usage: Update the @NewDatabase value to the database name to create or reset.
 */

DECLARE @NewDatabase SYSNAME = 'new_db';

-- Set up
USE tempdb;

DECLARE @TemplateBackups SYSNAME = 'TemplateBackups';
DECLARE @TemplateDatabase SYSNAME = 'template_db';
DECLARE @TemplateDatabaseLog SYSNAME = @TemplateDatabase + '_log';

-- Create a backup of the template database
BACKUP DATABASE @TemplateDatabase TO DISK = @TemplateBackups WITH CHECKSUM, COPY_ONLY, FORMAT, INIT, STATS = 100;

-- Get the backup file list as a table variable
DECLARE @BackupFiles TABLE(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId tinyint,CreateLSN numeric(25,0),DropLSN numeric(25, 0),UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0),ReadWriteLSN numeric(25,0),BackupSizeInBytes bigint,SourceBlockSize int,FileGroupId int,LogGroupGUID uniqueidentifier,DifferentialBaseLSN numeric(25,0),DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32));
INSERT @BackupFiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @TemplateBackups + '''');

-- Create  the backup file list as a table variable
DECLARE @NewDatabaseData VARCHAR(MAX);
DECLARE @NewDatabaseLog VARCHAR(MAX);

SELECT @NewDatabaseData = PhysicalName FROM @BackupFiles WHERE Type = 'D';
SELECT @NewDatabaseLog = PhysicalName FROM @BackupFiles WHERE Type = 'L';

SET @NewDatabaseData = REPLACE(@NewDatabaseData, @TemplateDatabase, @NewDatabase);
SET @NewDatabaseLog = REPLACE(@NewDatabaseLog, @TemplateDatabase, @NewDatabase);

RESTORE DATABASE @NewDatabase FROM DISK = @TemplateBackups WITH CHECKSUM, RECOVERY, REPLACE, STATS = 100,
   MOVE @TemplateDatabase TO @NewDatabaseData,
   MOVE @TemplateDatabaseLog TO @NewDatabaseLog;

-- Change Logical File Name
DECLARE @SQL_SCRIPT VARCHAR(MAX)='
    ALTER DATABASE [{NewDatabase}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}'', NEWNAME=N''{NewDatabase}'');
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}_log'', NEWNAME=N''{NewDatabase}_log'');
    ALTER DATABASE [{NewDatabase}] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
    SELECT name AS logical_name, physical_name FROM SYS.MASTER_FILES WHERE database_id = DB_ID(N''{NewDatabase}'');
';
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TemplateDatabase}', @TemplateDatabase);
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{NewDatabase}', @NewDatabase);
EXECUTE (@SQL_SCRIPT);

こんにちはNateN、私は.bak(ローカルマシンのd:ドライブパスに存在します)ファイルを別のDBに復元したいです。ユニットテストのためにこのコードを試しましたが、エラーが発生しました.. "データベースが原因で排他アクセスを取得できませんでしたは使用中です。 "データベースを復元できません..方法を教えてください..?
Victor Athoti。

復元先のデータベースを別のプロセスで使用することはできません。データベースにアクセスするすべてのプロセスをスクリプトで強制終了する方法がわかりません。
Nathan Niesen、2015

こんにちはNateN、それは今うまく機能しています、私はあなたのサンプルコードを使用してから、そのコードに小さな変更を加えてからうまく機能しました...。もう一度サンプルコードを提供していただきありがとうございます...
Victor Athoti。

1
sql2014以降の場合は、DECLARE @BackupFiles...行は追加の列を必要とします:SnapshotURL nvarchar(360)
フィアット

3

実際には、同じサーバーに復元するよりも少し簡単です。基本的には、「データベースの復元」オプションについて説明します。ここにあなたのためのチュートリアルがあります:

http://www.techrepublic.com/blog/window-on-windows/how-do-i-restore-a-sql-server-database-to-a-new-server/454

特に、これは本番以外の復元であるため、詳細をあまり気にすることなく、試してみるだけで安心できます。新しいサーバーのSQLファイルを好きな場所に配置し、好きな名前を付ければいいのです。


こんにちは、同じサーバー、異なるデータベースに復元する必要があります...(復元データベースの名前は異なります)
LocustHorde

質問を読み間違えました。同じ基本原則が適用されます。新しい名前とファイル名(mdf、ldfなど)が異なることを確認するだけです。
IAmTimCorey 2011年

3

データベースが存在しない場合は、次のコードを使用します。

ALTER PROCEDURE [dbo].[RestoreBackupToNewDB]    
         @pathToBackup  varchar(500),--where to take backup from
         @pathToRestoreFolder  varchar(500), -- where to put the restored db files 
         @newDBName varchar(100)
    AS
    BEGIN

            SET NOCOUNT ON
            DECLARE @fileListTable TABLE (
            [LogicalName]           NVARCHAR(128),
            [PhysicalName]          NVARCHAR(260),
            [Type]                  CHAR(1),
            [FileGroupName]         NVARCHAR(128),
            [Size]                  NUMERIC(20,0),
            [MaxSize]               NUMERIC(20,0),
            [FileID]                BIGINT,
            [CreateLSN]             NUMERIC(25,0),
            [DropLSN]               NUMERIC(25,0),
            [UniqueID]              UNIQUEIDENTIFIER,
            [ReadOnlyLSN]           NUMERIC(25,0),
            [ReadWriteLSN]          NUMERIC(25,0),
            [BackupSizeInBytes]     BIGINT,
            [SourceBlockSize]       INT,
            [FileGroupID]           INT,
            [LogGroupGUID]          UNIQUEIDENTIFIER,
            [DifferentialBaseLSN]   NUMERIC(25,0),
            [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
            [IsReadOnly]            BIT,
            [IsPresent]             BIT,
            [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
            )
            INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK ='''+ @pathToBackup+'''')
            DECLARE @restoreDatabaseFilePath NVARCHAR(500)
            DECLARE @restoreLogFilePath NVARCHAR(500)
            DECLARE @databaseLogicName NVARCHAR(500)
            DECLARE @logLogicName NVARCHAR(500)
            DECLARE @pathSalt uniqueidentifier = NEWID()

            SET @databaseLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='D') 
            SET @logLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='L')           
            SET @restoreDatabaseFilePath= @pathToRestoreFolder + @databaseLogicName + convert(nvarchar(50), @pathSalt) + '.mdf'
            SET @restoreLogFilePath= @pathToRestoreFolder + @logLogicName + convert(nvarchar(50), @pathSalt) + '.ldf'

            RESTORE DATABASE @newDBName FROM DISK=@pathToBackup     
            WITH 
               MOVE @databaseLogicName TO @restoreDatabaseFilePath,
               MOVE @logLogicName TO @restoreLogFilePath

            SET NOCOUNT OFF
    END

3
  • 古いデータベースを使用して新しいデータベースを復元すると、このトピックと同じエラーが発生します。(.bakを使用しても同じエラーが発生します)

  • 古いデータベースの名前を新しいデータベースの名前に変更しました(この図と同じ)。出来た。

ここに画像の説明を入力してください


2
次回は銀行の名前を削除してください
Danh

1

以下は、一意のデータベース名を持つ追加のデータベースとしてバックアップを復元する方法です。

SQL 2005の場合、これは非常に速く機能します。新しいバージョンでも同じように動作するはずです。

まず、元のデータベースをオフラインにする必要はありません。しかし、安全のために、私は好きです。私の例では、「billing」データベースのクローンをマウントし、「billingclone」という名前を付けます。

1)課金データベースの適切なバックアップを作成します

2)安全のために、次のようにオリジナルをオフラインにしました。

3)新しいクエリウィンドウを開く

**重要!すべてが完了するまで、このクエリウィンドウを開いたままにします。このウィンドウからデータベースを復元する必要があります!

次のコードを入力してください:

-- 1) free up all USER databases
USE master;
GO
-- 2) kick all other users out:
ALTER DATABASE billing SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3) prevent sessions from re-establishing connection:
ALTER DATABASE billing SET OFFLINE;

3)次に、Management Studioで、オブジェクトエクスプローラーの[データベース]をクリックし、[データベースの復元]を選択します。

4)「To Database」フィールドに新しい名前を入力します。IEの請求クローン

5)復元のソースで、[デバイスから]をクリックし、[...ナビゲート]ボタンをクリックします

6)[追加]をクリックして、バックアップに移動します

7)復元の横にチェックマークを付けます(復元するバックアップセットを選択します)

8)次に、左上隅にある[オプション]ページを選択します

9)次に、RESTORE ASでデータベースファイル名を編集します。これをdbとログの両方に対して行います。IE billingclone.mdfおよびbillingclone_log.ldf

10)OKをクリックして、タスクが完了するのを待ちます。

11)オブジェクトエクスプローラーで更新をクリックすると、新しいデータベースが表示されます

12)これで、課金データベースをオンラインに戻すことができます。課金をオフラインにするために使用したのと同じクエリウィンドウを使用します。次のコマンドを使用します。

-- 1) free up all USER databases
USE master; GO
-- 2) restore access to all users:
ALTER DATABASE billing SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO
-- 3) put the db back online:
ALTER DATABASE billing SET ONLINE;

できた!


1
  1. 別の名前で「データベースのコピー」オプションを使用してデータベースからコピーを作成します
  2. 新しくコピーしたデータベースのバックアップ
  3. 元に戻す!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.