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


72

愚蠢的问题-在要使用生产服务器中的实例刷新开发服务器的环境中,复制实例的最佳方法是什么?

我已经完成了备份-还原,但是我听说过detach-copy-attach,甚至有人告诉我他只需要在文件系统之间复制数据文件即可。

这三种(或两种,最后一种听起来有点可疑)是否被接受?

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

另外,在这种情况下(想要在开发服务器上复制生产的精确副本),如何转移登录名等做法?我应该只备份和还原用户数据库+ master + msdb吗?

Answers:


32

复制数据库最快的方法是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'

2
另请参阅此问题以了解如何还原为其他名称。
约翰

@MGOwen,尝试备份和还原具有多个文件组的500Gb数据库,而不是分离和附加。哪一个更快?
Jose Chama 2014年

2
@Jose是的,这比大型数据库的仅复制备份花费的时间更少。但是,仅复制备份不会降低生产数据库的速度,通常这会加快速度。
MGOwen 2014年

分离更多地用于移动生产数据库。用于复制到dev等的预期解决方案(不会降低生产数据库)是copy_only备份(请参见我的答案)。
MGOwen 2014年

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';

3
COPY_ONLY标志加1,这不会干扰备份策略
Muflix

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中完成整个操作,而无需接触文件系统。


Bitbucket-您无权访问此存储库。使用顶部的链接返回。
汤姆·斯蒂克

2
@TomStickel糟糕-刚刚将其公开。:-)
Jez

1
将sql转储到文件中很糟糕,尤其是在使用大型数据库时。Microsoft为什么不能提供出色的实用程序来完成这项显而易见且必要的任务?
ATL_DEV

@ user148298微软已经提供了解决方案,只是没有使它很容易的发现:COPY_ONLY备份(见我的回答如下)。
MGOwen

我最终使用您的软件创建了在SQL Server 2000上运行的数据库的副本。SQLManagement Studio不再正确支持此功能,因此这确实对我有所帮助。必须进行一些小的更改,因此我创建了一个请求请求。
Thorarin

9

以下是将数据库从生产环境复制到本地环境的操作:

  1. 在本地sql服务器中创建一个空数据库
  2. 右键单击新数据库->任务->导入数据
  3. 在“ SQL Server导入和导出向导”中,选择产品环境的服务器名称作为数据源。然后选择新数据库作为目标数据。

2
您是真正的MVP。当您无法访问源(或目标)系统的文件系统时,这就是答案。就我而言,我可以通过Management Studio进行访问,但是完全无法访问文件系统。这个答案甚至没有第3方工具即可解决问题。谢谢!
泰勒·福赛斯

有没有办法通过脚本来做到这一点?
MikaelMadrid

2
这很危险,请知道索引-外键等不会以这种方式被复制!
Calciol

6

很难分离您的生产dB或其他正在运行的dB并处理停机时间,因此我几乎总是使用备份/还原方法。

如果您还想确保登录名保持同步,请查看有关使用存储的proc sp_help_revlogin执行此操作的MS KB文章


5

detach / copy / attach方法将删除数据库。那不是您在生产中想要的东西。

仅当您对生产服务器具有写权限时,备份/还原才有效。我使用Amazon RDS,但不使用。

由于使用了外键,导入/导出方法实际上并不起作用-除非您按照它们相互引用的顺序一张一张地做表。您可以导入/导出到新数据库。这将复制所有表和数据,但不复制外键。

这听起来像是需要对数据库执行的一项常见操作。为什么SQL Server无法正确处理此问题?每次我必须这样做时,都会感到沮丧。

就是说,我遇到的唯一轻松的解决方案是由社区维护的Sql Azure迁移工具。它也适用于SQL Server。


0

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


-1

如果要复制活动数据库,请执行“备份/还原”方法。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.