標準四步法 (需停機窗口)
- 離線數據庫
ALTER DATABASE [MyDB] SET OFFLINE WITH ROLLBACK IMMEDIATE;
- 文件系統層面移動/重命名 `.mdf` / `.ldf` 到新路徑
- 更新元數據路徑
ALTER DATABASE [MyDB]
MODIFY FILE (NAME = MyDB_Data, FILENAME = 'E:\NewPath\MyDB.mdf');
ALTER DATABASE [MyDB]
MODIFY FILE (NAME = MyDB_Log, FILENAME = 'E:\NewPath\MyDB_Log.ldf');
- 上線並驗證
ALTER DATABASE [MyDB] SET ONLINE;
SELECT name, physical_name, state_desc
FROM sys.master_files
WHERE database_id = DB_ID('MyDB');
關鍵注意點
- 邏輯名 (`NAME`) 必須與 `sys.master_files` 中 `name` 一致,非物理文件名
- 目標路徑 SQL Server 服務帳戶需有 **完全控制** 權限
- 移動前務必 **完整備份**,防文件損壞/遺失
- Always On 可用性組數據庫:需先移除可用性組、移動、再加入
- 系統數據庫 移動更複雜,需啟動參數 `-c -f -m` 單用戶模式操作
無停機替代方案 (Enterprise Edition)
- **文件流 / FileTable** 新增文件組到新路徑,逐表 `ALTER TABLE ... REBUILD` 遷移 (在線)
- **加入新文件組 + DBCC SHRINKFILE EMPTYFILE** 驅逐舊文件數據 (在線、耗時長)
- **Always On 次要副本移動 → 容錯移轉 → 原主庫移動 → 容錯移轉回** (近零停機)
驗證查詢
SELECT
DB_NAME(database_id) AS DatabaseName,
name AS LogicalName,
physical_name AS PhysicalPath,
state_desc AS State,
size * 8.0 / 1024 AS SizeMB
FROM sys.master_files
WHERE database_id = DB_ID('MyDB');