干这行十年,最怕半夜手机响。上周凌晨两点,一哥们儿电话打过来,声音都在抖——他们公司那台跑了七年的SQL Server 2008,早上上班所有业务系统全连不上库了,打开SSMS一看,数据库名字后面挂着个刺眼的“可疑”。他问我有没有救,我说你先别急着砸键盘,这情况我见多了,八成能救回来。

“可疑”这俩字,听着吓人,其实本质就一句话:SQL Server在启动或运行过程中,发现这个库的事务日志跟数据文件对不上账了。系统为了自保,直接把这个库锁死,不让任何人碰,防止数据越坏越厉害。常见诱因无非就那几样:突然断电没来得及写盘、磁盘满了日志写不进去、或者有人手欠直接kill了数据库进程。2008这个老版本尤其敏感,它不像2012往后有那个“自动修复”的缓冲机制,一出事就给你脸色看。
很多人一慌就想着重装或者从备份恢复,那是下下策。备份可能是两周前的,恢复完丢的数据够你喝一壶。正确的路子是让SQL Server自己把库“捞”回来,用紧急模式强制把库置为在线,然后立刻做一次完整备份,把当前数据先保住,再去修一致性。这套操作我管它叫“三步走”,每一步都有讲究,跳一步都可能翻车。
第一步,把库切到紧急模式,让它先“活”过来。在SSMS里新建一个查询窗口,执行三行命令:第一行,把库标记为紧急状态;第二行,把库切成单用户模式,防止别人抢连接;第三行,强制让库上线。这三行执行完,你会发现库能进去了,但这时候千万别高兴太早,就像人刚从ICU推出来,还没脱离危险期。
第二步,用DBCC CHECKDB把库从头到尾查一遍,看里面到底伤哪儿了。命令很简单:。跑的时候可能得等几分钟,别催,让它慢慢查。查完会给你出一堆报告,有修复建议的会告诉你用还是。这里得说句掏心窝的话:如果报告里提示需要,就意味着有数据要牺牲了,你心里得有个底,哪些表的数据能重建,哪些是唯一副本,提前想好对策。
第三步,执行修复,然后马上做备份。如果只报了分配错误或索引损坏,直接跑,然后,这能修好大部分逻辑损坏且不丢数据。如果必须用,那执行完务必第一时间执行,把这个“修复后”的库完整备份下来,然后立刻把库切回多用户模式。这一步做完,你的数据才算真正落袋为安。
我见过太多人在第二步就卡住了。有个客户,库也是可疑状态,他看网上教程说直接跑,结果跑完发现他那个存客户合同附件的表,所有字段全变成空值了,几万份PDF文档全没了。后来我帮他查,发现他那次故障其实只是日志文件被别的进程锁住了,根本不需要动数据,用就能解决。所以说,别嫌麻烦,的输出一定要仔细看,它告诉你什么级别的问题,你就用对应级别的修复手段,这是保命的关键。
还有几个细节得提醒你。操作全程最好在业务低峰期做,因为单用户模式一开,所有连接都会被踢掉,正在跑的业务会瞬间断掉,你得提前跟业务方打招呼。另外,如果库的文件本身已经物理损坏,比如磁盘坏道导致文件读不出来,那上面所有步骤都会报错,这时候别硬撑,赶紧找专业的磁盘恢复公司,或者从备份恢复。但多数情况,逻辑损坏占七八成,这套三步走能救回你大部分数据。
说句实在的,数据库这玩意儿,平时不烧香,临时抱佛脚最要命。这次救回来了,赶紧做三件事:第一,把恢复模式改成“完整”,别用“简单”,这样以后能支持时间点恢复;第二,安排定期全备加日志备份,至少一天一次;第三,装个监控脚本,发现数据库状态变成“可疑”或者“恢复挂起”,立刻报警。2008这个版本微软早就停止维护了,能升2019就赶紧升,升不了也得把补丁打齐。但眼下,按这三步走,先把数据救出来,比什么都强。


