前段时间我们生产环境有台alwayson高可用副本挂了,一开始是发现数据库账号不能登录,以为是密码过期,登录到副本上面发现数据库同步中断。
这个时候肯定第一时间是先查下SQL SERVER日志看下是什么报错原因引起的。
然后在SQL SERVER日志里面找到凌晨2点15分30秒的时候目标数据库有一条错误日志,提示Always On Availability Groups data movement for database 'xxxx' has been suspended for the following reason: "system" (Source ID 2; Source string: 'SUSPEND_FROM_REDO'). To resume data movement on the database, you will need to resume the database manually. ,紧接着的一条日志 During redoing of a logged operation in database 'XXXX' (page (1:9) if any), an error occurred at log record ID (372842:430056:1). Typically, the specific failure is previously logged as an error in the operating system error log. Restore the database from a full backup, or repair the database.
第一条日志提示日志redo中断,第二条日志直接指出哪条日志的redo失败。
也就是SQL SERVER卡着这条log的redo上面,所以数据库进入Not Synchronizing状态。
后面我们是按照常规的做法,ALTER DATABASE XXX SET HADR RESUME尝试恢复数据库。
这是常规微软推荐的做法,让数据库尝试自然恢复。
但是执行完命令后,第一时间打开windows 事件查看器查看下MSSQLSERVER日志提示,还是提示无法redo (372842:430056:1)。也就是SET HADR RESUME没办法恢复数据库。
其实这个问题发生过不止一次,这算是第二次了吧。后来我们咨询了微软(我们的服务器是Azure云,SQL SERVER是RDS版),微软的工程师让我们把SQL SERVER服务重启就行。
两次都是重启SQL SERVER解决问题,只是日志redo的时间会比较久。
重启SQL SERVER后刷新一下SQL SERVER 日志,看到有提示数据库在恢复中。
随后提示恢复完成
然后注意通过监控脚本观察副本的同步状态以及剩余redo日志,只要有变化,剩余redo日志在减少,就说明恢复成功。