如何在SQL Server Express内复制数据库?

56

我想复制一个已有的数据库作为测试数据库并将其保留在同一台服务器上。然而,所有我找到的方法都是使用复制数据库向导(我正在使用MS SQL Server Express)。

指南上总是这样说:在SQL Server Management Studio中,展开“数据库”,右键单击一个数据库,指向“任务”,然后单击“复制数据库”。

但我没有“复制数据库”选项。我以管理员身份运行,所以不知道为什么它对我不可用 - 是我需要单独安装什么吗?由于要复制到同一台服务器上,我不能使用卸载/附加的方法。我试过先卸载、复制MDF/LDF文件、重命名再附加,但这搞得一团糟 :) 我不太擅长编写SQL程序来完成所有这些操作,有没有可以帮助我的工具呢?


13个回答

81

在 SSMS 2008 中,您可以执行以下操作:

  1. 创建要复制的数据库备份

  2. 在 SSMS 中,右键单击“数据库”,并选择“还原数据库”

  3. 从“还原源”部分的“从数据库”下拉列表中选择您想要复制的数据库

  4. 在“目标还原位置”部分的“目标数据库”字段中输入新数据库的名称 - 这不能是现有数据库的名称。

  5. 点击“确定”

完成啦! :)


7
对我来说,这会导致很多问题,因为它仍然试图使用与复制的数据库相同的MDF和LDF文件。尽管可以更改要使用的MDF和LDF文件,但它仍然经常试图使用原始数据库中的那些文件。 - krzychu
1
@krzychu 我也遇到了类似的问题。你已经解决了吗? - Fede
2
我尝试了几次,在还原数据库时更改MDF和LDF路径,最终成功了。不过,我不记得是否有做什么特别的事情让它起作用了。 - krzychu
1
设置新的.mdf和.ldf文件就解决了问题,在“还原数据库”弹出窗口中,“文件”选项卡,参数“还原为”;感谢@krzychu的提示。 - nicolallias
1
似乎已经被SSMS 17.4(2017)修复。至少我得到了基于新数据库名称自动建议的新文件名。 - Jonas

52

在 SQL Server Express 2012 中,您可以执行以下步骤:

  1. 创建您想要复制的数据库的备份
  2. 右键单击 "Databases" 并选择 "还原文件和文件组"
  3. 在“目标数据库”字段中输入新数据库的名称。
  4. 选择“从设备” ,然后选择您在第一步备份的文件
  5. 点击“确定”

这将 "克隆" 数据库,并具有正确的表设置,例如 "默认值" 和 "自动增加" 等。


2
这也非常适用于SQL Server Express 2008 R2。谢谢! - DaveN59
备份和恢复数据库,我需要登录管理员账户吗? - user585440
我在注意到答案建议使用“还原文件和文件组”之前,使用了“还原数据库”。我得到了我想要的结果,但我想知道它们之间的区别是什么。 - Alan
1
注意:仅当您尚未创建目标数据库时(即,在步骤3中必须是一个不存在的新DB名称),此操作才有效。 - Stuart Rossiter

9

SQL Express数据库有一个导出按钮,我只需将数据库导出到同一服务器上的新数据库中,正在复制数据库。只需右键单击数据库名称即可。


比备份/还原慢,但是特别适合迁移大量小型数据库,而且最为简便可靠的方法。 - Jeff Dunlop
其实我认为这更快,因为只需要一半的读写。用户账户也被复制了过来。 - Jeff Dunlop
它不会复制存储过程。不确定索引。 - krzychu
它还将我的视图复制为表格。 - Druid
我遇到了与@Druid相同的问题——即视图被复制为表。 最终我通过备份现有数据库并将其恢复到新数据库来解决这个问题。然而,有一个注意点,您无法将数据库还原到_现有_数据库上,因为它会抛出“备份集包含除现有<DB_Name>数据库以外的其他数据库的备份”错误。对于我来说,删除_新_数据库并重新执行还原过程,同时手动在_Destination_数据库字段中输入新数据库名称,完美地解决了这个问题! :) - XtraSimplicity
它不会复制索引、主键、外键等。但是,通过使用Visual Studio SQL Server数据比较工具,您可以同步两个数据库模式。完成此操作后,使用SSMS导出将数据插入到目标数据库中。 - eka808

