创建用于测试的重复 SQL 数据库

Posted

技术标签:

【中文标题】创建用于测试的重复 SQL 数据库【英文标题】:Create Duplicate SQL Database for Testing 【发布时间】:2012-10-03 08:26:39 【问题描述】:

我在 SQL Server 上创建了一个数据库,并在 winforms c# 中创建了一个前端用户应用程序。 它已经启动、运行并且工作正常,但是客户现在要求我设置一个测试版本来培训新员工,这样他们就可以在接受培训的同时输入虚拟数据,而不会影响“真实”的实时数据库。

当我安装数据库时,我已经编写了所有脚本,但是从那以后情况发生了变化,我不想再次编写所有表的脚本。

是否有一种快速、方便的方法可以在同一服务器上复制数据库(及其数据),但名称不同?

编辑(在托尼·霍普金森的帖子之后)

我已经做到了

exec sp_addumpdevice 'Disk','MyDatabaseBackup',N'D:\MyDatabaseBackup' 
Restore Database MyDatabase From MyDatabaseBackup With File = 1, 
Move 'MyDatabase' To N'C:\Program Files\Microsoft SQL 
Server\MSSQL11.SQLE\MSSQL\DATA\MyDatabaseTEST.mdf', 
Move 'MyDatabase_Log' To N'C:\Program Files\Microsoft SQL 
Server\MSSQL11.SQLE\MSSQL\DATA\MyDatabaseTEST_log.ldf', 
NORECOVERY,  NOUNLOAD,  STATS = 10 
RESTORE LOG [MyDatabaseTEST] FROM  [MyDatabaseBackup] WITH  FILE = 2,  NOUNLOAD,  STATS = 10 
exec sp_dropdevice MyDatabaseBackup 

但我收到以下错误消息

消息 3234,第 16 级,状态 2,第 2 行 逻辑文件“MyDatabase”不是数据库“MyDatabase”的一部分。使用 RESTORE FILELISTONLY 列出逻辑文件名。 消息 3013,第 16 级,状态 1,第 2 行 RESTORE DATABASE 异常终止。 消息 3154,第 16 级,状态 4,第 6 行 备份集保存现有“MyDatabaseTEST”数据库以外的数据库的备份。 消息 3013,第 16 层,状态 1,第 6 行 RESTORE LOG 异常终止。 设备掉落。

【问题讨论】:

【参考方案1】:

在 SQL Server Management Studio 中使用复制数据库选项

【讨论】:

看起来很简单 - 但是当我这样做时,下拉任务列表中没有复制数据库选项?! 在速成版中不可用 .. 备份和恢复是您的最佳选择【参考方案2】:

我发现这种方法在 SQL Server 2005 和 2008 Express Edition 上最有效:

来自Microsoft Docs:

    右键单击要复制的数据库并选择任务->“备份...” 将备份保存为 .bak 文件 在 SQL Server Management Studio 的对象资源管理器中右键单击“数据库”文件夹 选择“恢复数据库” 作为源,选择“文件”并指向您之前创建的 .bak 文件。 更改要恢复到的数据库的名称(这对我来说是关键步骤 - 您不受下拉列表中的选项的限制。)

SSMS 将根据您提供的名称将您的 .bak 文件恢复到新数据库。

【讨论】:

谢谢。不知何故,复制数据库流程对我来说崩溃了。 我试过这个并得到错误: System.Data.SqlClient.SqlError: 备份集包含一个数据库的备份,而不是现有的“TEST”数据库。 (Microsoft.SqlServer.SmoExtended) 好像不允许重命名数据库(即恢复到不同的数据库)。【参考方案3】:

首先对你当前的数据库做一个完整的备份,当然你有:)

你把它恢复到另一个人

例如像

exec sp_addumpdevice 'Disk','LiveDataBackup',N'Insert backup file name here including path'
Restore Database TestData From LiveDataBackup With File = 1,
Move 'LiveData' To N'Path to where sqlserver expects the mdfs to be\TestData.mdf',
Move 'LiveData_Log' To N'Path to where sqlserver expects the ldf to be\TaxData1.ldf',
NORECOVERY,  NOUNLOAD,  STATS = 10
RESTORE LOG [TestData] FROM  [LiveDataBackup] WITH  FILE = 2,  NOUNLOAD,  STATS = 10
exec sp_dropdevice LiveDataBackup

