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

use*_*260 72 sql-server sql-server-2008

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

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

这三种(或两种,最后一种听起来有点可疑)接受的方法是什么?

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

此外,在这种情况下(想要在开发服务器上获得精确的生产副本),传输登录等的公认惯例是什么?我应该只备份和恢复用户数据库+ master + msdb吗?

MGO*_*wen 42

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

在生产中运行:

USE MASTER;

BACKUP DATABASE [MyDatabase]
TO DISK = 'C:\temp\MyDatabase1.bak' -- some writeable folder. 
WITH COPY_ONLY
Run Code Online (Sandbox Code Playgroud)

这一命令可将数据库的完整备份副本复制到单个文件中,而不会影响生产可用性或备份计划等.

要恢复,只需在您的开发或测试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
Run Code Online (Sandbox Code Playgroud)

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

编辑:
如果在恢复逻辑名称不匹配时遇到错误,您可以这样得到它们:

RESTORE FILELISTONLY
FROM disk = 'C:\temp\MyDatabaseName1.bak'
Run Code Online (Sandbox Code Playgroud)

如果您使用SQL Server登录(而不是Windows身份验证),您可以在每次恢复后(在开发/测试计算机上)运行此命令:

use MyDatabaseName;
sp_change_users_login 'Auto_Fix', 'userloginname', null, 'userpassword';
Run Code Online (Sandbox Code Playgroud)

  • 加上1表示COPY_ONLY标志,不会影响备份策略 (3认同)

Jos*_*ama 32

复制数据库的最快方法是使用detach-copy-attach方法,但生产用户在分离prod db时不会访问数据库.如果您的生产数据库是例如夜间没有人使用的销售点系统,您可以执行类似的操作.

如果无法分离生产数据库,则应使用备份和还原.

如果登录不在新实例中,则必须创建登录.我不建议您复制系统数据库.

您可以使用SQL Server Management Studio创建用于创建所需登录的脚本.右键单击您需要创建的登录名,然后选择Script Login As/Create.

这将列出孤立用户:

EXEC sp_change_users_login 'Report'
Run Code Online (Sandbox Code Playgroud)

如果您已拥有此用户的登录ID和密码,请执行以下操作进行修复:

EXEC sp_change_users_login 'Auto_Fix', 'user'
Run Code Online (Sandbox Code Playgroud)

如果要为此用户创建新的登录ID和密码,请执行以下操作进行修复:

EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password'
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅[此问题](http://stackoverflow.com/questions/1360529/how-do-you-backup-and-restore-a-database-as-a-copy-on-the-same-server)如何恢复到不同的名称. (2认同)
  • @Jose你是对的,这比大型数据库的只复制备份花费的时间更少.但是,仅复制备份**不会使生产数据库失效**,而这通常会超速. (2认同)

Jez*_*Jez 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中完成所有操作,并且无需触摸文件系统.

  • @TomStickel哎呀 - 刚公开.:-) (2认同)

小智 8

以下是我将生产环境中的数据库复制到本地环境的方法:

  1. 在本地sql server中创建一个空数据库
  2. 右键单击新数据库 - >任务 - >导入数据
  3. 在SQL Server导入和导出向导中,选择产品env的servername作为数据源.并选择新数据库作为目标数据.

  • 你是真正的MVP。这是当您无法访问源(或目标)系统的文件系统时的答案。就我而言,我可以通过管理工作室访问,但完全无法访问文件系统。这个答案甚至在没有第 3 方工具的情况下解决了这个问题。谢谢! (2认同)
  • 这是危险的,请知道索引 - 外键等不会以这种方式复制! (2认同)

Tj *_*lie 6

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

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


Bog*_*scu 5

detach/copy/attach方法将关闭数据库.这不是你想要的东西.

备份/恢复仅在您具有生产服务器的写入权限时才有效.我使用Amazon RDS,但我没有.

由于外键,导入/导出方法实际上不起作用 - 除非您按照它们相互引用的顺序逐个执行表.您可以导入/导出到新数据库.这将复制所有表和数据,但不复制外键.

这听起来像是一个需要与数据库做的常见操作.为什么SQL Server没有正确处理?每次我不得不这样做都令人沮丧.

话虽这么说,我遇到的唯一无痛的解决方案是由社区维护的Sql Azure迁移工具.它也适用于SQL Server.