web-dev-qa-db-ja.com

SQL2005-データベースとデータをすばやく複製する簡単な方法

開発データベースがあります。テストのために複製をスピンオフしたいと思います。これを頻繁にやりたいです。

これを頻繁に行うための最も速くて簡単な方法は何ですか?データを含むスクリプトを生成することで仕事を成し遂げることができますが、もっと良い方法があるに違いないと思います。データベース1をバックアップしてから、別の名前で復元できるようにする必要がありますか?

データベースをデタッチし、.MDFファイル(および.ldfファイル)をコピーすると、両方を添付できます。または1つだけ、後で高速コピー用のコピーとして1つを保持します。

Mcirosoft SQL Server ManagementStudioの「データベースのコピー」コマンドもこのように機能します。

PowerShellまたはosqlの呼び出しを含む.Cmdファイルを使用して、これを簡単に自動化/スクリプト化できます。

14
GvS

また、SQL Management Studio UIを使用してファイルバックアップを作成し、それを同じサーバーまたは他のサーバー上の新しいデータベースに復元することもできます。

2
Charles Bretana

SQL 2005では、[データベース]-> [タスク]で[データベースのコピー]を使用するのが最も速い方法だと思います。

ソースと宛先は同じにすることができ、必要に応じてデータベースの名前を変更できます。

2
cmsjr

データベースを作成および復元するためのコマンドラインツール(DOS)があります。

また、これをT-SQLスクリプトとして実行することもできます。 http://www.sqlmag.com/Article/ArticleID/46560/sql_server_46560.html

1
Dead account

上記の投稿 SQL 2005-データベース+データをすばやく複製する簡単な方法 動作します...

ただし、たとえばsql server 2008 r2を使用している場合、「restore filelistonly ...」からの戻り値が変更されているため、「createtable#restoretemp」部分にわずかな変更が必要になる場合があります。

基本的に「maxsizebigint」の後にこれを追加します

 maxsize bigint,
 fileid bigint,
 createlsn numeric(26),
 droplsn numeric(26),
 uniqueid uniqueidentifier,
 readonlylsn numeric(26),
 readwritelsn numeric(26),
 BackupSizeInBytes bigint,
 SourceBlockSize int,
 FileGroupId int,
 LogGroupGUID uniqueidentifier,
 DifferentialBaseLSN numeric(26),
 DifferentialBaseGUID uniqueidentifier,
 IsReadOnly bit,
 IsPresent bit,
 TDEThumbprint varbinary(40)

そして、uは以下の作業スクリプトで終わります...

USE master
GO

-- the original database (use 'SET @DB = NULL' to disable backup)
DECLARE @DB varchar(200)
SET @DB = 'source_db_name'

-- the backup filename
DECLARE @BackupFile varchar(2000)
SET @BackupFile = 'D:\somewhere\DB\backup.dat'

-- the new database name
DECLARE @TestDB varchar(200)
SET @TestDB = 'boon_db'

-- the new database files without .mdf/.ldf
DECLARE @RestoreFile varchar(2000)
SET @RestoreFile = 'D:\somewhere\DB'


-- ****************************************************************
--                    no change below this line
-- ****************************************************************


DECLARE @query varchar(2000)

DECLARE @DataFile varchar(2000)
SET @DataFile = @RestoreFile + '.mdf'

DECLARE @LogFile varchar(2000)
SET @LogFile = @RestoreFile + '.ldf'

IF @DB IS NOT NULL
BEGIN
    SET @query = 'BACKUP DATABASE ' + @DB + ' TO DISK = ' + QUOTENAME(@BackupFile, '''')
    EXEC (@query)
END

-- RESTORE FILELISTONLY FROM DISK = 'C:\temp\backup.dat'
-- RESTORE HEADERONLY FROM DISK = 'C:\temp\backup.dat'
-- RESTORE LABELONLY FROM DISK = 'C:\temp\backup.dat'
-- RESTORE VERIFYONLY FROM DISK = 'C:\temp\backup.dat'

IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB)
BEGIN
    SET @query = 'DROP DATABASE ' + @TestDB
    EXEC (@query)
END

RESTORE HEADERONLY FROM DISK = @BackupFile
DECLARE @File int
SET @File = @@ROWCOUNT

DECLARE @Data varchar(500)
DECLARE @Log varchar(500)

SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''')

CREATE TABLE #restoretemp
(
 LogicalName varchar(500),
 PhysicalName varchar(500),
 type varchar(10),
 FilegroupName varchar(200),
 size int,
 maxsize bigint,
 fileid bigint,
 createlsn numeric(26),
 droplsn numeric(26),
 uniqueid uniqueidentifier,
 readonlylsn numeric(26),
 readwritelsn numeric(26),
 BackupSizeInBytes bigint,
 SourceBlockSize int,
 FileGroupId int,
 LogGroupGUID uniqueidentifier,
 DifferentialBaseLSN numeric(26),
 DifferentialBaseGUID uniqueidentifier,
 IsReadOnly bit,
 IsPresent bit,
 TDEThumbprint varbinary(40)
)
INSERT #restoretemp EXEC (@query)

