【问题标题】:SQL Server 2012 copy database without dataSQL Server 2012 复制数据库没有数据
【发布时间】:2014-02-19 12:49:05
【问题描述】:

我们有一个 SQL Server 2012 数据库,其中包含我们用来开发网站的测试数据。我们很快需要清空数据库并导入真实数据,但是我们在 Web 开发过程中多次更改数据库设计,所以我们不能使用我们一开始创建的空副本!

有没有一种方法可以复制没有数据但包含其他所有内容(包括视图、SP 函数、安全对象等)的数据库,并将所有索引重置为设计种子值?换句话说,我们希望数据库保持原样,但删除所有数据,将所有表索引重置为其原始设计种子值,然后导入数据。

感谢您的帮助

【问题讨论】:

    标签: sql-server-2012


    【解决方案1】:
    1. 右键单击服务器中的数据库,然后选择Tasks > Generate Scripts
    2. 在介绍步骤中,单击下一步。
    3. 在选择对象时,您可以选择整个数据库(包括函数等)或指定要生成的对象。在您的情况下,您应该选择Script entire databases and all database objects,然后点击下一步。
    4. 选择文件名和目的地,然后点击下一步
    5. 查看后点击下一步
    6. 完成!

    您将看到在您指定的文件夹中生成了一个 .sql 文件。您可以在其他服务器上打开该文件并点击执行,然后它将生成完全相同的数据库。

    【讨论】:

    • 警告:根据我的经验,有时此方法生成的脚本不会以正确的顺序创建相互依赖的对象(例如,如果一个视图引用另一个视图,它们不一定会以正确的顺序编写脚本)。与 SQL Server 在某些情况下无法正确跟踪依赖关系有关。通常你可以通过多次重新运行脚本来摆脱所有依赖层。
    【解决方案2】:

    您在这里错过了最重要的答案: 随 MSSQL 2014 SP2(2016 年 7 月 11 日)引入,但后来添加到 MSSQL 2012 SP4(2017 年 10 月 5 日)- 准备数据库空克隆的最快和最简单的方法是通过 DBCC CLONEDATABASE 实现。然后根据网上的书籍:

    • 创建一个新的目标数据库,它使用与源相同的文件布局,但使用模型数据库中的默认文件大小。
    • 创建源数据库的内部快照。
    • 将系统元数据从源数据库复制到目标数据库。
    • 将所有对象的所有架构从源数据库复制到目标数据库。
    • 将所有索引的统计信息从源数据库复制到目标数据库。

    语法:

    DBCC CLONEDATABASE   
    (  
         [Source_DB_Name]
        ,[Target_DB_Name]
    )
    WITH NO_STATISTICS, NO_QUERYSTORE, VERIFY_CLONEDB, BACKUP_CLONEDB
    

    备注:

    • 源数据库必须是用户数据库。克隆系统数据库(master、model、msdb、tempdb、distribution 数据库等)
      不允许。
    • 源数据库必须在线或可读。

    • 与克隆数据库同名的数据库必须不存在。

    • 命令不在用户事务中。

    • 需要 SA 服务器角色

    Here 是一篇很好的 MS 文章,介绍了如何使用它。

    第二个选项:

    是使用一个名为dbatools.io的PowerShell模块,可以直接从项目网站或官方PowerShell Gallery获取。

    一旦你有了它,你就可以使用这个命令:

    Invoke-DbaDbClone 
        [-SqlInstance] <DbaInstanceParameter[]>] 
        [-SqlCredential] <PSCredential>] 
        [-Database] <String[]>] 
        [-InputObject] <Database[]>] 
        [-CloneDatabase] <String[]>] 
        [-ExcludeStatistics] 
        [-ExcludeQueryStore] 
        [-UpdateStatistics] 
        [-EnableException] 
        [-WhatIf] 
        [-Confirm] [<CommonParameters>]
    

    由于 dbatools.io 是一个开源项目,您可以通过公开的GitHub repo 看到后台到底发生了什么。

    您会发现他们使用 DBCC CLONEDATABASE() 来执行此操作的核心(但让您能够做更多事情)。

    【讨论】:

    • 该死,这是一个很好的答案。非常适合我。唯一需要注意的是,新的克隆数据库处于只读模式......但我只是将属性更改为 False,它就活了!
    【解决方案3】:

    您可以通过在 Management Studio 中右键单击它来生成数据库对象的脚本,然后转到任务、生成脚本,选择要编写脚本的对象,例如表、视图等,然后就可以了。

    【讨论】:

    • 我们主要使用VS来处理数据库,我们对使用脚本不是很熟悉。我更喜欢 VS 或 SQL 中的 UI 方法
    • 您所要做的就是通过 SQL Server Management Studio 执行生成的脚本
    • 我一直在查看并尝试 SQL 管理工作室中的脚本过程,但我仍然看不到如何使其生成可以复制数据库结构(包括索引、关系等)的脚本,但没有数据。我也不知道如何运行脚本,能否请您提供更多帮助?我不能资助一个简单的存储过程或类似的方法来创建一个空的数据库副本,这似乎很神奇!
    • 这里有一些页面可能对您有所帮助:technet.microsoft.com/en-us/library/ms178078(v=sql.105).aspxblog.sqlauthority.com/2011/05/07/…希望对您有所帮助。
    【解决方案4】:

    还有另一种方法,虽然耗时稍长,但也有好处。当使用其他人建议的“生成脚本”选项时,我们在“.sql”文本文件中获取整个数据库和表脚本。

    另一种方法是将现有数据库恢复到新数据库中。然后,您可以使用自定义脚本在表中循环删除表中的所有数据。现在您有了一个没有任何数据的数据库副本。对此进行备份以获得熟悉的“.bak”文件。

    【讨论】:

      【解决方案5】:

      是的!有几种方法可以做到这一点。您可以尝试复制数据库、删除 FK、截断表并重新创建 FK(如果您可以搜索,有 SP 可以自动执行删除/重新创建 FK 截断过程。)

      您可以简单地在 MS 中右键单击并尝试生成整个 DB 创建脚本(检查它是否完成了 100% 的工作)

      还有最靠谱的方法:用VS新建一个空DB,用schema比较工具生成diff脚本。

      【讨论】:

      • 我现在已经使用复制方法创建了一个精确的副本,然后删除了所有数据。现在如何将索引设置回设计“种子”值,而无需删除并重新创建所有索引和关系?
      • 在“复制”方法中,截断错误的种子。这样做的问题是您必须以正确的顺序删除/重新创建 FK。当我想保留大部分数据并“清理”一些表时,我会使用它。
      • 对不起 - 我的意思是我使用备份恢复方法来复制数据库。不过,删除并重新创建所有 FK 索引等将是一项艰巨的工作。我查看了 Redgate 比较产品页面,但不清楚您是否可以使用它来复制没有数据的数据库!肯定有人创造了一种简单的方法来做到这一点?
      • 对于您的场景,我可以使用上面描述的差异方法。这将构建一个庞大的脚本,所有创建 都是必需的。
      • 抱歉 - 离开几天了 - - - 据我所知,比较工具只有 VS 高级版及以上版本 - 我的是 VS Pro
      猜你喜欢
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多