移动用户数据库

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

注意注意

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

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

注意注意

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

计划的重定位过程

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

  1. 运行以下语句。

    ALTER DATABASE database_name SET OFFLINE;
    
  2. 将文件移动到新位置。

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

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' );
    
  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 实例或关闭系统以执行维护。有关详细信息,请参阅停止服务

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

  4. 重新启动 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 实例。

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

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

      NET START MSSQL$instancename /f /T3608
      

    有关详细信息,请参阅如何启动 SQL Server 实例(net 命令)

  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>');
    

示例

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

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'AdventureWorks2008R2')
    AND type_desc = N'LOG';
GO
ALTER DATABASE AdventureWorks2008R2 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 AdventureWorks2008R2 
    MODIFY FILE ( NAME = AdventureWorks2008R2_Log, 
                  FILENAME = 'C:\NewLoc\AdventureWorks2008R2_Log.ldf');
GO
ALTER DATABASE AdventureWorks2008R2 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'AdventureWorks2008R2')
    AND type_desc = N'LOG';