愚蠢的问题 - 在我想用生产服务器中的实例刷新开发服务器的环境中复制实例的最佳方法是什么?
我已经完成了备份恢复,但是我听说过detach-copy-attach,一个人甚至告诉我他只会在文件系统之间复制数据文件....
这三种(或两种,最后一种听起来有点可疑)接受的方法是什么?
我的理解是第二种方法更快,但由于分离方面的原因,需要在源上停机。
此外,在这种情况下(想要在开发服务器上获得精确的生产副本),传输登录等的公认惯例是什么?我应该只备份和恢复用户数据库+ master + msdb吗?
答案 0 :(得分:42)
最简单的方法实际上是一个脚本。
在生产时运行:
USE MASTER;
BACKUP DATABASE [MyDatabase]
TO DISK = 'C:\temp\MyDatabase1.bak' -- some writeable folder.
WITH COPY_ONLY
这一命令可将数据库的完整备份副本复制到单个文件中,而不会影响生产可用性或备份计划等。
要恢复,只需在您的开发或测试SQL 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 Server登录(不是Windows身份验证),您可以在每次恢复后(在开发/测试计算机上)运行此命令:
use MyDatabaseName;
sp_change_users_login 'Auto_Fix', 'userloginname', null, 'userpassword';
答案 1 :(得分:32)
复制数据库的最快方法是使用detach-copy-attach方法,但生产用户在分离prod db时将无法访问数据库。如果你的生产数据库是一个没人在夜间使用的销售点系统,你可以做这样的事情。
如果您无法分离生产数据库,则应使用备份和还原。
如果登录不在新实例中,则必须创建登录。我不建议您复制系统数据库。
您可以使用SQL Server Management Studio创建用于创建所需登录的脚本。右键单击您需要创建的登录名,然后选择Script Login As / Create。
这将列出孤立用户:
EXEC sp_change_users_login 'Report'
如果您已拥有此用户的登录ID和密码,请执行以下操作进行修复:
EXEC sp_change_users_login 'Auto_Fix', 'user'
如果要为此用户创建新的登录ID和密码,请执行以下操作进行修复:
EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password'
答案 2 :(得分:13)
<强>更新强>
我的建议告诉你如何使用SQL Server Management Studio编写数据库脚本,但SSMS中的默认设置由于某种原因错过了数据库的各种关键部分(如索引和触发器!)。因此,我创建了自己的程序来正确编写数据库脚本,包括您可能添加的每种类型的DB对象。我推荐使用它。它叫做SQL Server Scripter,可以在这里找到:
https://bitbucket.org/jez9999/sqlserverscripter
我很惊讶没有人提到这一点,因为它非常有用:您可以使用SQL Server Management Studio将数据库(其架构和数据)转储到脚本中。
右键单击数据库,选择“任务|生成脚本...”,然后选择编写特定数据库对象的脚本。选择要复制到新数据库的那些(您可能希望至少选择表和模式)。然后,对于“设置脚本选项”屏幕,单击“高级”,向下滚动到“脚本数据类型”,然后选择“架构和数据”。单击“确定”,然后完成脚本生成。您将看到这已经为您生成了一个长脚本,用于创建数据库的表和将数据插入其中!然后,您可以创建一个新数据库,并更改脚本顶部的USE [DbName]
语句,以反映要将旧数据库复制到的新数据库的名称。运行脚本,旧数据库的架构和数据将被复制到新的!
这使您可以在SQL Server Management Studio中完成所有操作,并且无需触摸文件系统。
答案 3 :(得分:7)
以下是我将数据库从生产环境复制到本地环境的方法:
答案 4 :(得分:6)
很难分离你的生产dB或其他运行的dB并处理停机时间,因此我几乎总是使用备份/恢复方法。
如果您还想确保同步登录,请使用存储的proc sp_help_revlogin 检查MS KB article以执行此操作。
答案 5 :(得分:5)
分离/复制/附加方法将关闭数据库。这不是你想要的东西。
备份/恢复仅在您具有生产服务器的写入权限时才有效。我使用Amazon RDS,但我没有。
导入/导出方法因外键而无法正常工作 - 除非您按照彼此引用的顺序逐个执行表。您可以导入/导出到新数据库。这将复制所有表和数据,但不复制外键。
这听起来像是一个需要与数据库做的常见操作。为什么SQL Server没有正确处理?每次我不得不这样做都很令人沮丧。
话虽如此,我遇到的唯一无痛解决方案是Sql Azure Migration Tool,由社区维护。它也适用于SQL Server。
答案 6 :(得分:0)
我运行SP来DROP表,然后使用DTS包将最新的生产表导入到我的开发盒中。 然后我回家第二天早上回来。它不优雅;但它适用于我。
答案 7 :(得分:-1)
如果要获取实时数据库的副本,请执行备份/还原方法。
[在SQLS2000中,不确定2008年:]请记住,如果您在此数据库中使用SQL Server帐户,而不是Windows帐户,如果主数据库在开发服务器上不同或不同步,执行还原时,用户帐户将不会转换。我听说有一个SP重新映射它们,但我不记得它是哪一个。