
[英]What's the best way to create a working copy of a SQL Server database?
[英]Best way to copy a database (SQL Server 2008)
愚蠢的问题-在要使用生产服务器中的实例刷新开发服务器的环境中,复制实例的最佳方法是什么?
我已经完成了备份-还原,但是我听说过detach-copy-attach,甚至有人告诉我他只是在文件系统之间复制数据文件。
这三种(或两种,最后一种听起来有些可疑)是否被接受?
我的理解是第二种方法更快,但是由于分离方面,需要在源上停机。
另外,在这种情况下(想要在开发服务器上复制生产的精确副本),如何转移登录名等惯例? 我应该只备份和还原用户数据库+ master + msdb吗?
最简单的方法实际上是脚本。
在生产上运行此命令:
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';
复制数据库最快的方法是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'
更新:
以下我的建议告诉您如何使用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。
我运行一个SP来删除表,然后使用DTS包将最新的生产表导入到我的开发箱中。 然后我回家,第二天早上回来。 它不优雅; 但这对我有用。
如果要复制活动数据库,请执行“备份/还原”方法。
[在SQLS2000中,不确定2008年:]请记住,如果在此数据库中使用SQL Server帐户(而不是Windows帐户),则如果主数据库不同或在开发服务器上不同步,则用户帐户还原时不会翻译。 我听说过要重新映射它们的SP,但我不记得它是哪一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.