如何在 SQL Server 中附加数据库?

Mik*_*lsh 32 sql-server

有关在 SQL Server 中附加数据库的一些常见问题:

  • 附加或分离数据库是什么意思?
  • 如何分离数据库?
  • 如何附加数据库?
    • 附加和重建日志是什么意思?
  • 如何在 SQL Server Express 中执行此操作?
  • 我什么时候可以考虑分离和附加?
  • 是否存在任何风险或警告?
  • 在 SQL Server 的版本和版本之间附加怎么样?(标准到企业?2000 年到 2008 年?2012 年到 2008 年?)

Mik*_*lsh 33

什么是分离或附加以及它们如何工作?

我们将从分离开始。在 SQL Server 中分离数据库时,您将数据库脱机并将其从要分离的 SQL Server 实例中删除。数据库数据和日志文件保持原样并保持一致状态,因此您可以稍后将数据库附加到另一个 SQL Server 实例。Attach将数据和日志文件从已正确分离(或从完全关闭的 SQL Server 实例复制)的数据库连接到 SQL Server 实例并使数据库联机。

如何分离数据库?

您可以在 T-SQL 中或从 SQL Server Management Studio GUI 中执行此操作。

在 GUI 中,右键单击要分离的数据库,选择All Tasks并单击Detach。从那里你会得到分离对话框。您可以选择首先断开连接以强制断开任何活动连接并回滚它们在执行过程中的工作。您还可以选择在分离之前更新统计信息。 分离通过 - 选择分离...

在 T-SQL 中:

-- You don't want to be in the database you are trying to detach
USE Master
GO

-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO
Run Code Online (Sandbox Code Playgroud)

对于系统存储过程 sp_detach_db,您可以选择传入两个参数:

  • @skipchecks- 可接受的输入是'True'or 'False'if 'True',SQL Server 将在分离前更新统计信息。如果 ' False',则不会。如果您未在此处指定任何内容,则统计信息将在 SQL Server 2005 或更高版本中更新。
    • @keepfulltextindexfile- 这里的默认值是'True'- 如果设置为 true,则在分离期间不会删除全文索引元数据。

看到了很多关于分离及以下我将强调的风险更多细节,联机丛书文章sp_detach_db是一个良好的开端。

如何附加数据库?

您也可以在 T-SQL 或 SQL Server Management Studio GUI 中执行此操作。

(注意:如果您的数据库中的数据和日志文件未正确分离,则您的附加可能无法工作。发生分离时,数据库将脱机,日志和数据文件将处于一致状态。这也当服务完全关闭时发生。

在 GUI 中,右键单击Databases实例的顶级文件夹并选择Attach。在下一个对话框中,您将选择要附加的数据库的主数据文件 (.MDF),并确保您选择了其他文件并指定了它们的适当位置,然后单击确定,附加您的数据库。

在 T-SQL 中,在 SQL Server 2005 中执行此操作的最佳方法是通过CREATE DATABASE命令。这是 SQL Server 2012 以外支持的方法。如果您想了解如何使用sp_attach_db,可以在有关[sp_attach_db][3][sp_attach_single_file_db][4]

当您有可用的日志文件和数据文件并且它们一致时,这就是 T-SQL 方法:

-- 使用创建数据库和 FOR ATTACH 子句进行附加

CREATE DATABASE DatabaseName 
    ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
    (FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
     (FILENAME = 'FilePath\SecondaryDataFile.ndf)  -- Optional - any secondary data files
    FOR ATTACH 
GO 
Run Code Online (Sandbox Code Playgroud)

您也可以在联机书籍中看到有关Create Database语句的更多信息。

如何在 SQL Server Express 中分离/附加?

其实是一样的。如果您使用的是 SQL Server Management Studio Express,则可以使用上述 GUI 中的分离/附加对话框,或者也可以通过上述 SSMS Express 使用 T-SQL 步骤。与 Express 没有区别。

如果你没有 SSMS Express,你可以下载它(这里是 SQL Server 2012 Express 版本)。

您可以进入SQLCMD会话并使用上述相同的 T-SQL 结构。

我什么时候应该考虑进行分离或附加?

首先要说明什么是分离和附加不打算用于:备份和恢复分离和附加不是为了日常恢复目的而备份数据库的方法。这种方式没有事务日志备份,它会将您的数据库置于数据库文件可能会被意外删除的状态,并且根本不是用于此目的的好方法。

也就是说,分离和附加适用于一些用例(并非详尽无遗,请随意编辑以添加或创建更多新答案):

  • 有时用于迁移(尽管我更喜欢备份/恢复,如我在此处的回答中所讨论的那样)
  • 当您想要删除不再活跃使用但可以根据需要稍后附加的数据库时。
  • 在某些故障排除情况下,这可能会被调用
  • 没有空间将数据和日志文件备份或恢复到另一个环境(你不应该在这里,但我有时用它在环境中移动开发数据库......不想要或不需要日志也附加/重建了日志文件)

风险和警告

同样,在线书籍在这里是一个很好的资源,但我会提出一些特定的注意事项,以便在分离或附加数据库时牢记 -

分离

  • 您正在使数据库脱机。将无法再访问。这应该是显而易见的,但值得一提。这就是为什么它不是一个很好的备份选项。
  • 当您的数据库联机时,SQL Server 会锁定文件。我不建议尝试这个来证明我错了,因为可能还有其他一些情况在起作用,但是当 SQL Server 在线时,您通常无法删除数据库文件(数据、辅助数据或日志文件)。这是一件好事。当你分离时,你就没有这样的保护——这可能是一件坏事。
  • 如果您正在处理数据库损坏问题,并且您在某处找到了一些具有分离第一步的文章 -这是错误的- 如果您分离损坏的数据库,可能就是这样。您可能不会再次附加该数据库。
  • 在整个网络中剪切和粘贴生产数据库文件是一种可能引入文件级损坏的方法。我在进行迁移时更喜欢备份/恢复的另一个原因。
  • 这可能会导致维护计划失败。情况是,您和我一样设置了维护计划,以便在不检查最佳实践的情况下对所有数据库进行定期备份。这很好用,所以你不要再去想它了。然后其他人决定离线使用他们没有使用的数据库。从那时起,维护计划将失败,直到您通过选中“数据库”对话框中的“忽略状态不在线的数据库”选项来修改维护计划。请注意,它不仅会因离线数据库而失败 - 维护计划将在尝试备份离线数据库时失败并出现错误,因此某些在线数据库可能无法备份。(针对这一点的不同作者,因此请持怀疑态度)

附加 - 就像您不应该从 Internet 运行脚本或在机场接受陌生人的包裹一样,您也不应该在没有经过验证的步骤的情况下附加从其他人那里获得的数据库。该数据库可能在触发器、存储过程等中包含代码,这可能会危害您的环境。您应该在安全的防火墙环境中查看要附加的数据库,而不是您的生产系统。

不同版本的 SQL Server 怎么样?

这些与在版本之间恢复数据库的规则没有什么不同。您通常最多可以恢复到 3 个版本的下一个版本(例如,SQL Server 2008 到 SQL Server 2012 可以使用。SQL Server 2000 到 SQL Server 2012 则不行)。您根本无法通过备份/恢复或分离/附加来倒退 - 您必须编写对象脚本并编写插入脚本,然后手动或使用执行此操作的工具来完成。对于版本,您通常可以在 SQL Server 的主要 SKU 之间移动 - 例如,您可以将数据库从 Standard 移动到 Enterprise,而无需额外工作。但是,如果您正在使用企业功能(例如,压缩或分区),则需要在移动之前禁用这些功能。您可以了解您的功能