移动用户数据库

在 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 开始,全文目录集成到数据库中,而不是存储在文件系统中。 在移动数据库时,全文目录现在会自动移动。

计划中的重定位程序

若要在计划的重定位过程中移动数据或日志文件,请执行以下步骤:

  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 实例或关闭系统以执行维护。 有关详细信息,请参阅 “启动”、“停止”、“暂停”、“恢复”、“重启数据库引擎”、“SQL Server 代理”或“SQL Server 浏览器服务”。

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

  4. 重启 SQL Server 或服务器的实例。 有关详细信息,请参阅 “启动”、“停止”、“暂停”、“恢复”、“重启数据库引擎”、“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. 在命令提示符处输入以下命令之一,在仅主恢复模式下启动 SQL Server 实例。

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

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

      NET START MSSQL$instancename /f /T3608  
      

    有关详细信息,请参阅 “启动”、“停止”、“暂停”、“恢复”、“重启数据库引擎”、“SQL Server 代理”或“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>');  
    

例子

以下示例将 AdventureWorks2012 日志文件移动到计划搬迁过程中的新位置。

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

另请参阅

ALTER DATABASE(Transact-SQL)
CREATE DATABASE (SQL Server Transact-SQL)
数据库分离和附加 (SQL Server)
移动系统数据库
移动数据库文件
BACKUP (Transact-SQL)
RESTORE (Transact-SQL)
启动、停止、暂停、继续、重新启动数据库引擎、SQL Server 代理或 SQL Server Browser 服务