求助:SQL Server 2016镜像配置失败,数据库处于In-Recovery状态
我之前处理过好几个SQL Server 2016镜像配置翻车的案例,正好碰到过数据库卡在In-Recovery状态的情况,给你梳理几个实用的排查和修复步骤:
排查与修复SQL Server 2016镜像配置失败导致的In-Recovery状态问题
一、先搞清楚状态异常的根源
首先要明确:镜像节点恢复备份时,必须用WITH NORECOVERY参数,这是配置镜像的硬性前提。如果之前恢复备份时不小心用了RECOVERY,数据库会进入正常状态,后续强行配置镜像就会导致状态混乱,直接卡在In-Recovery。
你可以先在镜像节点执行这条查询,确认当前数据库状态:
SELECT name, state_desc FROM sys.databases WHERE name = '你的数据库名';
二、先终止异常会话,把数据库拉回可控状态
如果数据库长时间卡在In-Recovery,先别慌:
- 先终止主节点和镜像节点之间的异常镜像会话,在主节点执行(如果主节点报错,直接在镜像节点执行):
ALTER DATABASE 你的数据库名 SET PARTNER OFF; - 尝试把镜像节点的数据库恢复到正常状态(前提是你的备份是完整可用的):
RESTORE DATABASE 你的数据库名 WITH RECOVERY;
执行完这条命令后,数据库会回到正常状态,我们可以重新走正确的镜像配置流程。
三、按标准流程重新配置镜像(别再用SSMS图形界面踩坑了)
很多人配置失败都是因为恢复备份的步骤不对,用T-SQL操作比SSMS图形界面更可靠:
- 主节点备份操作:
- 先做完整备份:
BACKUP DATABASE 你的数据库名 TO DISK = 'D:\Backup\你的数据库名_Full.bak' WITH INIT; - 紧接着做日志备份(必须在完整备份之后,且是镜像配置前的最后一次日志备份):
BACKUP LOG 你的数据库名 TO DISK = 'D:\Backup\你的数据库名_Log.trn' WITH INIT;
- 先做完整备份:
- 镜像节点恢复备份:
- 先恢复完整备份,必须带
NORECOVERY:RESTORE DATABASE 你的数据库名 FROM DISK = 'D:\Backup\你的数据库名_Full.bak' WITH NORECOVERY, REPLACE; - 再恢复日志备份,同样带
NORECOVERY:RESTORE LOG 你的数据库名 FROM DISK = 'D:\Backup\你的数据库名_Log.trn' WITH NORECOVERY;
RESTORING,这才是配置镜像的正确准备状态。 - 先恢复完整备份,必须带
- 正式配置镜像:
- 先在镜像节点执行:
ALTER DATABASE 你的数据库名 SET PARTNER = 'TCP://主节点服务器名:端口号'; - 再在主节点执行:
ALTER DATABASE 你的数据库名 SET PARTNER = 'TCP://镜像节点服务器名:端口号';
- 先在镜像节点执行:
四、几个容易踩的坑提前规避
- 主节点和镜像节点的SQL Server版本、补丁级别必须完全一致,SQL Server 2016不同CU版本之间可能存在镜像兼容性问题。
- 检查两个节点之间的镜像端口(默认5022)是否开放,防火墙有没有拦截镜像流量。
- 确保数据库的恢复模式是
FULL,这是镜像的硬性要求,执行这条命令确认:
如果不是FULL,先修改:SELECT name, recovery_model_desc FROM sys.databases WHERE name = '你的数据库名';ALTER DATABASE 你的数据库名 SET RECOVERY FULL;
注意:当数据库处于In-Recovery状态时,绝对不要强行重启SQL Server服务,这可能会导致恢复进程更长甚至数据库损坏,一定要先查看SQL Server错误日志找具体原因。
内容的提问来源于stack exchange,提问作者Sandie
相关产品推荐
相关产品推荐

