查了下文档即使到2019版本,sqlserver移动数据库文件位置依然是要停机的,注意待移动文件大小,估计好停机时间。

 

sqlserver 移动数据库文件位置分为两大类:

  • 用户数据库
  • 系统数据库

系统数据库又可分为再分为:

  • 除master及resource以外的系统数据库(model,msdb,tempdb)
  • master数据库
  • resource数据库

下面分别来看

 

一、 用户数据库

1. 检查文件逻辑名称及物理位置

SELECT name,physical_name,state_desc FROM sys.master_files WHERE database_id = DB_ID(N'testdb');

其中name是逻辑名,physical_name是物理位置,记下这两列值

2. OFFLINE待移动数据库

use master;
ALTER DATABASE database_name SET OFFLINE;

3. 将一个或多个文件移动或复制到新位置

4. 对每个移动的文件,执行以下语句 

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

5. ONLINE数据库

use master;
ALTER DATABASE database_name SET ONLINE;

执行online命令后会进入“In Recovery”状态,recover完成后变为可读写状态

6. 检查文件移动后位置

SELECT name,physical_name,state_desc FROM sys.master_files WHERE database_id = DB_ID(N'testdb');

 

二、 除master及resource以外的系统数据库

步骤与用户数据库类似,只是执行顺序略有不同,另外从数据库offline改为了关闭实例。

1. 检查文件逻辑名称及物理位置

SELECT name,physical_name,state_desc FROM sys.master_files WHERE database_id = DB_ID(N'msdb');

2. 对每个准备移动的文件,先执行以下语句 

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

3. 关闭sqlserver实例

4. 将一个或多个文件移动或复制到新位置

5. 启动sqlserver实例

6. 检查文件移动后位置

SELECT name,physical_name,state_desc FROM sys.master_files WHERE database_id = DB_ID(N'msdb');

 

三、 master系统数据库

比较复杂,也容易出问题,没事最好别移,换操作系统盘符可能还比较简单。

1. 关闭sqlserver实例

2. 更改启动参数路径

“SQL Server配置管理器” -> “SQL Server服务”节点 -> 右击SQL Server实例(MSSQL2016) -> 选择“属性” -> 单击“启动参数”。

sqlserver 移动用户及系统数据库文件位置方法_sql

可以看到默认指定了3个参数,每个参数后紧跟文件路径(没有空格):

  • -d:datafile
  • -e:errorlogfile
  • -l:logfile

修改对应参数后内容,指定master库数据和日志文件新路径

-dC:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\DATA\master.mdf
-eC:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\Log\ERRORLOG
-lC:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\DATA\mastlog.ldf

3. 移动master库数据文件和日志文件到新目录

注意errorlogfile如果更改了位置可以不移动,会重新生成

4. 启动 SQL Server 实例服务

5. 检查文件移动后位置

SELECT name,physical_name,state_desc FROM sys.master_files WHERE database_id = DB_ID(N'master');

 

四、 Resource系统数据库

Resource为只读数据库,不直接显示在系统数据库中,它包含SQL Server中的所有系统对象。这个数据库不能移动,也不能通过sqlserver备份。

Resource 数据库的位置是 <drive>:\Program Files\Microsoft SQL Server\MSSQL<version>.<instance_name>\MSSQL\Binn\

 

参考

https://docs.microsoft.com/en-us/sql/relational-databases/databases/move-user-databases?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/relational-databases/databases/move-system-databases?view=sql-server-ver15

https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/resource-database?view=sql-server-ver15

https://social.technet.microsoft.com/wiki/contents/articles/51296.sql-server-move-master-database-to-another-location-drive.aspx