2009-01-14 133 views
16

我有我的开发数据库,​​我想分离一个副本进行测试。我想经常这样做。SQL 2005 - 快速复制数据库+数据的快速方法

经常这样做的最快和最简单的方法是什么?我可以通过生成包含数据的脚本来完成工作,但我觉得必须有更好的方法。我应该备份数据库1,然后拧紧它,以便我可以恢复它作为一个不同的名称?

回答

14

分离数据库,复制.MDF文件(和.ldf文件),您可以同时附加两个文件。或者只有一个,以保留一个作为快速复制的副本。

Mcirosoft SQL Server Management Studio中的“复制数据库”命令也可以像这样工作。

您可以使用PowerShell或调用osql的.Cmd文件轻松自动化/编写脚本。

+1

嗯,这是快速 – 2012-10-21 05:11:01

2

而且您还可以使用SQL Management Studio用户界面来创建文件备份,然后将其还原到同一个或任何其他服务器上的新数据库中。

+0

只要记住看哪里恢复操作是试图把mdf和ldf文件(注意它试图覆盖你不想覆盖的文件)... – 2009-01-14 16:59:31

+0

当我尝试恢复到不同的数据库,我得到一个错误:“备份集保留了现有'd'以外的数据库的备份bname'database“ – Kip 2010-02-24 16:59:55

2

在SQL 2005,我会说,最快的方法就是使用复制数据库,在数据库 - >任务

源和目标可以是相同的,并且它可以让你如果需要重命名数据库。

0

我会使用脚本,因为这有助于您正在做的事情的透明度。
(特别是如果你想经常这样做,因为变化是每个人都会有稍微不同的数据。)

但是,如果你不想去创建脚本的麻烦,最简单的方法是备份,然后恢复到不同的名称。

0

如果您想编写脚本,可以使用以下命令。这也是最好的,如果你不能在数据库脱机:

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

后上述SQL 2005 - quick way to quickly duplicate a database + data作品...

但如果乌拉圭回合使用SQL Server 2008 R2例如,U可能需要上,因为返回了“创建表#restoretemp”部分略有模从“恢复filelistonly ...”已经改变,因为...

后“最大范围BIGINT”

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