数据库联机时是否可以复制数据库文件?


9

我正在努力在SQL Server 2008 R2 SP1上建立生产数据库的开发副本。目前,两个开发人员已很少使用实时数据库来进行只读查询,但是新数据库也将对其进行更新。

由于数据库为2.1TB,并且总共花了3天时间来还原和更新到我们需要测试的最新版本,所以我最初的计划是创建一组新的备份文件,然后从这些文件中还原。这将允许我在同一SQL实例和计算机上创建数据库的开发副本,而不必使当前数据库脱机。

但是,为了节省几天的时间,我认为仅复制物理数据库文件并附加数据库的新副本可能是一个好主意。不幸的是,当我尝试复制时,出现错误,该错误是指SQL Server对这些文件施加的锁定。

由于除了传输日志文件外,我什么都不能使数据库脱机(我可以在人们早上进来之前完成此操作),是否有任何方法可以复制实时数据库文件而无需将数据库置于脱机状态?还是我应该等到人们回家后再这样做?

Answers:


11

为什么备份/还原2.1 TB数据库需要3天?如果只是移动备份,我怀疑复制MDF / LDF文件实际上会比较慢,因为至少可以压缩备份。而且,如果只是要还原,那么写入文件副本的速度应该不会比还原过程本身快得多-确保已启用即时文件初始化。或者在辅助系统上获得更快的I / O。

无论如何,不​​,您不能在数据库处于联机状态时复制MDF / LDF文件,您必须使其脱机才能这样做。这是复制数据库的绝对最安全的方法。如果文件在分离/脱机时发生任何变化,则您的数据库副本现在为零。

我建议您研究一些使备份/还原速度更快的方法-是否要确保使用最佳的I / O子系统以最佳方式压缩备份并以最佳方式传输文件,从而获得更好的I / O,确保已启用IFI,等等。

要考虑的另一种选择是循环日志传送-假设生产处于完全恢复状态并且您要进行定期日志备份,则可以在开发人员处理另一个数据库的同时将日志传送到一个数据库,而当达到稳定点时,可以通过恢复进行还原并让开发人员切换,并随身携带最新的更改。现在,对他们刚刚停止使用的副本重新初始化日志传送,并且可以在下一次“稳定”切换时为他们准备好了,无需等待。


备份将花费未知的时间(我没有创建原始备份)。还原需要10个小时,然后运行更新将其恢复到我们的开发版本又需要8个小时。所以说真的,如果我们谈论的是24小时工作制,则只需18小时。谈到8小时的工作日,基本上就是3天(增加一些时间来复制文件)。我可以使用绝对方法来调整备份/还原过程本身,这就是我现在要做的,因为我知道这就是我要去的方法。
肖恩·朗

0

不,您必须使其脱机才能复制文件。如果将数据库分为较小的文件/文件组,则可以在完成一次备份后帮助加快备份还原的速度(取决于正在更改的数据和开发副本需要的数据)。


0

我看到了其他答案,它们很有意义。但是,仅回答您的问题,您当然可以复制数据库文件而无需使数据库脱机。为此,您将需要使用SMO编程。检查一下:http : //technet.microsoft.com/en-us/library/ms162175(v=sql.100).aspx

请注意,提供的链接指向常规SMO编程对象,而不是对此问题的特定答案。我还没有这样做,但是我很快将尝试一下,并将告诉大家(如果我还记得的话),我会发现什么。


-1

数据库联机时是否可以复制数据库文件?

是。

您所要做的就是将数据库设置为只读:

  1. 跑:

    USE [master]
    GO
    ALTER DATABASE [Database] SET READ_ONLY WITH NO_WAIT
    GO
    
  2. 将数据库文件-MDF,LDF等复制到其新目的地

  3. 复制完成后,您可以分离并重新连接到新位置。只需确保重置只读选项,并且在处理这些文件时您正在使用相同的用户帐户即可。另外,您可能要在移动后删除旧文件。

另一种方法

成功复制文件后(上述步骤2):

您可以将数据库设置为:Single_User模式,然后:

  1. 跑:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Single_USER WITH NO_WAIT
    GO
    
  2. D:\ 是新地点

    ALTER DATABASE Database MODIFY FILE
    (NAME = DATABASE, FILENAME = 'D:\DATABASE.mdf')
    GO
    ALTER DATABASE OHDSI MODIFY FILE
    (NAME = DATABASE_LOG, FILENAME = 'D:\DATABASE_LOG.ldf')
    GO
    
  3. 确保新位置(D:\)中的数据文件对运行SQL Server的服务帐户具有完全访问权限。

  4. 重新启动SQL服务

  5. 跑:

    USE [master]
    GO
    ALTER DATABASE [Database] SET  Multi_USER WITH NO_WAIT
    GO
    

做完了!


首先请注意,如果正常使用需要将数据库写入数据库,则将数据库置于只读模式会导致有效的中断。其次,我希望SQL Server在读取文件时仍将其锁定以供使用。如果您的个人经历或MS文档另有说明,请在答案中进行编辑。第三,我通常看到的关于更改文件位置的建议是使数据库脱机,而不仅仅是进入单用户模式。同样,如果您有个人经验或MS文档有其他建议,请编辑答案。谢谢!
RDFozz '17

没错!只读将阻止用户写入,但他们将能够读取。第二点-是的,您可以使数据库脱机-但是问题是在线时。我上面描述的过程以最少的停机时间工作。谢谢。
RAVicioso

@RAVicioso只读数据库也是中断。如果您不能写入新数据(即接订单),则系统实际上已关闭。这似乎是个坏主意,不是吗?
艾瑞克·达林

@sp_BlitzErik-解决方案有效,但是在这种类型的维护期间您将无法编写。在您的示例中:“接受订单”,不会。
RAVicioso
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.