移动用户数据库

适用于:SQL Server

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

注意

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

注意事项

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

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

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

从 SQL Server 2008 R2 (10.50.x) 开始,全文目录已集成到数据库中,而不是存储在文件系统中。 现在移动数据库时将自动移动全文目录。

注意

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

计划的重定位过程

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

  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 代理或 SQL Server Browser 服务

  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 实例。

    • 对于默认的 (MSSQLSERVER) 实例,请运行以下命令。

      NET START MSSQLSERVER /f /T3608  
      
    • 对于命名实例,请运行以下命令。

      NET START MSSQL$instancename /f /T3608  
      

    有关详细信息,请参阅 启动、停止、暂停、继续、重启 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 日志文件移动到一个新位置,作为计划的重定位的一部分。

USE master;  
GO  
-- Return the logical file name.  
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  
ALTER DATABASE AdventureWorks2022 SET OFFLINE;  
GO  
-- Physically move the file to a new location.  
-- In the following statement, modify the path specified in FILENAME to  
-- the new location of the file on your server.  
ALTER DATABASE AdventureWorks2022   
    MODIFY FILE ( NAME = AdventureWorks2022_Log,   
                  FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');  
GO  
ALTER DATABASE AdventureWorks2022 SET ONLINE;  
GO  
--Verify the new location.  
SELECT name, physical_name AS CurrentLocation, state_desc  
FROM sys.master_files  
WHERE database_id = DB_ID(N'AdventureWorks2022')  
    AND type_desc = N'LOG';  

另请参阅