web-dev-qa-db-ja.com

SQLサーバー内の別のデータベースに復元する方法?

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

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

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

ありがとう。

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

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

200
LocustHorde

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

コンテンツを見る

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'

your.bakの内容でデータベースMyTempCopyを作成します。

例( '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).
275
Alex K.

SQL Server 2008 R2:

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

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

Sql Server Management Studioを使用しているSQL Server 2012の場合、Microsoftのページからこれらの手順を実行すると、別のデータベースファイルおよび名前に復元するのに便利です。(ref: http://technet.Microsoft.com/ja) -us/library/ms175510.aspx

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


データベースを新しい場所に復元し、必要に応じてデータベースの名前を変更する

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

    • データベース

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

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

    • デバイス

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

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

  4. DestinationセクションのDatabaseボックスに、復元するデータベースの名前が自動的に入力されます。データベースの名前を変更するには、Databaseボックスに新しい名前を入力します。
  5. Restore toボックスで、デフォルトを最後に実行されたバックアップへのままにするか、TimelineをクリックしてBackup Timelineダイアログボックスにアクセス回復処置を停止する時点を手動で選択します。
  6. 復元するバックアップセット _グリッドで、復元するバックアップを選択します。このグリッドには、指定した場所で利用可能なバックアップが表示されます。デフォルトでは、復旧計画が推奨されています。推奨されている復旧計画を上書きするには、グリッド内の選択を変更します。以前のバックアップの復元に依存するバックアップは、以前のバックアップが選択解除されると自動的に選択解除されます。
  7. データベースファイルの新しい場所を指定するには、Filesページを選択し、すべてのファイルをフォルダに再配置をクリックします。 データファイルフォルダログファイルフォルダに新しい場所を指定します。別の方法として、同じフォルダを保持してデータベース名とログファイル名を変更することもできます。
40
Rots

実際には、ネイティブのSQL Server用語でデータベースを復元する必要はありません。「何らかのデータをいじってみたい」および「その.bakファイルのデータをブラウズしたい」からです。

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

さらに、ツールが完全に機能的な試用モードにある間(14日)に仕事をすることができると思います

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

34
Ivan Stankovic

これは、さまざまな投稿からまとめて、バックアップを使用してデータベースをコピーし、物理的な場所を修正するためのmove付きのリストアと、論理名を修正するための追加の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);
6
Nathan Niesen

同じサーバーに復元するよりも実際には少し簡単です。基本的には、あなただけの "データベースの復元"オプションを歩きます。これがあなたのためのチュートリアルです。

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

特にこれは非プロダクションの復元なので、詳細を気にせずに試してみるだけで快適です。 SQLファイルを新しいサーバー上の好きな場所に配置して、好きな名前を付けるだけで、問題ありません。

3
IAmTimCorey

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

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
2
  • 古いデータベースを使用して新しいデータベースを復元すると、このトピックと同じエラーが発生します。 (.bakを使用しても同じエラーになります)

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

enter image description here

1
Nguyen Duc Hai

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

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"フィールドに新しい名前を入力してください。 I.E.請求クローン

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

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

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

8)次に上LH角のOPTIONSページを選択します

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

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

11)Object Explorerでrefreshを押すと、新しいデータベースが表示されます。

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
gim