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


32

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

  • 附加或分离数据库是什么意思?
  • 如何分离数据库?
  • 如何附加数据库?
    • 附加并重建日志是什么意思?
  • 如何在SQL Server Express中做到这一点?
  • 我什么时候可以考虑拆装?
  • 有任何风险或警告吗?
  • 在SQL Server的版本之间附加附件该怎么办?(企业标准?2000到2008?2012到2008?)

Answers:


33

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

我们将从分离开始。在SQL Server中分离数据库时,您使数据库脱机并将其从要分离数据库的SQL Server实例中删除。数据库数据和日志文件保持原样,并保持一致状态,因此您可以在以后将数据库附加到另一个SQL Server实例。附加将已正确分离(或从完全关闭的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

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

  • @skipchecks-可接受的输入为'True''False'如果为'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 

您还可以在在线书籍中查看有关“ 创建数据库”语句的更多信息。

如何在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 Server2012。不能使用SQL Server 2000到SQL Server 2012)。您根本无法通过备份/还原或分离/附加来回退-您必须编写对象脚本并编写插入脚本,然后手动执行此操作或使用执行此操作的工具执行。对于版本,通常可以在SQL Server的主要SKU之间移动-例如,您可以将数据库从标准移动到企业,而无需进行额外的工作。但是,如果您使用的是企业功能(说,压缩或分区),则需要先禁用这些功能。您可以了解自己的功能


@Mike-定期分离和附加数据库会对性能产生影响吗?我想象对于任何分离的数据库(显然),缓冲区缓存都是无效的,但是您知道其他影响吗?
Max Vernon

我有一个数据库,当我停止SQL Server实例并复制3个文件,然后将它们附加到另一个实例上时,该数据库进入恢复状态(在同一数据库上两次发生于我身上)。根据您的描述,这应该不会发生,那么我应该对我的数据库产生什么怀疑?它以某种方式损坏了吗?备份需要花费大量时间来创建和还原,此功能可以节省生命!至少出于开发人员数据库共享的目的……
NoOne 2014年
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.