哥们儿,你正盯着SQL Server数据库管理器,那个“正在还原”的状态栏像块牛皮糖一样粘在屏幕上,心里估计在骂娘——数据查不了,业务停摆了,老板又在催。这场景我太熟了,干技术这行,谁没跟这个“还原中”的状态死磕过几回?很多人第一反应是重启服务,或者干脆把数据库删了重新附加,结果往往更糟。其实,这个状态看着吓人,背后无非就是几种可能:要么是还原操作没跑完,要么是日志卡住了,再不然就是备份文件本身有问题。别慌,咱们今天就把这事儿掰扯清楚。

最常见的坑,就是你以为还原完了,其实它还在后台跑。SQL Server的还原分好几个阶段,比如“还原数据库”这个操作,你点了确定,界面显示100%完成,但实际后台可能还在做“重做”或“撤消”阶段。这时候,你右键点数据库,状态还是“正在还原”。很多新手这时候就坐不住了,强行中断进程,结果数据库直接变成“可疑”状态,那才叫噩梦。正确做法是打开活动监视器,看看有没有正在执行的还原会话。如果真有,耐心等它跑完,别手贱。要是实在等不下去,查一下sys.dmexecrequests视图,找到那个还原进程,用KILL命令干掉,但记住,这招是下策,能不用就不用。
另一个常见元凶,是日志文件没处理好。SQL Server的还原模式分“简单模式”和“完整模式”,你要是用完整模式,还原时就得带上日志链。比如你只还原了全量备份,没还原差异或日志备份,数据库就会卡在“正在还原”状态,等着你喂下一口。这时候,你只需要执行一句RESTORE DATABASE YourDB WITH RECOVERY,就能让它活过来。但注意,如果你后续还想还原事务日志,就得用WITH NORECOVERY,让数据库保持在还原状态。很多人搞不清楚这两者的区别,要么还原后数据不全,要么状态卡死,两头不讨好。
说到备份文件本身,也是个容易翻车的地方。备份文件损坏、版本不匹配、或者跨服务器恢复时排序规则不一致,都会导致还原卡住。我见过最离谱的一次,是运维哥们儿从生产环境拷了个备份文件,结果文件在传输过程中断过,他硬是没校验就直接还原,数据库直接罢工。所以,备份文件拿回来后,先跑个RESTORE VERIFYONLY FROM DISK命令,确认文件没问题再动手。另外,SQL Server版本兼容性也是个坑,高版本备份不能还原到低版本数据库,反之则行。你从2019版导出,想恢复到2016版,门儿都没有,必须用脚本或者数据导出导入。
遇到这种事儿,最忌讳的是瞎折腾。有些人一看“正在还原”,立马去重启SQL Server服务,觉得重启能解决一切。结果服务一停,正在进行的还原操作直接中断,数据库状态从“正在还原”变成“恢复挂起”,甚至“可疑”。这时候你再用DBCC CHECKDB去修复,等于给自己挖坑。还有的人跑去改数据库文件路径,或者手动删掉LDF日志文件,想让它自动重建,这操作简直是在数据库坟头蹦迪。记住,数据库不是你家电脑,不能用修电脑的思路去怼它。
那真遇到卡死的情况怎么办?别急,先冷静分析。打开SQL Server错误日志,看看有没有报错信息。如果是磁盘空间不够,那就清理空间;如果是权限问题,检查SQL Server服务账号有没有读写权限;如果是网络问题,看看是不是在跨网络还原时丢包了。大部分“正在还原”状态,其实不是真卡死,而是你没给它下对指令。比如你还原时用了WITH NORECOVERY,但后续没跟上日志备份,它就一直等着。这时候,一句WITH RECOVERY就能解决,简单粗暴。
还有种情况,是你在做“脚本级还原”,比如用第三方工具或者自己写的PowerShell脚本。很多脚本在还原时没处理好事务日志,导致数据库卡在还原状态。我建议,能用图形界面就别用脚本,除非你特别确定每一步的逻辑。真要写脚本,记得加上错误处理和日志输出,一旦卡住,能快速定位问题。比如在还原语句里加上@State='RECOVERY'参数,或者用TRY CATCH捕获异常,别让脚本闷头跑。
说到底,数据库“正在还原”这个状态,就像你手机卡在开机画面一样——大部分时候不是真坏,而是系统在等你操作。你慌它就慌,你冷静它就能救。平时多做备份校验,还原前先模拟一遍,别等到出事了才去查资料。技术这活儿,靠的是预判和预案,不是事后救火。下次再看到这个状态,别急着拍桌子,先喝口水,想想我今天说的这几招,大概率能帮你省下半天加班时间。


