复制数据库的最佳方法(SQL Server 2008)

愚蠢的问题 – 什么是在我想用生产服务器实例刷新开发服务器的环境中复制实例的最佳方式?

我已经做了备份恢复,但我听说detach-copy-attach和一个人甚至告诉我,他只是复制文件系统之间的数据文件….

这三个(或两个,最后一个听起来有点嫌疑)接受的方法?

我的理解是,第二种方法更快,但由于分离方面的原因需要停机。

另外,在这种情况下(想要在开发服务器上生成一个精确的副本),传输login等的公认做法是什么? 我应该只是备份和恢复用户数据库+主+ msdb?

复制数据库的最快方法是使用detach-copy-attach方法,但生产用户在prod数据库分离时不能访问数据库。 如果您的生产数据库是例如在夜间没有人使用的销售点系统,则可以这样做。

如果你不能分离生产数据库你应该使用备份和恢复。

如果它们不在新实例中,则必须创buildlogin名。 我不build议你复制系统数据库。

您可以使用SQL Server Management Studio创build创build所需login名的脚本。 右键单击您需要创build的login名并select脚本login为/创build。

这将列出孤儿用户:

EXEC sp_change_users_login 'Report' 

如果您已经有此用户的loginID和密码,请通过执行以下操作来修复它:

 EXEC sp_change_users_login 'Auto_Fix', 'user' 

如果您要为此用户创build新的loginID和密码,请通过执行以下操作来修复它:

 EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password' 

最简单的方法实际上是一个脚本。

在生产中运行:

 USE MASTER; BACKUP DATABASE [MyDatabase] TO DISK = 'C:\temp\MyDatabase1.bak' -- some writeable folder. WITH COPY_ONLY 

这一个命令将数据库的完整备份复制到一个文件中,而不会干扰生产可用性或备份计划等。

要恢复,只需在您的开发或testingSQL Server上运行:

 USE MASTER; RESTORE DATABASE [MyDatabase] FROM DISK = 'C:\temp\MyDatabase1.bak' WITH MOVE 'MyDatabase' TO 'C:\Sql\MyDatabase.mdf', -- or wherever these live on target MOVE 'MyDatabase_log' TO 'C:\Sql\MyDatabase_log.ldf', REPLACE, RECOVERY 

然后在每台服务器上保存这些脚本。 一键方便。

编辑:
如果在还原逻辑名称不匹配时遇到错误,则可以像这样获取它们:

 RESTORE FILELISTONLY FROM disk = 'C:\temp\MyDatabaseName1.bak' 

如果您使用SQL Serverlogin(而不是Windows身份validation),则可以在每次恢复后(在开发/testing机器上)运行此操作:

 use MyDatabaseName; sp_change_users_login 'Auto_Fix', 'userloginname', null, 'userpassword'; 

更新:
我的build议告诉你如何使用SQL Server Management Studio编写数据库脚本,但SSMS中的默认设置由于某种原因遗漏了数据库的各种关键部分(如索引和触发器!)。 所以,我创build了自己的程序来正确编写一个数据库脚本,包括几乎所有可能添加的数据库对象types。 我build议使用这个。 它叫做SQL Server Scripter,可以在这里find:
https://bitbucket.org/jez9999/sqlserverscripter


我很惊讶,没有人提到过这个,因为它非常有用:可以使用SQL Server Management Studio将数据库(其模式数据)转储到脚本。

右键单击数据库,select“任务|生成脚本…”,然后select脚本特定的数据库对象。 select你想复制到新的数据库(你可能想至lessselect表和模式)。 然后,对于“设置脚本选项”屏幕,单击“高级”,向下滚动到“脚本数据types”并select“模式和数据”。 单击确定,并完成生成脚本。 您会看到现在已经为您创build了一个长脚本,用于创build数据库的表并将数据插入到它们中! 然后,您可以创build一个新的数据库,并更改脚本顶部的USE [DbName]语句以反映要将旧数据库复制到的新数据库的名称。 运行脚本,旧的数据库的模式和数据将被复制到新的!

这使您可以在SQL Server Management Studio中完成整个工作,而且不需要触摸文件系统。

下面是我所做的从生产env复制到本地环境的数据库:

  1. 在本地的sql server中创build一个空的数据库
  2. 右键单击新数据库 – >任务 – >导入数据
  3. 在“SQL Server导入和导出向导”中,select产品env的服务器名称作为数据源。 并select新的数据库作为目标数据。

它很难分离你的生产dB或其他运行dB并处理这个停机时间,所以我几乎总是使用备份/恢复方法。

如果您还想确保您的login处于同步状态,请查看关于使用存储过程sp_help_revlogin执行此操作的MS知识库文章 。

分离/复制/附加方法将取消数据库。 这不是你想要的东西。

只有在对生产服务器拥有写入权限的情况下,备份/还原才能正常工作。 我与亚马逊RDS合作,而我却没有。

导入/导出方法并不是真的因为外键而起作用 – 除非你按顺序逐一地在表格中引用另一个表格。 您可以执行导入/导出到新的数据库。 这将复制所有的表和数据,但不是外键。

这听起来像是数据库需要处理的常见操作。 为什么SQL Server不能正确处理? 每次我必须这样做,这是令人沮丧的。

这就是说,我遇到的唯一的无痛解决scheme是由社区维护的Sql Azure迁移工具 。 它也适用于SQL Server。

我运行SP来删除表,然后使用DTS包将最新的生产表导入到我的开发箱中。 然后我回家,第二天早上回来。 这不是优雅的; 但它适用于我。

如果您想要复制实时数据库,请执行“备份/还原”方法。

[在SQLS2000中,不太确定2008]:请记住,如果您在此数据库中使用SQL Server帐户,而不是Windows帐户,则如果主数据库在开发服务器上不同步或不同步,则用户帐户当你做恢复时不会翻译。 我听说过一个SP重新映射,但我不记得它是哪一个。

我使用EMS SQL备份 ,它有数据库传送任务,可以很容易地安排。 您必须指定共享的networking文件夹。 复制也通过备份/复制/恢复来执行,但可以快速设置。 它看起来像没有能力处理程序中的login,你将不得不手动。