愚蠢的问题-在要使用生产服务器中的实例刷新开发服务器的环境中,复制实例的最佳方法是什么?
我已经完成了备份-还原,但是我听说过detach-copy-attach,甚至有人告诉我他只需要在文件系统之间复制数据文件即可。
这三种(或两种,最后一种听起来有点可疑)是否被接受?
我的理解是第二种方法更快,但是由于分离方面,需要在源上停机。
另外,在这种情况下(想要在开发服务器上复制生产的精确副本),如何转移登录名等做法?我应该只备份和还原用户数据库+ master + msdb吗?
Answers:
复制数据库最快的方法是detach-copy-attach方法,但是在prod db分离后,生产用户将没有数据库访问权限。如果您的生产数据库是夜间没有人使用的销售点系统,则可以执行类似的操作。
如果无法分离生产数据库,则应使用备份和还原。
如果登录名不在新实例中,则必须创建这些登录名。我不建议您复制系统数据库。
您可以使用SQL Server Management Studio创建用于创建所需登录名的脚本。右键单击您需要创建的登录名,然后选择“脚本登录为/创建”。
这将列出孤立的用户:
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'
最简单的方法实际上是脚本。
在生产上运行此命令:
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';
更新:
我的建议如下,告诉您如何使用SQL Server Management Studio编写数据库脚本,但是出于某种原因,SSMS中的默认设置会遗漏数据库的所有关键部分(例如索引和触发器!)。因此,我创建了自己的程序来正确编写数据库脚本,其中几乎包括您可能添加的每种类型的DB对象。我建议改用它。它被称为SQL Server Scripter,可以在以下位置找到:https :
//bitbucket.org/jez9999/sqlserverscripter
令人惊讶的是没有人提到它,因为它确实有用:您可以使用SQL Server Management Studio将数据库(其架构和数据)转储到脚本中。
右键单击数据库,选择“任务|生成脚本...”,然后选择以编写特定数据库对象的脚本。选择要复制到新数据库的数据库(您可能希望至少选择表和模式)。然后,对于“设置脚本选项”屏幕,单击“高级”,向下滚动到“要脚本的数据类型”,然后选择“架构和数据”。单击确定,并完成生成脚本。你会看到,现在这已经为您生成了一个很长的脚本创建数据库的表和数据插入到他们!然后,您可以创建一个新数据库,并更改USE [DbName]
脚本顶部的语句以反映要将旧数据库复制到的新数据库的名称。运行脚本和旧数据库
这使您可以在SQL Server Management Studio中完成整个操作,而无需接触文件系统。
以下是将数据库从生产环境复制到本地环境的操作:
detach / copy / attach方法将删除数据库。那不是您在生产中想要的东西。
仅当您对生产服务器具有写权限时,备份/还原才有效。我使用Amazon RDS,但不使用。
由于使用了外键,导入/导出方法实际上并不起作用-除非您按照它们相互引用的顺序一张一张地做表。您可以导入/导出到新数据库。这将复制所有表和数据,但不复制外键。
这听起来像是需要对数据库执行的一项常见操作。为什么SQL Server无法正确处理此问题?每次我必须这样做时,都会感到沮丧。
就是说,我遇到的唯一轻松的解决方案是由社区维护的Sql Azure迁移工具。它也适用于SQL Server。