1週間前からDatabase1のバックアップがあります。バックアップはスケジューラで毎週行われ、私は.bak
ファイルを受け取ります。今、私はいくつかのデータをいじるしたいので、別のデータベースに復元する必要があります - Database2。
私はこの質問を見たことがある: 別の名前で同じPCにSQL Serverデータベースを復元する 。私は本番サーバーにいるのでそのオプションを選択しますが、実際にはできません。
それをDatabase2
に復元する他の方法、または少なくとも、その.bakファイルのデータをどのように参照するのですか?
ありがとう。
ps:上記のリンクからの2番目の答えは有望に見えましたが、エラーで終了し続けます:
ファイルリストの復元が異常終了しています
新しいデータベースを作成してから、[復元ウィザード]を使用して[上書き]オプションを有効にすることができます。
コンテンツを見る
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).
SQL Server 2008 R2:
「復元したい既存のデータベースの場合:別のデータベースのバックアップから」次の手順に従います。
Sql Server Management Studioを使用しているSQL Server 2012の場合、Microsoftのページからこれらの手順を実行すると、別のデータベースファイルおよび名前に復元するのに便利です。(ref: http://technet.Microsoft.com/ja) -us/library/ms175510.aspx )
注ステップ4と7は、既存のデータベースを上書きしないように設定することが重要です。
データベースを新しい場所に復元し、必要に応じてデータベースの名前を変更する
- SQL Serverデータベースエンジンの適切なインスタンスに接続し、オブジェクトエクスプローラでサーバー名をクリックしてサーバーツリーを展開します。
- データベースを右クリックし、データベースの復元をクリックします。 データベースの復元ダイアログボックスが開きます。
Generalページで、Sourceセクションを使用して、復元するバックアップセットのソースと場所を指定します。次のいずれかのオプションを選択してください。
データベース
ドロップダウンリストから復元するデータベースを選択します。リストには、msdbバックアップ履歴に従ってバックアップされたデータベースのみが含まれます。
注バックアップが別のサーバーから取得された場合、移行先サーバーには指定したデータベースのバックアップ履歴情報がありません。この場合は、[デバイス]を選択して、復元するファイルまたはデバイスを手動で指定します。
デバイス
参照(...)ボタンをクリックしてバックアップデバイスの選択ダイアログボックスを開きます。 バックアップメディアの種類ボックスで、一覧表示されているデバイスの種類のいずれかを選択します。 バックアップメディアボックスに1つ以上のデバイスを選択するには、追加をクリックします。 バックアップメディアリストボックスに目的のデバイスを追加したら、OK _をクリックして一般ページに戻ります。 ソース:デバイス:データベースリストボックスで、復元するデータベースの名前を選択します。
注このリストは、[デバイス]が選択されている場合にのみ使用できます。選択したデバイス上にバックアップを持つデータベースのみが利用可能になります。
- DestinationセクションのDatabaseボックスに、復元するデータベースの名前が自動的に入力されます。データベースの名前を変更するには、Databaseボックスに新しい名前を入力します。
- Restore toボックスで、デフォルトを最後に実行されたバックアップへのままにするか、TimelineをクリックしてBackup Timelineダイアログボックスにアクセス回復処置を停止する時点を手動で選択します。
- 復元するバックアップセット _グリッドで、復元するバックアップを選択します。このグリッドには、指定した場所で利用可能なバックアップが表示されます。デフォルトでは、復旧計画が推奨されています。推奨されている復旧計画を上書きするには、グリッド内の選択を変更します。以前のバックアップの復元に依存するバックアップは、以前のバックアップが選択解除されると自動的に選択解除されます。
- データベースファイルの新しい場所を指定するには、Filesページを選択し、すべてのファイルをフォルダに再配置をクリックします。 データファイルフォルダとログファイルフォルダに新しい場所を指定します。別の方法として、同じフォルダを保持してデータベース名とログファイル名を変更することもできます。
実際には、ネイティブのSQL Server用語でデータベースを復元する必要はありません。「何らかのデータをいじってみたい」および「その.bakファイルのデータをブラウズしたい」からです。
ApexSQL復元 - を両方ともアタッチするSQL Serverツールを使用できます。ネイティブおよびネイティブに圧縮されたSQLデータベースのバックアップとトランザクションログのバックアップをライブデータベースとして保存し、SQL Server Management Studio、Visual Studio、またはその他のサードパーティ製ツールからアクセスできます。単一または複数のフル、差分、およびトランザクションログバックアップを添付できます。
さらに、ツールが完全に機能的な試用モードにある間(14日)に仕事をすることができると思います
免責事項:私はApexSQLの製品サポートエンジニアとして働いています
これは、さまざまな投稿からまとめて、バックアップを使用してデータベースをコピーし、物理的な場所を修正するための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);
同じサーバーに復元するよりも実際には少し簡単です。基本的には、あなただけの "データベースの復元"オプションを歩きます。これがあなたのためのチュートリアルです。
特にこれは非プロダクションの復元なので、詳細を気にせずに試してみるだけで快適です。 SQLファイルを新しいサーバー上の好きな場所に配置して、好きな名前を付けるだけで、問題ありません。
データベースが存在しない場合は、次のコードを使用します。
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
これは、一意のデータベース名を持つ追加のデータベースとしてバックアップを復元する方法です。
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;
やった!