SQL Server 2014镜像故障转移至2022时因账本表创建失败致数据库挂起
SQL Server 2014到2022镜像无停机升级故障解决思路
问题背景
- 升级场景:生产数据库集群从SQL Server 2014标准版(v12.0.6439.10,Build 9600)无停机升级到SQL Server 2022企业版(v16.0.1000.6,Build 20348)
- 架构方案:采用数据库镜像,主节点为2014标准版,从节点为2022企业版,无见证节点
- 故障触发点:执行故障转移命令
ALTER DATABASE DBNameABC SET PARTNER FAILOVER时,2022节点的数据库升级流程中断,报错A ledger table cannot be created while database mirroring is enabled,数据库进入In Recovery状态无法访问
已完成排查操作
- 使用Microsoft Data Migration Assistant检测,未发现升级兼容性问题
- 直接通过备份文件将数据库恢复到2022节点(不启用镜像),更新兼容性级别至160(SQL Server 2022),操作正常,数据库可正常运行
解决思路
1. 优先恢复In Recovery状态的数据库
在SQL Server 2022节点执行以下命令,先让数据库恢复可用(注意:REPAIR_ALLOW_DATA_LOSS可能导致数据丢失,操作前需确认有最新备份):
ALTER DATABASE DBNameABC SET EMERGENCY; ALTER DATABASE DBNameABC SET SINGLE_USER; DBCC CHECKDB (DBNameABC, REPAIR_ALLOW_DATA_LOSS); ALTER DATABASE DBNameABC SET MULTI_USER;
2. 排查账本表相关对象
SQL Server 2014本身不支持账本表(Ledger Table),但原数据库可能存在第三方工具或自定义脚本模拟的账本表相关对象,这些对象在镜像故障转移触发升级时会引发冲突:
- 在SQL Server 2014主节点执行查询,检查是否存在账本表或相关内部对象:
SELECT * FROM sys.tables WHERE is_ledger_table = 1; SELECT * FROM sys.internal_tables WHERE name LIKE '%ledger%'; - 如果存在相关对象,先在主节点移除后,重新配置镜像并尝试故障转移。
3. 调整镜像升级流程,避免自动升级冲突
- 暂停镜像会话,手动完成数据库升级后再执行故障转移:
-- 在2022节点暂停镜像 ALTER DATABASE DBNameABC SET PARTNER SUSPEND; - 参考直接恢复数据库时的升级步骤,手动在2022节点完成数据库升级操作,确认无报错后:
-- 恢复镜像会话 ALTER DATABASE DBNameABC SET PARTNER RESUME; -- 执行故障转移 ALTER DATABASE DBNameABC SET PARTNER FAILOVER;
4. 替代方案:改用日志传送实现无停机升级
若镜像升级路径的兼容性冲突无法解决,可切换为日志传送方案:
- 在2022节点配置日志传送,与2014主节点保持实时同步
- 切换前停止主节点业务写入,应用最后一次日志备份到2022节点
- 将业务流量切换至2022节点,完成无停机升级
内容的提问来源于stack exchange,提问作者Anton S
相关产品推荐
相关产品推荐