5

按照以下步骤在SQL Express中复制数据库:

  1. 停止SQL服务
  2. 将mdf,ldf以及任何其他与该数据库相关的文件复制到一个新位置(确保获取日志文件)
  3. 更改每个复制文件的名称
  4. 启动SQL服务
  5. 在SSMQ中右键单击“数据库”,然后选择“附加”
  6. 确保您在“附加为”列中更改了名称
  7. 在“数据库详细信息”的下方窗格中更新已复制文件的位置(特别是那个日志文件)

我成功地使用此方法在我的SQL Express系统上复制了一个数据库

alt text


1
我尝试过这个方法,但是它无法运行。当我将新名称的数据库连接后,它破坏了我的原始数据库。因此,对于这个新的带有新名称的数据库,我编写的所有代码都可以正常运行,但是我的旧代码仍然指向旧的数据库名称,已经无法使用。我需要能够同时使用两个数据库。 - Jenn
FYI - 它显示为两个不同的数据库。但以某种方式并未按照我认为的(以及您所说的)那样工作。我将再次尝试,以防万一,完全按照您的说明进行操作... - Jenn

5
我在使用 SQL Express 2012 时,遇到了复制数据库的问题。我通过备份和还原方法解决了这个问题。备份后,我使用了还原 -> 文件和文件组。选择还原选项 接下来,我为新数据库编写了一个新名称并设置了源。

set source and named new database

指定源文件

choosing backup file

最后,必须选择使用替换来覆盖现有数据库,并为扩展名为mdf和ldf的新文件设置名称,这些名称与现有文件不同,位置在:还原为。

set new names for mdf and ldf files

这种方法对我有效


2

如果您正在使用SQL Server Express 2012,请注意前往“文件”选项,并确保目标文件(“还原为”列)与原始文件*.mdf和*.log不同。

(我尝试放置一张图片,但需要10个声望:p)


1
我找到了问题!点击“数据库”,选择“还原”,然后按照以下步骤操作: 选择要还原的文件位置,并填写目标数据库名称,进入文件[图片上的注解1],并将最右边一列的文件名更改为与原始文件不同的名称[图片上的注解2],然后就可以成功了 :)

> SEE THE PICTURE HERE <


1

已经尝试过了,但不起作用,因为想要在已经存在该数据库的同一服务器上进行恢复 :( - Jenn
如果您将数据库还原到不同名称的数据库上,您应该包括重命名数据文件(LDF/NDF/MDF)的选项。这可以防止Sql尝试覆盖原始数据库的数据文件。 - Dan Puzey
@DanPuzey你能详细解释一下吗?这个过程应该具体是怎样的? - Fede

1
解决方案肯定是创建备份并还原,但请确保您的恢复副本指向不同的.mdf和.ldf文件。

以下是使用SSMS 2014和SQL Server 12安装程序检查的方法:假设您正在本地磁盘上创建和还原备份。

  • 创建现有数据库的备份
    • 右键单击数据库,在“任务”下选择“备份...”
    • (如果将位置保留为默认设置,则在还原时无需寻找备份。)
  • 将备份还原到新数据库:
    • 右键单击数据库,选择“还原数据库”
    • 选择“设备”
    • 点击省略号按钮(“...”)以打开“选择备份设备”对话框。
    • 选择“文件”作为备份介质类型,并单击“添加”按钮
    • 选择刚刚创建的备份,单击确定(两次)
    • 现在,在“还原数据库”对话框中,输入目标数据库的新名称
    • 在“选择页面”下单击“文件”,并确保“还原为”指向尚不存在的 .mdf 和 .ldf 文件名
    • 单击确定!

0
关于您问题的第一部分(为什么您在dbs的任务下没有看到此“复制数据库向导”选项),答案确实在于您正在运行SQL Server Express。 SQL Server Express不支持SQL Server Agent功能,而此“复制数据库”功能依赖于该功能,因此不会显示“复制数据库”功能(但许多在线资源未能观察到这一点)。

幸运的是,几乎所有其他人都解决了您问题的第二部分(如何以其他方式完成任务),并且几乎所有人都指出使用现有的备份和还原选项(Express中确实存在),或者使用导出/导入(Express中也存在,我可以确认)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接