分离数据库和附加数据库

更新日期: 2006 年 12 月 12 日

可以分离数据库的数据和事务日志文件,然后将它们重新附加到同一或其他 SQL Server 实例。如果要将数据库更改到同一计算机的不同 SQL Server 实例或要移动数据库,分离和附加数据库会很有用。

ms190794.note(zh-cn,SQL.90).gif注意:
在 64 位和 32 位环境中,SQL Server 磁盘存储格式均相同。因此,可以将 32 位环境中的数据库附加到 64 位环境中,反之亦然。从运行在某个环境中的服务器实例上分离的数据库可以附加到运行在另一个环境中的服务器实例。
ms190794.note(zh-cn,SQL.90).gif注意:
有关分离或附加数据库时设置的文件权限的信息,请参阅保护数据和日志文件的安全

分离数据库

分离数据库是指将数据库从 SQL Server 实例中删除,但使数据库在其数据文件和事务日志文件中保持不变。之后,就可以使用这些文件将数据库附加到任何 SQL Server 实例,包括分离该数据库的服务器。

如果存在下列任何情况,则不能分离数据库:

  • 已复制并发布数据库。如果进行复制,则数据库必须是未发布的。必须通过运行 sp_replicationdboption 禁用发布后,才能分离数据库。
    ms190794.note(zh-cn,SQL.90).gif注意:
    如果无法使用 sp_replicationdboption,可以通过运行 sp_removedbreplication 删除复制。
  • 数据库中存在数据库快照。
    必须首先删除所有数据库快照,然后才能分离数据库。有关详细信息,请参阅如何删除数据库快照 (Transact-SQL)
    ms190794.note(zh-cn,SQL.90).gif注意:
    不能分离或附加数据库快照。
  • 该数据库正在某个数据库镜像会话中进行镜像。
    除非终止该会话,否则无法分离该数据库。有关详细信息,请参阅删除数据库镜像
  • 数据库处于可疑状态。在 SQL Server 2005 中,无法分离可疑数据库;必须将数据库置入紧急模式,才能对其进行分离。有关如何将数据库置入紧急模式的详细信息,请参阅 ALTER DATABASE (Transact-SQL)
  • 该数据库是系统数据库。

分离数据库的操作将清除 SQL Server 实例的计划缓存。清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。在 SQL Server 2005 Service Pack 2 中,对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志包含以下信息性消息:“由于某些数据库维护或重新配置操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新”。只要每五分钟刷新一次缓存,此消息就将每五分钟记录一次。

分离数据库

备份、还原及分离

分离只读数据库将会丢失有关差异备份的差异基准的信息。有关详细信息,请参阅备份只读数据库

响应分离错误

分离数据库时生成的错误会阻止完全关闭数据库和重新生成事务日志。收到错误消息后,请执行下列更正操作:

  1. 重新附加与数据库关联的所有文件,而不仅仅是主文件。
  2. 解决导致生成错误消息的问题。
  3. 再次分离数据库。

附加数据库

您可以附加复制的或分离的 SQL Server 数据库。在 SQL Server 2005 中,数据库包含的全文文件随数据库一起附加。有关详细信息,请参阅附加和分离全文目录

ms190794.security(zh-cn,SQL.90).gif安全说明:
建议您不要附加或还原未知或不可信源中的数据库。此类数据库可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构或物理数据库结构导致错误。在使用未知或不可信源中的数据库之前,请在非生产服务器上的数据库中运行 DBCC CHECKDB,同时检查数据库中的代码(例如,存储过程或其他用户定义代码)。

附加时,数据库会启动。通常,附加数据库时会将数据库重置为它分离或复制时的状态。不过,在 SQL Server 2005 中,分离和附加操作都将禁用数据库的跨数据库所有权链接。有关如何启用链接的信息,请参阅 cross db ownership chaining 选项。此外,附加数据库时,TRUSTWORTHY 均设置为 OFF。有关如何将 TRUSTWORTHY 设置为 ON 的信息,请参阅 ALTER DATABASE (Transact-SQL)

附加数据库时,所有数据文件(MDF 文件和 NDF 文件)都必须可用。如果任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。

ms190794.note(zh-cn,SQL.90).gif注意:
如果附加的主数据文件是只读的,则数据库引擎假定数据库也是只读的。

当加密的数据库首次附加到 SQL Server 实例时,数据库所有者必须通过执行下面的语句打开数据库的主密钥:OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'。建议您通过执行下面的语句对主密钥启用自动解密:ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY。有关详细信息,请参阅 CREATE MASTER KEY (Transact-SQL)ALTER MASTER KEY (Transact-SQL)

