背景介绍: 有一生产环境部署了一套SQL Server 2016 一主一从AlwaysOn 群集,现在监控显示S盘空间告警,使用率超过90%, 现在打算将比较大的用户数据库从S盘切换到前不久新加的T盘目录下。

在 SQL Server 2016 AlwaysOn 可用性组环境中,将某个已加入可用性组的用户数据库的数据文件从 S 盘迁移到 T 盘 是一个高风险操作,因为它涉及到数据库离线,会影响高可用性,需谨慎处理。核心原则是:操作必须在主副本上进行,并且需要将数据库暂时从可用性组中移除,操作完成后重新添加。
✅ 一、操作前准备
-
确认是否允许短暂中断 :数据库需要脱离可用性组,存在瞬间不可用的可能。
-
确认主副本节点角色: 迁移操作只能在 主副本(Primary) 上进行。
磁盘空间确认 :确保主副本和目标辅助副本的 T盘驱动器有足够的空间容纳数据库文件。
路径一致性: 确保主副本和目标副本规划相同的文件路径T:\Backup, T:\DB_log,T:\DB_Log
权限检查: 确保 SQL Server 服务账户对 T:\Backup, T:\DB_log,T:\DB_Log 文件夹具有完全控制权限
-
备份数据库和事务日志
以防万一:BACKUP DATABASE [YourDB] TO DISK = 'T:\Backup\YourDB.bak' BACKUP LOG [YourDB] TO DISK = 'T:\Backup\YourDB.trn'
✅ 二、迁移操作步骤(建议运维窗口进行)
步骤 1:从可用性组中删除数据库

现在该数据库不再属于可用性组,但物理文件仍在主副本的S:\DB_Data下,并且处于RESTORING状态(在辅助副本上也会处于RESTORING状态或离线状态)。
通过SSMS连接到辅助副本,将刚刚从可用性组删除的处于 RESTORING 状态的数据库删除。
步骤 2:分离数据库
在SSMS中,右键单击目标数据库,选择“任务” -> “分离”,等待数据库成功分离。

或使用下面的脚本
USE master; GO EXEC sp_detach_db 'YourDB';
步骤 3:移动文件(在操作系统层完成)
-
将
.mdf、.ldf、.ndf文件从 S 盘复制或剪切到 T 盘对应位置。 -
示例:
S:\DB_Data\YourDB.mdf → T:\DB_Data\YourDB.mdf S:\DB_Log\YourDB_log.ldf → T:\DB_Log\YourDB_log.ldf
步骤 4:重新附加数据库
使用SSMS 附加数据库,点击“添加”选择迁移后数据文件和日志文件所在正确路径

或使用下面的SQL 脚本附加数据库
CREATE DATABASE [YourDB] ON ( FILENAME = 'T:\DB_Data\YourDB.mdf' ), ( FILENAME = 'T:\DB_Log\YourDB_log.ldf' ) FOR ATTACH;
步骤 5:在主副本上对刚刚附加好的数据库做完整备份
步骤 6:将数据库重新加入 AlwaysOn 可用性组
在 SSMS 的“对象资源管理器”中,展开“AlwaysOn 高可用性” -> 你的可用性组。右键单击“可用性数据库”,选择“添加数据库...”。
步骤 7:验证同步
向导完成后,在“AlwaysOn 仪表板”中检查重新加入的数据库:
确认主副本和所有辅助副本的状态均为 SYNCHRONIZED。
确认所有辅助副本上的数据库文件确实创建在 T:\DB_Data下(可以通过 SSMS 连接到辅助副本实例查看数据库属性或在辅助副本服务器上检查目录)
⚠️ 注意事项总结
| 项目 | 说明 |
|---|---|
| 可用性组影响 | 迁移期间数据库会脱离高可用保护,需调度维护时间 |
| 文件路径一致性 | 所有副本的文件路径必须一致 |
| 副本同步 | 辅助副本需手动恢复并重新同步 |
| 权限 | SQL Server 服务账户对新盘目录需要有 读/写 权限 |
| Agent 作业 | 如果数据库路径或名称变化,需检查相关 Job 和链接服务器等配置 |




