在sql server中复制数据库

时间:2014-05-22 15:24:42

标签: sql-server

我一直忙于查看在sqlserver中复制数据库的各种方法,而且似乎完全卡住了!关于这个主题有各种各样的问题和答案,但它们似乎都不符合我的情况。

基本上我尝试做的是在特定状态下设置数据库(架构+ 数据),最好是通过我选择的任何方法 - 在应用程序中乱码,编写插入等然后,我想保留该数据库的副本,该副本可用作 状态,即针对/ require运行的特定测试集。我需要能够将其放入任何数据库名称,而不仅仅是我提取它时恰好是它的那个。 我需要这个从构建服务器的命令行工作。

理想情况下,我希望能够做到这样的事情:

outputFile = "something.IDontCareWhatExtension"
databaseName = "aDatabase"
SaveDatabase(databaseName, outputFile)

以及其他地方:

inputFile = "theFilename"
databaseName = "somethingOtherDatabase"
Load(databaseName, inputFile);

这似乎不是一个大问题!我在oracle中使用imp + exp做了类似的事情,它基本上做了我想做的事。

到目前为止,我已尝试使用SMO .net库。当您进行数据库右键单击时,这就是SSMS中引用的内容=> tasks =>生成脚本。这些基本上不会像你期望的那样工作,并且需要大量的编程工作来解决约束问题。在花费更多时间进入这种方法之前,我认为我会在备份和恢复时更详细地查看,但这些似乎只是为了备份和恢复(可能是名称中的线索!)!例如,他们似乎没有让你说出要安装备份的数据库。

请帮忙!当然这可能难以做到吗?!

我能想到的唯一另一件事是我应该采用不同的方法来编写数据库安装脚本 - 我在其中生成特定版本的模式,然后手工制作一大堆插入语句。这将阻止我们从服务器上提取客户端数据以重现错误。

1 个答案:

答案 0 :(得分:1)

您可以在数据库达到所需的特定状态时备份数据库,然后为测试恢复该备份。

BACKUP DATABASE [ReadyForTesting] TO  DISK = N'C:\Temp\Backup.bak' WITH  COPY_ONLY, NOFORMAT, NOINIT,  NAME = N'ReadyForTesting-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

然后,要进行恢复,只需指定一个不同的名称即可将其复制或克隆:

USE [master]
RESTORE DATABASE [Restored_Copy] FROM  DISK = N'C:\Temp\Backup.bak' WITH  FILE = 1,  MOVE N'dbfile' TO N'C:\MDFPath\Filename.mdf',  MOVE N'LogFile' TO N'C:\LogPath\Filename_log.LDF',  NOUNLOAD,  STATS = 5

GO