我有我的开发数据库,我想要复制一个副本进行测试。我想经常这样做。
经常这样做最快,最简单的方法是什么?我可以通过生成包含数据的脚本来完成工作,但我觉得必须有更好的方法。我应该备份数据库1然后搞砸它,以便我可以将其恢复为另一个名称吗?
答案 0 :(得分:14)
分离数据库,复制.MDF文件(和.ldf文件),您可以同时附加两者。或者只有一个,以便将其作为副本保存,以便以后快速复制。
Mcirosoft SQL Server Management Studio中的“复制数据库”命令也可以这样工作。
您可以使用PowerShell或只调用osql的.Cmd文件轻松自动化/编写脚本。
答案 1 :(得分:2)
您还可以使用SQL Management Studio UI创建文件备份,然后将其还原到同一服务器或任何其他服务器上的新数据库中。
答案 2 :(得分:2)
在SQL 2005中,我想说最快的方法是在Database - >下使用Copy Database。任务
源和目标可以相同,并且允许您根据需要重命名数据库。
答案 3 :(得分:1)
有一个命令行工具(DOS),用于创建和恢复数据库。
您也可以将其作为T-SQL脚本执行。 http://www.sqlmag.com/Article/ArticleID/46560/sql_server_46560.html
答案 4 :(得分:0)
我会使用脚本,因为这有助于您正在做的事情的透明度 (特别是如果你想经常这样做,因为每个人的数据都会有不同的数据。)
但是,如果您不想轻松创建脚本,最简单的方法是备份然后还原为其他名称。
答案 5 :(得分: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
答案 6 :(得分:0)
投掷的另一个选择,
这是一篇博客文章,介绍如何使用数据库发布向导以及它如何用于将数据库的所有元素(包括数据)导出到SQL文件。可能会有所帮助,看起来非常简单。
答案 7 :(得分:0)
SQL 2005 - quick way to quickly duplicate a database + data以上的帖子有效......
但是如果您使用sql server 2008 r2,例如,你可能需要在“create table #restoretemp”部分轻微修改,因为“restore filelistonly ...”的返回已经改变了...
基本上在“maxsize 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)
你最终会得到下面的工作脚本......
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