干这行的人,谁没在半夜被数据库的报警电话叫醒过?正睡得踏实,手机屏幕一亮,上面写着“SQL数据库恢复挂起”,心立马就凉了半截。你赶紧打开电脑,连上服务器一看,数据库状态栏里那个“Restoring”的字眼就那么卡在那儿,像一根刺。业务部门在群里催,领导在电话里问,你盯着屏幕上的进度条,它纹丝不动,仿佛整个世界的时钟都停在了这一刻。这种滋味,真的只有亲身经历过的人才懂。

其实这事吧,说穿了没那么玄乎。所谓“恢复挂起”,就是SQL Server在按你的指令做数据库还原,但进行到一半,它觉得条件不满足了,于是停在那儿,既不敢继续,也不肯回滚,就那么僵着。绝大多数情况下,不是数据库文件损坏了,而是你给它的指令不够完整,或者环境里有些东西没准备好。我见过太多新手上来就慌,直接去重启服务或者强行脱机,结果本来一个小问题,被折腾成了大事故。你先深呼吸,记住一句话:只要数据文件没被覆盖,一切都还有救。
第一步,也是最关键的一步,先看清楚是谁在捣乱。打开SQL Server Management Studio,右键那个卡住的数据库,看看它的状态选项。有时候你会发现,原来是有别的进程正在占用这个数据库,比如某个定时作业在跑,或者某个开发人员没关掉查询窗口。SQL Server这哥们儿特别讲规矩,只要有人占着茅坑,它就不让你进去。你要是愣头青,直接强杀进程,搞不好就把其他正在跑的业务也带崩了。正确的做法是,用或者视图查一下,看看到底是哪个会话ID在阻塞。找到元凶后,用命令把它请出去,然后再看一眼恢复状态。
第二步,检查你的备份文件链是不是断了。很多人做恢复的时候,只拿了一个完整备份就往服务器上灌,完全忘了中间还有差分备份和日志备份这一说。SQL Server恢复可不是你想的那样,拿个完整备份就能直接跳到最新状态。它得按照备份的先后顺序,一个接一个地应用。你要是跳过了中间的环节,它就会卡在“Restoring”状态等你喂数据。这时候你打开那个恢复界面,看看是不是有“待恢复的备份集”之类的提示。如果有,就把缺失的差分备份和日志备份按顺序加上去。记住,日志备份的序列号不能乱,LSN对不上,它照样罢工。
第三步,看看磁盘空间和权限。这个原因听着特低级,但实际操作中遇到的真不少。你一个完整备份文件动辄几十个G,恢复的时候,它需要同时占用临时空间和最终数据文件的空间。如果磁盘剩余空间不够,SQL Server会非常老实地告诉你“磁盘空间不足”,但有时候它不直接报错,就卡在那儿,表现为“恢复挂起”。你查一下数据目录和日志目录所在盘符的剩余空间,如果低于备份文件大小的1.5倍,赶紧清理或者挂载新盘。另外,别忽略了服务账户的权限,我遇到过好几次,SQL Server服务账户对目标文件夹没有写入权限,它也会默默卡住,不吭一声。
这三步走完,八成以上的恢复挂起问题都能解决。但还有一小撮情况,属于那种“疑难杂症”。比如你用的备份文件本身就是坏的,或者恢复过程中服务器突然断电了,导致系统表状态不一致。这时候,你可能会看到数据库状态显示为“置疑”。遇到这种情况,别慌,也别急着删库重建。你把数据库设为紧急模式,单用户模式,尝试用跑一下,看看能不能修复。如果修复不了,那就老老实实从一个可用备份重新恢复,丢失的数据只能是没办法了。这也就是为什么我一直强调,备份校验这个工作,每周至少得做一次,不能光备份不验证,否则真到用的时候才发现文件是坏的,那才叫欲哭无泪。
说个我亲历的案例吧。去年有个朋友的公司,周五下班前跑了个全量备份,结果周六凌晨运维想恢复一个测试库,怎么整都是“恢复挂起”。他急得给我打电话,我远程一看,日志备份文件的命名规则乱了,时间戳对不上,LSN序列断了一截。他以为是备份成功了,实际上那个日志备份根本没包含最新的数据变更。后来我让他查了一下库里的备份历史表,发现一个日志备份其实是周四的,周五那次因为作业调度冲突压根没跑成功。这就是典型的“备份链断裂”。你把缺失的日志备份补上,或者接受那个时间点的数据,恢复操作瞬间就完成了。这事之后,他再也不敢只看备份任务是不是“成功”状态了,还得看备份文件的大小和时间戳。
还有个容易忽略的坑,就是你在做恢复的时候,选了“RESTORE WITH RECOVERY”和“RESTORE WITH NORECOVERY”的区别。如果你选了后者,数据库会一直保持“Restoring”状态,这是正常的,因为它还在等待后续的日志备份。如果你不小心在一步选了“NORECOVERY”,然后关闭了窗口,数据库就一直挂在那儿,看起来就像“卡死”了。其实不是卡死,是SQL Server在等你下指令。这时候你只需要再跑一条的命令,它立马就能活过来。这个坑,我自己就踩过,所以每次给别人做培训,我都会强调一遍这个选项的含义。
说到底,SQL数据库恢复挂起,就跟人感冒发烧一样,看着吓人,但大多数情况下都有固定的疗程。你只要按照“查阻塞、查备份链、查环境”这三步来排查,基本上都能药到病除。怕就怕那种没有章法的操作,东一榔头西一棒槌,把问题越搞越大。做数据库这行,稳比快重要,冷静比聪明重要。下次再遇到“恢复挂起”,先别急着骂娘,泡杯茶,打开查询窗口,按部就班地查那三样东西。你会发现,大部分时候,它只是跟你开了个小玩笑,真正的大问题,反而藏在那些你平时不注意的细节里。数据库这东西,你对它多上心,它就不给你找麻烦。你嫌麻烦糊弄它,它会在你最不想出事的时候,给你来一个措手不及。


