附加数据库

适用于: SQL Server

本文介绍了解如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中附加数据库。 可以使用此功能来复制、移动或升级 SQL Server 数据库。

限制和局限

有关限制和局限的列表,请参阅 数据库分离和附加 (SQL Server)

先决条件

继续之前,请查看以下所有先决条件:

  • 如果要将数据库从一个实例移到另一个实例,则必须先将数据库与任何现有 SQL 实例分离。 如果尝试附加未分离的数据库,会返回错误。 有关详细信息,请参阅 分离数据库

  • 附加数据库时,数据库的所有数据文件都必须可用。 通常,对于数据文件,这些文件的扩展名为 .mdf 或 ndf;对于事务日志文件,则扩展名为 .ldf。 此外,FILESTREAM 数据的任何文件组都必须存在并且可用。 若要详细了解如何附加启用了 FILESTREAM 的数据库,请参阅移动启用了 FILESTREAM 的数据库

  • 如果任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。

  • 数据库引擎服务帐户必须具有读取其新位置中的文件的权限。

  • 如果在你附加数据库时,MDF 和 LDF 文件位于不同目录,并且其中一条路径包含 \\?\GlobalRoot,则该操作将失败。

“附加”是最佳选择吗?

建议在移动同一实例中的数据库文件时,使用 ALTER DATABASE 计划重定位过程(而不是分离再附加)来移动实例中的数据库。 有关详细信息,请参阅 Move User Databases

对于备份和还原,建议不要使用分离再附加操作。 分离要从 SQL Server 外部备份的文件时,没有事务日志备份或时间点还原可用。

安全性

文件访问权限是在很多数据库操作过程中设置的,包括在分离和附加数据库时。 分离或附加数据库时,数据库引擎会尝试模拟执行该操作的连接的 Windows 帐户,从而保证该帐户具有访问数据库和日志文件的权限。 对于使用 SQL Server 登录名的混合安全帐户来说,该模拟可能会失败。

下表显示了完成附加或分离操作后为数据库和日志文件设置的权限,以及数据库引擎是否可以模拟连接帐户。

操作 可以模拟连接帐户 将文件权限授予给
分离 仅执行操作的帐户。 如果分离数据库后需要添加帐户,可由操作系统管理员添加附加帐户。
分离 本地 Windows 管理员组的 SQL Server (MSSQLSERVER) 服务帐户和成员。
Attach 本地 Windows 管理员组的 SQL Server (MSSQLSERVER) 服务帐户和成员。
Attach SQL Server (MSSQLSERVER) 服务帐户。

若要详细了解授予 SQL Server 服务的每个服务 SID 的文件系统权限,请参阅为数据库引擎访问配置文件系统权限

注意

不建议附加或还原来自未知或不受信任的源的数据库。 此类数据库可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构或物理数据库结构导致错误。 使用来自未知源或不可信源的数据库前,请在非生产服务器上针对数据库运行 DBCC CHECKDB ,然后检查数据库中的代码,例如存储过程或其他用户定义代码。 有关附加数据库的详细信息以及在附加数据库时对元数据进行的更改的信息,请参阅 数据库分离和附加 (SQL Server)

权限

需要 CREATE DATABASECREATE ANY DATABASEALTER ANY DATABASE 权限。

使用 SQL Server Management Studio (SSMS)

移动数据库之前

如果要移动数据库,请在将它与其现有 SQL Server 实例分离之前,使用“数据库属性”页查看与数据库关联的文件及其当前位置。

  1. 在 SQL Server Management Studio 对象资源管理器中,连接到 SQL Server 数据库引擎 实例,再展开该实例。

  2. 展开 “数据库”,并选择要分离的用户数据库的名称。

  3. 右键单击数据库名称,并选择“属性”。 选择“文件”页,并查看“数据库文件:”表中的条目。

分离、移动和附加之前,请务必考虑与数据库关联的所有文件。 然后,继续执行下一部分中的分离、文件复制和附加数据库步骤。 有关详细信息,请参阅 分离数据库

