【问题标题】:Create Duplicate SQL Database for Testing创建用于测试的重复 SQL 数据库
【发布时间】: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 异常终止。 设备掉落。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

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

    【讨论】:

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

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

    来自Microsoft Docs:

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

    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】:

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

        【讨论】:

          猜你喜欢
          • 2019-11-24
          • 2021-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-03
          • 2015-04-26
          • 1970-01-01
          相关资源
          最近更新 更多