数据库拆分与附接(SQL Server)

可以分离数据库的数据和事务日志文件,然后将其重新附加到 SQL Server 的相同或另一个实例。 如果要将数据库更改为同一计算机上的其他 SQL Server 实例或移动数据库,则分离和附加数据库非常有用。

磁盘上的 SQL Server 存储格式在 64 位和 32 位环境中是相同的。 因此,附加适用于 32 位和 64 位环境。 从一个环境中运行的服务器实例分离的数据库可以附加到在另一个环境中运行的服务器实例上。

安全

文件访问权限是在多个数据库操作期间进行设置的,包括分离或附加数据库。

重要

建议不要从未知或不受信任的源附加或还原数据库。 此类数据库可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构或物理数据库结构导致错误。 在从未知或不受信任的源使用数据库之前,请在非生产服务器上对数据库运行 DBCC CHECKDB ,并在数据库中检查代码,例如存储过程或其他用户定义的代码。

分离数据库

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

如果存在以下任一情况,则无法分离数据库:

  • 数据库已被复制并发布。 如果复制,则必须取消发布数据库。 在分离之前,必须通过运行 sp_replicationdboption来禁用发布。

    注释

    如果无法使用 sp_replicationdboption,可以通过运行 sp_removedbreplication来删除复制。

  • 数据库中存在数据库快照。

    在分离数据库之前,必须删除其所有快照。 有关详细信息,请参阅删除数据库快照(Transact-SQL)。

    注释

    无法分离或附加数据库快照。

  • 数据库正在数据库镜像会话中镜像。

    除非会话终止,否则无法分离数据库。 有关详细信息,请参阅“删除数据库镜像”(SQL Server)。

  • 数据库可疑。 无法分离可疑数据库;必须先将其置于紧急模式,然后才能将其分离。 有关如何将数据库置于紧急模式的详细信息,请参阅 ALTER DATABASE (Transact-SQL)

  • 数据库是系统数据库。

备份、还原和分离

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

响应分离错误

分离数据库时生成的错误可能会阻止数据库完全关闭,并重新生成事务日志。 如果收到错误消息,请执行以下步骤:

  1. 重新附加与数据库关联的所有文件,而不仅仅是主文件。

  2. 解决导致错误消息的问题。

  3. 再次分离数据库。

附加数据库

可以附加复制或分离的 SQL Server 数据库。 将 SQL Server 2014 服务器实例附加时,目录文件以及其他数据库文件将从其先前的位置附加,与 SQL Server 2005 中的情况相同。 有关详细信息,请参阅 全文搜索升级

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

注释

如果附加的主数据文件是只读的,则数据库引擎假定数据库是只读的。

当一个加密数据库首次附加到 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 无法更新存储在主文件中的日志位置。

附加数据库的元数据更改

分离并重新附加只读数据库时,有关当前差异基础的备份信息将丢失。 差异备份基准是数据库中所有数据或数据库文件或文件组子集的最近完整备份。 如果没有基本备份信息,主数据库会与只读数据库不同步,因此之后进行的差异备份可能会产生意外结果。 因此,如果将差异备份用于只读数据库,则应在重新附加数据库后进行完整备份来建立新的差异基础。 有关差异备份的信息,请参阅差异备份(SQL Server)。

附加时,将发生数据库启动。 通常,附加数据库会使其处于分离或复制时所在的相同状态。 但是,附加和分离操作都会禁用数据库的跨数据库所有权链。 有关如何启用链结的信息,请参阅 跨数据库所有权链结服务器配置选项。 此外,每当附加数据库时,TRUSTWORTHY 都设置为 OFF。 有关如何将 TRUSTWORTHY 设置为 ON 的信息,请参阅 ALTER DATABASE (Transact-SQL)

备份、还原与附加

与完全或部分脱机的任何数据库一样,无法附加还原文件的数据库。 如果停止还原序列,可以附加数据库。 然后,可以重启还原序列。

将数据库附加到另一个服务器实例

重要

无法在早期版本的 SQL Server 中附加由较新版本的 SQL Server 创建的数据库。

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

相关任务

分离数据库

附加数据库

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

通过分离和附加操作来迁移数据库

删除数据库快照

另请参阅

数据库文件和文件组