我有我的开发数据库,我想分离一个副本进行测试。我想经常这样做。SQL 2005 - 快速复制数据库+数据的快速方法
经常这样做的最快和最简单的方法是什么?我可以通过生成包含数据的脚本来完成工作,但我觉得必须有更好的方法。我应该备份数据库1,然后拧紧它,以便我可以恢复它作为一个不同的名称?
我有我的开发数据库,我想分离一个副本进行测试。我想经常这样做。SQL 2005 - 快速复制数据库+数据的快速方法
经常这样做的最快和最简单的方法是什么?我可以通过生成包含数据的脚本来完成工作,但我觉得必须有更好的方法。我应该备份数据库1,然后拧紧它,以便我可以恢复它作为一个不同的名称?
分离数据库,复制.MDF文件(和.ldf文件),您可以同时附加两个文件。或者只有一个,以保留一个作为快速复制的副本。
Mcirosoft SQL Server Management Studio中的“复制数据库”命令也可以像这样工作。
您可以使用PowerShell或调用osql的.Cmd文件轻松自动化/编写脚本。
有一个用于创建和恢复数据库的命令行工具(DOS)。
此外,您可以执行此作为T-SQL脚本。 http://www.sqlmag.com/Article/ArticleID/46560/sql_server_46560.html
而且您还可以使用SQL Management Studio用户界面来创建文件备份,然后将其还原到同一个或任何其他服务器上的新数据库中。
只要记住看哪里恢复操作是试图把mdf和ldf文件(注意它试图覆盖你不想覆盖的文件)... – 2009-01-14 16:59:31
当我尝试恢复到不同的数据库,我得到一个错误:“备份集保留了现有'd'以外的数据库的备份bname'database“ – Kip 2010-02-24 16:59:55
在SQL 2005,我会说,最快的方法就是使用复制数据库,在数据库 - >任务
源和目标可以是相同的,并且它可以让你如果需要重命名数据库。
我会使用脚本,因为这有助于您正在做的事情的透明度。
(特别是如果你想经常这样做,因为变化是每个人都会有稍微不同的数据。)
但是,如果你不想去创建脚本的麻烦,最简单的方法是备份,然后恢复到不同的名称。
如果您想编写脚本,可以使用以下命令。这也是最好的,如果你不能在数据库脱机:
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
还有一个选项,以扔在,
这里有一个博客条目谈到有关使用数据库发布向导以及它如何用于将数据库的所有元素(包括数据)导出到SQL文件。可能会有所帮助,看起来很直接。
后上述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
嗯,这是快速 – 2012-10-21 05:11:01