Categories
跨服战场

适用范围:SQL Server

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

注意

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

注意事项

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

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

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

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

注意

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

计划迁移流程

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

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

ALTER DATABASE database_name

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

运行以下语句以使数据库脱机。

ALTER DATABASE database_name

SET OFFLINE;

此操作需要对数据库有独占访问权限。 如果数据库上还有其他连接处于打开状态,则 ALTER DATABASE 语句将被阻塞,直到所有连接关闭为止。 若要替代此行为,请使用 WITH 子句。 例如,若要自动回滚并断开与数据库的所有其他连接,请使用:

ALTER DATABASE database_name

SET OFFLINE

WITH ROLLBACK IMMEDIATE;

将文件移动到新位置。

运行以下语句。

ALTER DATABASE database_name

SET ONLINE;

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

SELECT name,

physical_name AS CurrentLocation,

state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'');

因计划内磁盘维护而进行迁移

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

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

ALTER DATABASE database_name

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

要执行维护,停止 SQL Server 实例或关闭系统。 有关详细信息,请参阅启动、停止、暂停、继续和重启 SQL Server 服务。

将文件移动到新位置。

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

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

SELECT name,

physical_name AS CurrentLocation,

state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'');

故障恢复过程

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

重要

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

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

在命令提示符处输入以下命令之一,以 master-only 恢复模式启动 SQL Server 实例。

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

NET START MSSQLSERVER /f /T3608

对于命名实例,请运行以下命令。

NET START MSSQL$instancename /f /T3608

有关详细信息,请参阅启动、停止、暂停、继续和重启 SQL Server 服务。 有关 Linux 的信息,请参阅在 Linux 上启动、停止和重启 SQL Server 服务。

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

ALTER DATABASE database_name

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

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

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

停止 SQL Server 实例。

将文件移动到新位置。

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

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

SELECT name,

physical_name AS CurrentLocation,

state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'');

示例

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

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

USE master;

GO

返回逻辑文件名称。

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

以物理方式将文件移动到新位置。 在以下语句中,将 FILENAME 中指定的路径修改为服务器上文件的新位置。

ALTER DATABASE AdventureWorks2022

MODIFY FILE (NAME = AdventureWorks2022_Log, FILENAME = 'C:\NewLoc\AdventureWorks2022_Log.ldf');

GO

ALTER DATABASE AdventureWorks2022

SET ONLINE;

GO

验证新位置。

SELECT name,

physical_name AS CurrentLocation,

state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'AdventureWorks2022')

AND type_desc = N'LOG';

相关内容

ALTER DATABASE (Transact-SQL)

CREATE DATABASE

数据库分离、附加 (SQL Server)

移动系统数据库

移动数据库文件

BACKUP (Transact-SQL)

RESTORE 语句(Transact-SQL)

启动、停止、暂停、继续和重启 SQL Server 服务