手动故障转移后恢复按钮禁用,无见证时镜像恢复失败,咨询检查点
数据库镜像故障排查与检查点解析
你的两个镜像问题排查
1. 手动故障转移后恢复按钮禁用、查询无法恢复
手动故障转移完成后,原主库会切换为镜像角色,原镜像库成为新主库。这时候恢复按钮禁用是正常情况——恢复按钮仅在镜像会话处于「挂起」状态时才可用,而正常的手动故障转移会让镜像会话保持同步/异步运行状态,所以按钮自然是灰的。
如果你的需求是把角色切换回原来的主库,别用恢复按钮,应该再次执行手动故障转移(前提是当前新主库处于同步状态且可正常访问)。另外,如果发现查询无法正常执行,建议先检查:
- 新主库的数据库状态是否为
ONLINE; - 原主库(现在的镜像库)是否有未同步的事务,可通过以下查询确认状态:
SELECT mirroring_state_desc, mirroring_role_desc FROM sys.database_mirroring WHERE database_id = DB_ID('你的数据库名');
2. 无见证服务器时执行ALTER DATABASE ... SET PARTNER RESUME;后镜像无法恢复
无见证服务器的场景下,镜像会话要么是高安全模式(无自动故障转移),要么是高性能模式。执行恢复命令后没反应且按钮禁用,你可以按以下步骤排查:
- 先查会话状态:执行这条查询确认当前镜像状态:
如果状态是SELECT database_id, name, mirroring_state_desc, mirroring_role_desc FROM sys.database_mirroring WHERE database_id = DB_ID('你的数据库名');SYNCHRONIZING或SYNCHRONIZED,说明会话已经在正常运行,恢复按钮禁用是合理的; - 如果状态还是
SUSPENDED:大概率是日志链断裂了。这时候需要:- 在当前主库备份最新的事务日志:
BACKUP LOG 你的数据库名 TO DISK = 'D:\Backup\LatestLog.bak'; - 在镜像库上还原这个日志备份(必须用
NORECOVERY):RESTORE LOG 你的数据库名 FROM DISK = 'D:\Backup\LatestLog.bak' WITH NORECOVERY; - 再次执行恢复命令:
ALTER DATABASE 你的数据库名 SET PARTNER RESUME;
- 在当前主库备份最新的事务日志:
- 额外检查:确认主库和镜像库之间网络连通正常,SQL Server服务都在运行,镜像端点的权限配置正确(比如是否允许对方服务器连接)。
什么是检查点?
检查点是SQL Server里的关键后台机制,核心作用就是把内存中已经修改但还没写入磁盘的数据页(也就是「脏页」)刷到磁盘,同时更新事务日志,标记一个恢复起始点。它的核心价值在于:
- 大幅缩短数据库恢复时间:如果SQL Server意外崩溃重启,恢复过程只需要从最近的检查点开始,重做之后的事务、回滚未完成的事务,不用从头扫描整个事务日志;
- 释放内存资源:脏页写入磁盘后,对应的内存空间可以被重新分配给其他操作使用。
常见的检查点类型有:
- 自动检查点:SQL Server会根据「恢复间隔」的配置自动触发,确保数据库崩溃后的恢复时间不超过设定的阈值;
- 手动检查点:通过执行
CHECKPOINT命令手动触发,比如在收缩数据库、做重大维护操作前,手动触发检查点可以减少后续恢复风险; - 延迟检查点:在SQL Server 2012及以后版本中,自动检查点会延迟到系统负载较低时执行,避免对业务性能造成影响;
- 内部检查点:由SQL Server内部操作触发,比如备份数据库、切换数据库恢复模式、创建索引等场景都会自动触发。
内容的提问来源于stack exchange,提问作者Pankaj Kumar
相关产品推荐
相关产品推荐