附加数据库

  1. 在 SQL Server Management Studio 对象资源管理器中,连接到一个 SQL Server 数据库引擎实例,然后在 SSMS 中选择展开该实例视图

  2. 右键单击“数据库”,然后选择“附加”。

  3. 在“附加数据库”对话框中,若要指定要附加的数据库,请选择“添加”。 在“定位数据库文件”对话框中,选择数据库所在的位置,然后展开目录树来查找数据库的 .mdf 文件并将其选中,例如:

    C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_Data.mdf

    重要

    尝试选择已附加的数据库将生成错误。

    “要附加的数据库”
    显示所选数据库的有关信息。

    <无列标题>
    显示一个图标,用以指示附加操作的状态。 “状态”说明中介绍可能的图标。

    MDF 文件位置
    显示选定 MDF 文件的路径和文件名。

    Database Name
    显示数据库的名称。

    附加为
    根据需要,可以指定要附加数据库的其他名称。

    所有者
    提供数据库可能所有者的下拉列表,您可以根据需要从其中选择其他所有者。

    Status
    显示下表中相应的数据库状态:

    图标 状态文本 说明
    (无图标) (无文本) 此对象的附加操作尚未启动或者可能挂起。 这是打开该对话框时的默认值。
    绿色的右向三角形 正在进行 已启动附加操作,但是该操作未完成。
    绿色的选中标记 成功 已成功附加该对象。
    包含白色十字形的红色圆圈 错误 附加操作遇到错误,未成功完成。
    包含左、右两个黑色象限和上、下两个白色象限的圆圈 已停止 由于你停止了附加操作,该操作未成功完成。
    包含一个指向逆时针方向的曲线箭头的圆圈 已回滚 附加操作已成功,但已对其进行回滚,因为在附加其他对象的过程中出现了错误。

    消息
    显示空消息或“找不到文件”超链接。

    添加
    查找必需的主数据库文件。 选择 .mdf 文件时,就会在“要附加的数据库”网格的相应字段中自动填充合适的信息。

    删除
    “要附加的数据库” 网格中删除选定文件。

    <database_name> ”数据库详细信息
    显示要附加的文件的名称。 若要验证或更改文件的路径名,请选择“浏览”按钮 (…)。

    注意

    如果文件不存在,消息列将显示“找不到”。如果未找到日志文件,则该文件位于另一个目录中或已被删除。 您需要更新 “数据库详细信息” 网格中该文件的路径使其指向正确的位置,或者从网格中删除该日志文件。 如果找不到 .ndf 数据文件,则需要更新网格中该文件的路径使其指向正确的位置。

    原始文件名
    显示属于数据库的已附加文件的名称。

    文件类型
    指示文件类型,即 “数据”“日志”

    当前文件路径
    显示所选数据库文件的路径。 可以手动编辑该路径。

    消息
    显示空消息或“找不到文件”超链接。

使用 Transact-SQL

移动数据库之前

如果要移动数据库,请在将它与其现有 SQL Server 实例分离之前,使用 sys.database_files 系统目录视图查看与数据库关联的文件及其当前位置。 有关详细信息,请参阅 sys.database_files (Transact-SQL)

  1. 在 SQL Server Management Studio 中,选择“新建查询”以打开查询编辑器

  2. 将以下 Transact-SQL 脚本复制到查询编辑器中,然后选择“执行”。 此脚本显示物理数据库文件的位置。 通过分离/附加来移动数据库时,请务必考虑所有文件。

    USE [database_name] 
    GO  
    SELECT type_desc, name, physical_name from sys.database_files;
    

分离、移动和附加之前,请务必考虑与数据库关联的所有文件。 然后,继续执行下一部分中的分离、文件复制和附加数据库步骤。 有关详细信息,请参阅 分离数据库

附加数据库

  1. 连接到 数据库引擎。

  2. 在标准栏上,选择“新建查询”。

  3. 使用带 FOR ATTACH 子句的 CREATE DATABASE 语句。

    将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例会附加 AdventureWorks2022 数据库的所有文件,并将该数据库重命名为 MyAdventureWorks

    CREATE DATABASE MyAdventureWorks   
        ON (FILENAME = 'C:\MySQLServer\AdventureWorks_Data.mdf'),   
        (FILENAME = 'C:\MySQLServer\AdventureWorks_Log.ldf')   
        FOR ATTACH;  
    

    你的数据库可能有其他数据文件(通常是 .mdf 或 .ndf),并且需要在 CREATE DATABASE ... FOR ATTACH 语句中包含其他文件。 此外,还必须在语句中包含 FILESTREAM 数据的任何文件组。 若要详细了解如何附加启用了 FILESTREAM 的数据库,请参阅移动启用了 FILESTREAM 的数据库

    注意

    或者,你可以使用 sp_attach_dbsp_attach_single_file_db 存储过程。 但是,Microsoft SQL Server 的未来版本将移除这些存储过程。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 建议改用 CREATE DATABASE ... FOR ATTACH

升级 SQL Server 数据库之后

数据库兼容性级别

在使用附加方法升级数据库后,该数据库将变为可用。 数据库将自动升级到新实例的内部版本级别。 如果数据库具有全文检索,升级过程将导入、重置或重新生成它们,具体取决于 全文升级选项 服务器属性的设置。 如果将升级选项设置为“导入”或“重新生成”,在升级过程中无法使用全文检索。 导入可能需要数小时,而重新生成所需的时间最多可能十倍于此,具体取决于要编制索引的数据量。 另请注意,当升级选项设置为“导入”时,如果全文目录不可用,将重新生成关联的全文检索。

升级后,数据库兼容性级别将保持在升级前的兼容性级别,除非新版本不支持以前的兼容性级别。 在这种情况下,升级后的数据库兼容性级别将设置为支持的最低兼容性级别。 例如,假设附加兼容性级别为 90 的数据库,然后将其附加到 SQL Server 2019 (15.x) 的实例,则在升级后,兼容性级别设置为 100,这是 SQL Server 2019 (15.x) 中支持的最低兼容性级别。 有关详细信息,请参阅 ALTER DATABASE 兼容性级别 (Transact-SQL)

变更数据捕获 (CDC)

如果从启用了变更数据捕获 (CDC) 的 SQL Server 2014 (12.x) 或更低版本的实例附加数据库,也需执行以下命令来升级变更数据捕获 (CDC) 元数据:

USE <database name>
EXEC sys.sp_cdc_vupgrade  

有关详细信息,请参阅将启用了 CDC 的数据库附加到 Windows 上的 SQL Server 2016 或 SQL Server 2017 的实例时出错

另请参阅

后续步骤