创建用于测试的重复 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语句
oracle数据库中如何用sql语句查出重复字段以及如何删除?