在不先分离数据库的情况下复制 MDF/LDF 文件有什么风险?

pix*_*ger 5 sql-server

如果数据库备份不可用,我们的支持团队已接受培训,可以使用以下步骤进行恢复:

  1. 从文件系统备份中获取 MDF/LDF 的副本。
  2. 停止实例。
  3. 覆盖现有的 MDF/LDF 文件。
  4. 重启实例。

这是没有分离的。MDF 和 LDF 文件被简单地覆盖并重新启动实例,希望新文件可以正确初始化。

我目前正在尝试编写一个文档,描述在这种情况下如何正确使用 detach/attach。虽然我知道这是正确的方法,但我找不到任何描述另一种方法风险的资源。

任何人都可以提供任何建议吗?

Aar*_*and 7

这是一种可怕的备份方式。他们为什么不使用,呃,备份?不仅仅是因为它们不需要您删除整个实例。

如果您只是停止实例,则不能真正保证 MDF/LDF 文件将被优雅地分离。因此,仅仅因为您能够复制它们,并不意味着它们是好的。停止服务会消除 SQL Server 通过首先锁定文件系统访问权限而提供的保护(是什么阻止用户意外删除其中一个文件?毕竟他们是人)。众所周知,这些文件可能在您复制之前就已损坏,或者在您复制/移动它们时可能已损坏。如果用户不小心移动了它们而不是复制它们,并且在该过程中它们发生了某些事情,那么您现在的数据库副本为零

备份非常简单,可以保护您免受上述所有问题的影响。

BACKUP DATABASE dbname TO DISK = 'C:\whatever\dbname.bak'
  WITH COPY_ONLY, INIT, COMPRESSION;
Run Code Online (Sandbox Code Playgroud)

恢复同样容易,但如果文件结构不同,您可能需要使用WITH MOVE参数。这种努力是值得的。

RESTORE DATABASE dbname FROM DISK = 'C:\whatever\dbname.bak'
  WITH MOVE 'dbname_data' TO 'C:\...\dbname.mdf',
       MOVE 'dbname_log'  TO 'C:\...\dbname.ldf';
Run Code Online (Sandbox Code Playgroud)

  • @magos 所以也许你应该*为他们安排适当的备份*,这样他们就不会依赖于在他们认为这样做时关闭服务来进行“备份”。 (3认同)

Rem*_*anu 2

应该没问题。毕竟,这就是恢复的全部目标,在任何突然的中断中幸存下来。实例关闭实际上是一个相当优雅的关闭,将正确关闭所有数据库(恢复时应该没有待回滚的 xact)。

但其要点是你正在使用大锤打破蛋壳。使用“BACKUP FULL AND COPY ONLY/RESTORE”进行复制更快、更安全。即使是文件复制也可以更有效地实现,只需将数据库设置为脱机,文件就可以复制,然后将数据库重新联机。

关于覆盖目的地,存在一些潜在的问题。显然,它确实有效,毕竟您的团队一直在做...但是您可以发现实例从主目录中的数据中了解数据库的内容与数据库本身在其启动页面中声明的内容之间存在差异(例如例如 service_broker_id 或兼容性级别)。这些问题都可以解决,但是仅仅了解问题所在就会遇到问题。基本上,为什么数据库在生产中以一种方式运行,而在支持中以另一种方式运行。再说一遍,根本没有理由进入这个灰色地带。使用BACKUP/RESTORE,更安全、更快捷。