附加日志文件的要求在某些方面取决于数据库是读写的还是只读的,如下所示:

  • 对于读写数据库,通常可以附加新位置中的日志文件。不过,在某些情况下,重新附加数据库需要使用其现有的日志文件。因此,请务必保留所有分离的日志文件,直到在不需要这些日志文件的情况下成功附加了数据库。
    如果读写数据库具有单个日志文件,并且您没有为该日志文件指定新位置,附加操作将在旧位置中查找该文件。如果找到了旧日志文件,则无论数据库上次是否完全关闭,都将使用该文件。但是,如果未找到旧文件日志,数据库上次是完全关闭且现在没有活动日志链,则附加操作将尝试为数据库创建新的日志文件。有关详细信息,请参阅了解事务日志体系结构
  • 如果附加的主数据文件是只读的,则数据库引擎假定数据库也是只读的。对于只读数据库,日志文件在数据库主文件中指定的位置上必须可用。因为 SQL Server 无法更新主文件中存储的日志位置,所以无法创建新的日志文件。
    ms190794.note(zh-cn,SQL.90).gif重要提示:
    分离再重新附加只读数据库后,会丢失差异基准信息。这会导致 master 数据库与只读数据库不同步。之后所做的差异备份可能导致意外结果。因此,如果对只读数据库使用差异备份,在重新附加数据库后,应通过进行完整备份来建立当前差异基准。

备份、还原及附加

与任何完全或部分离线的数据库一样,不能附加正在还原文件的数据库。如果停止了还原顺序,则可以附加数据库。然后,可以重新启动还原顺序。

将数据库附加到其他服务器实例

将数据库附加到其他服务器实例时,为了给用户和应用程序提供一致的体验,您最好在其他服务器实例上为数据库重新创建部分或全部元数据(例如登录名和作业)。有关详细信息,请参阅当数据库在其他服务器实例上可用时管理元数据

ms190794.note(zh-cn,SQL.90).gif注意:
无法在较早版本的 SQL Server 中附加较新版本的 SQL Server 创建的数据库。
ms190794.note(zh-cn,SQL.90).gif注意:
使用 vardecimal 存储格式时,可正常进行附加操作。但必须将每个数据库引擎至少升级到 SQL Server 2005 Service Pack 2,并且必须对所有相关数据库启用 vardecimal 存储格式。例如,无法将启用了 vardecimal 存储格式的 Service Pack 2 数据库附加到 SQL Server 的较早版本。有关 vardecimal 存储格式的详细信息,请参阅将 Decimal 数据存储为可变长度类型

附加数据库

从 SQL Server 的早期版本升级数据库

在 SQL Server 2005 中,可以使用分离和附加操作将用户数据库从 SQL Server 7.0 或 SQL Server 2000 升级到更高版本。但是,存在下列限制:

  • 使用 SQL Server 7.0 或 SQL Server 2000 创建的 mastermodelmsdb 数据库的副本不能附加到 SQL Server 2005 中。
  • 包含创建索引操作的 SQL Server 7.0 日志文件不能附加到 SQL Server 2000 或 SQL Server 2005 中。
  • 如果附加复制的而不是分离的重复数据库:
    • 如果将该数据库附加到同一服务器实例的升级版本中,必须在附加操作完成后执行 sp_vupgrade_replication 来升级复制数据库。有关详细信息,请参阅sp_vupgrade_replication (Transact-SQL)
    • 如果您将数据库附加到不同的服务器实例,而不考虑版本,则必须执行 sp_removedbreplication 才能在附加操作完成后删除复制。有关详细信息,请参阅sp_removedbreplication (Transact-SQL)

使用分离和附加操作升级数据库

移动数据库或数据库文件

ms190794.note(zh-cn,SQL.90).gif重要提示:
建议您使用 ALTER DATABASE 计划重定位过程(而不使用分离和附加操作)移动数据库。有关详细信息,请参阅移动数据库文件

通常,您可以使用分离和附加操作移动数据库。典型方案包括将数据库移动到下列位置之一:

  • 相同计算机上的不同物理磁盘。例如,当包含数据文件的磁盘空间不足,并且您希望展开现有文件(而不是通过在不同磁盘上添加新文件来展开数据库)。
  • 其他计算机;不必重新创建数据库和还原数据库备份。

使用分离和附加操作移动数据库分为以下阶段:

  1. 分离数据库。
  2. 将数据库文件移到其他服务器或磁盘上。
  3. 通过指定移动文件的新位置附加数据库。

使用分离和附加操作移动数据库

请参阅

概念

分离数据库和附加数据库
保护数据和日志文件的安全
了解文件和文件组

其他资源

CREATE DATABASE (Transact-SQL)
sp_detach_db (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

新增内容:
  • 添加了在 64 位和 32 位环境中 SQL Server 磁盘存储格式均相同的说明。
  • 在“将数据库附加到其他服务器实例”部分添加了说明。
  • 添加了有关 vardecimal 存储格式的说明。

2006 年 7 月 17 日

新增内容:
  • 向“分离数据库”部分添加了有关清除计划缓存的信息。

2006 年 7 月 17 日

新增内容:
  • 添加了对分离系统数据库的限制。
  • 添加了“备份、还原及分离”部分。
  • 添加了“备份、还原及附加”部分。

2005 年 12 月 5 日

新增内容:
  • 添加了安全说明。