SELECT @Data = LogicalName FROM #restoretemp WHERE type = 'D'
SELECT @Log = LogicalName FROM #restoretemp WHERE type = 'L'

PRINT @Data
PRINT @Log

TRUNCATE TABLE #restoretemp
DROP TABLE #restoretemp

IF @File > 0
BEGIN
    SET @query = 'RESTORE DATABASE ' + @TestDB + ' FROM DISK = ' + QUOTENAME(@BackupFile, '''') + 
        ' WITH MOVE ' + QUOTENAME(@Data, '''') + ' TO ' + QUOTENAME(@DataFile, '''') + ', MOVE ' +
        QUOTENAME(@Log, '''') + ' TO ' + QUOTENAME(@LogFile, '''') + ', FILE = ' + CONVERT(varchar, @File)
    EXEC (@query)
END
GO
0
Boon

スクリプトを使用すると、実行していることの透明性が高まります。
(特に頻繁に実行したい場合は、変更ごとにデータがわずかに異なるためです。)

ただし、スクリプトを作成する手間をかけたくない場合は、バックアップしてから別の名前に復元するのが最も簡単な方法です。

0
Bravax

スクリプトを作成する場合は、次を使用できます。これは、データベースをオフラインにできない場合にも最適です。

USE master
GO

-- the original database (use 'SET @DB = NULL' to disable backup)
DECLARE @DB varchar(200)
SET @DB = 'PcTopp'

    -- the backup filename
DECLARE @BackupFile varchar(2000)
SET @BackupFile = 'c:\pctopp\sqlserver\backup.dat'

-- the new database name
DECLARE @TestDB varchar(200)
SET @TestDB = 'TestDB'

-- the new database files without .mdf/.ldf
DECLARE @RestoreFile varchar(2000)
SET @RestoreFile = 'c:\pctopp\sqlserver\backup'


-- ****************************************************************
--                    no change below this line
-- ****************************************************************


DECLARE @query varchar(2000)

DECLARE @DataFile varchar(2000)
SET @DataFile = @RestoreFile + '.mdf'

DECLARE @LogFile varchar(2000)
SET @LogFile = @RestoreFile + '.ldf'

IF @DB IS NOT NULL
BEGIN
    SET @query = 'BACKUP DATABASE ' + @DB + ' TO DISK = ' + QUOTENAME(@BackupFile, '''')
    EXEC (@query)
END

-- RESTORE FILELISTONLY FROM DISK = 'C:\temp\backup.dat'
-- RESTORE HEADERONLY FROM DISK = 'C:\temp\backup.dat'
-- RESTORE LABELONLY FROM DISK = 'C:\temp\backup.dat'
-- RESTORE VERIFYONLY FROM DISK = 'C:\temp\backup.dat'

IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB)
BEGIN
    SET @query = 'DROP DATABASE ' + @TestDB
    EXEC (@query)
END

RESTORE HEADERONLY FROM DISK = @BackupFile
DECLARE @File int
SET @File = @@ROWCOUNT

DECLARE @Data varchar(500)
DECLARE @Log varchar(500)

SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''')

CREATE TABLE #restoretemp
(
 LogicalName varchar(500),
 PhysicalName varchar(500),
 type varchar(10),
 FilegroupName varchar(200),
 size int,
 maxsize bigint
)
INSERT #restoretemp EXEC (@query)

SELECT @Data = LogicalName FROM #restoretemp WHERE type = 'D'
SELECT @Log = LogicalName FROM #restoretemp WHERE type = 'L'

PRINT @Data
PRINT @Log

TRUNCATE TABLE #restoretemp
DROP TABLE #restoretemp

IF @File > 0
BEGIN
    SET @query = 'RESTORE DATABASE ' + @TestDB + ' FROM DISK = ' + QUOTENAME(@BackupFile, '''') + 
        ' WITH MOVE ' + QUOTENAME(@Data, '''') + ' TO ' + QUOTENAME(@DataFile, '''') + ', MOVE ' +
        QUOTENAME(@Log, '''') + ' TO ' + QUOTENAME(@LogFile, '''') + ', FILE = ' + CONVERT(varchar, @File)
    EXEC (@query)
END
GO

コピー元: http://weblogs.asp.net/mschwarz/archive/2004/08/26/220735.aspx

0
brendan

投入するもう1つのオプション、

これは、データベースパブリッシングWizardの使用方法と、データを含むデータベースのすべての要素をSQLファイルにエクスポートするために使用される方法について説明しているブログエントリです。役立つ可能性があり、非常に簡単に思えます。

http://blog.sqlauthority.com/2007/11/16/sql-server-2005-generate-script-with-data-from-database-database-publishing-wizard/

0