以上假设您的实时数据库被巧妙地命名为 LiveData 和 test,TestData。

mdf 和 ldf 所在的路径取决于 sql server 的版本和实例名称

应该是这样的 C:\Program Files\Microsoft SQL Server\MSSQL11.DENALI\MSSQL\DATA\

MSSQL11 因为它是 sql 2012,而 DENALI 是我的实例名称,它默认安装在 C:\Program Files

也没有 with replace,所以如果你想再次运行它,你需要删除你的测试数据库。

可能有一些方法可以从 GUI 中做到这一点,但我发现它是一个巨大的 PIA,试图将 UI 与我想做的事情联系起来。

【讨论】:

这并没有发挥作用,但对实现目标非常有帮助。我需要在 RESTORE 命令之前添加“BACKUP DATABASE LiveData TO LiveDataBackup”,并从 RESTORE 中删除“NORECOVERY”参数。似乎不需要“恢复日志”。【参考方案4】:

使用 MS SQLServer 2012,您需要执行 3 个基本步骤

首先,生成仅包含源数据库结构的 .sql 文件

=> 右键单击​​源数据库,然后单击任务,然后生成脚本 => 按照向导,你可以在本地保存 .sql 文件

其次,将.sql文件中的源数据库替换为目标数据库

=> 右键单击​​目标文件,打开 .sql 文件并按 New Query 和 Ctrl-H 或(编辑 - 查找和替换 - 快速替换)

最后,填充数据

=> 右击目标数据库,然后是任务,然后是导入数据 => Data source drop dow 设置为“.net framework data procider for sql server” + 在 DATA 下设置连接字符串文本字段 ex:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15 => 与目的地相同 => 勾选你要转移的表格或勾选“source :.....”旁边的复选框以检查所有表格

你已经完成了。

【讨论】:

此方法可能需要比其他进程更长的时间,但从技术上讲,它使用的磁盘空间最少,因为没有中间备份文件。此外,通过此流程,可以在复制过程中对敏感数据进行清理,并在此过程中留下更少的 PII 痕迹。【参考方案5】: 将数据库转储到备份文件中 从您的转储中重新创建您的数据库 - 这是一个您可以运行的脚本 - 具有不同的名称(您必须更改为脚本)

你可以关注(this)

【讨论】:

【参考方案6】:

您希望将一个 Database_Production 复制到同一服务器中的 Database_Testing。我将以 database_production 数据库为例。我在我的服务器上测试成功了。

首先,备份数据库Database_Production。

BACKUP DATABASE Database_Production TO DISK ='H:\test\Database_Production.bark';

其次,恢复 Database_Production,这可以将数据库名称重命名为 Database_Testing。

RESTORE DATABASE Database_Testing 
    FROM DISK='H:\test\Database_Production.bark' 
    WITH 
        MOVE 'Database_Production_Data' TO 'H:\test\Database_Testing_Data.mdf',
        MOVE 'Database_Production_log' to  'H:\test\Database_Testing_Data.ldf';
GO

然后将数据库 Database_Production 复制到数据库 Database_Testing。 MOVE 语句使数据和日志文件恢复到指定位置。您不需要创建数据库 Database_Testing,脚本会创建它。

【讨论】:

【参考方案7】:

如果您需要在同一台服务器上创建数据库,只需创建空数据库即可。右键单击它并选择还原-> 选择要复制的数据库,然后单击确定。

【讨论】:

以上是关于创建用于测试的重复 SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

测试实用sql

sql 语句 急!!!! 数据将英文和数字去掉,只保留汉字的sql语句

SQL如何查询出某一列中不同值出现的次数?

oracle数据库中如何用sql语句查出重复字段以及如何删除?

将 java.sql.Array 创建为整数数组以用于准备好的语句 [重复]

Cordova App sqlite 数据库查看器,用于运行时应用程序测试,如 Web SQL