移动用户数据库

适用范围:SQL Server

在 SQL Server 中,通过在 ALTER DATABASE 语句的 FILENAME 子句中指定新的文件位置,可以将用户数据库中的数据、日志和全文目录文件移动到新位置。 此方法适用于在同一 SQL Server 实例中移动数据库文件。 若要将数据库移动到另一个 SQL Server 实例或另一台服务器上,请使用备份和还原分离和附加操作。

注意

本文介绍如何移动用户数据库文件。 要移动系统数据库文件,请参阅移动系统数据库

注意事项

将数据库移动到另一个服务器实例上时,若要为用户和应用程序提供一致的体验,可能需要为数据库重新创建部分或全部元数据。 有关元数据的详细信息,请参阅使数据库在其他服务器上可用时管理元数据

SQL Server 数据库引擎的某些功能改变了数据库引擎在数据库文件中存储信息的方式。 这些功能仅限于特定 SQL Server 版本。 不能将包含这些功能的数据库移到不支持这些功能的 SQL Server 版本。 使用 sys.dm_db_persisted_sku_features 动态管理视图可列出当前数据库中启用的所有特定于版本的功能。

本文中的过程需要数据库文件的逻辑名称。 若要获取该名称,请在 sys.master_files 目录视图中查询名称列。

全文目录已集成到数据库中,而不是存储在文件系统中。 移动数据库时将自动移动全文目录。

注意

确保配置 Windows 服务帐户和权限的服务帐户对文件系统中的新文件位置具有权限。 有关更多信息,请参阅配置数据库引擎访问的文件系统权限

计划的重定位过程

若要将移动数据或日志文件作为计划的重定位的一部分,请执行下列步骤:

  1. 对于要移动的每个文件,请运行以下语句。

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    
  2. 运行以下语句以使数据库脱机。

    ALTER DATABASE database_name
        SET OFFLINE;
    

    此操作需要对数据库有独占访问权限。 如果打开了与数据库的另一个连接,则在所有连接都关闭之前,将阻止 ALTER DATABASE 语句。 若要替代此行为,请使用 WITH <termination> 子句。 例如,若要自动回滚并断开与数据库的所有其他连接,请使用:

    ALTER DATABASE database_name
         SET OFFLINE
         WITH ROLLBACK IMMEDIATE;
    
  3. 将文件移动到新位置。

  4. 运行以下语句。

    ALTER DATABASE database_name
        SET ONLINE;
    
  5. 通过运行以下查询来验证文件更改。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

计划的磁盘维护的重定位

若要将重定位文件作为计划的磁盘维护过程的一部分,请执行下列步骤:

  1. 对于要移动的每个文件,请运行以下语句。

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    
  2. 要执行维护,停止 SQL Server 实例或关闭系统。 有关详细信息,请参阅启动、停止、暂停、继续和重启 SQL Server 服务

  3. 将文件移动到新位置。

  4. 重启 SQL Server 实例或服务器。 有关详细信息,请参阅启动、停止、暂停、继续和重启 SQL Server 服务

  5. 通过运行以下查询来验证文件更改。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

故障恢复过程

如果由于硬件故障而必须移动文件,则请执行下列步骤,将文件重新定位到一个新位置。

重要

如果数据库无法启动,即处于可疑模式或处于未恢复状态,则只有 sysadmin 固定角色的成员才可以移动该文件。

  1. 如果 SQL Server 实例已启动,请将其停止。

  2. 通过在命令提示符下输入下列命令之一,在仅 master 恢复模式下启动 SQL Server 实例。

  3. 对于要移动的每个文件,请使用 sqlcmd 命令或 SQL Server Management Studio 运行以下语句。

    ALTER DATABASE database_name
        MODIFY FILE (NAME = logical_name, FILENAME = 'new_path\os_file_name');
    

    有关如何使用 sqlcmd 实用工具的详细信息,请参阅 sqlcmd – 使用实用工具

  4. 退出 sqlcmd 实用工具或 SQL Server Management Studio。

  5. 停止 SQL Server 实例。

  6. 将文件移动到新位置。

  7. 启动 SQL Server 实例。 例如,运行 NET START MSSQLSERVER

  8. 通过运行以下查询来验证文件更改。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

示例

下面的示例将 AdventureWorks2022 日志文件移动到一个新位置,作为计划的重定位的一部分。

  1. 请确保处于 master 数据库的上下文中。

    USE master;
    GO
    
  2. 返回逻辑文件名称。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';
    GO
    
  3. 将数据库设为脱机状态。

    ALTER DATABASE AdventureWorks2022
        SET OFFLINE;
    GO
    
  4. 以物理方式将文件移动到新位置。 在以下语句中,将 FILENAME 中指定的路径修改为服务器上文件的新位置。

    ALTER DATABASE AdventureWorks2022
        MODIFY FILE (NAME = AdventureWorks2022_Log, FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');
    GO
    
    ALTER DATABASE AdventureWorks2022
        SET ONLINE;
    GO
    
  5. 验证新位置。

    SELECT name,
           physical_name AS CurrentLocation,
           state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'AdventureWorks2022')
          AND type_desc = N'LOG';