数据库崩了,MDF文件打不开,SQL Server服务起不来,那感觉就像手机掉进马桶里,捞起来还能用但心里总膈应。干这行的都懂,MDF文件就是SQL Server数据库的命根子,一旦出现“日志文件损坏”“页校验失败”或者干脆提示“无法打开数据库”,你手头那点数据可能就是客户一年的订单,或者是财务部门三个月的总账。这时候慌是没用的,得按步骤来。

先别急着找修复工具,得先搞清楚坏到什么程度。MDF损坏分好几种,轻的是某个数据页校验和不对,查询某张表时报错;重的是文件头损坏,数据库直接标记为“可疑(Suspect)”;最狠的是文件物理损伤,比如硬盘坏道把MDF啃掉一块。判断方法很简单,打开SQL Server Management Studio,看数据库状态。如果是“可疑”或者“恢复挂起”,说明逻辑损伤占大头,工具能救;如果连附加数据库都弹“文件无法访问”,那可能得先检查磁盘坏道,别上来就修,不然越修越烂。
针对逻辑损坏,微软官方其实给了条路——DBCC CHECKDB命令。这玩意儿相当于数据库的体检大夫,能扫描一致性错误,还会告诉你用了哪个修复级别。语法不复杂:。但用之前你得想清楚,REPAIRALLOWDATALOSS这个参数,翻译成人话就是“拿数据换可用性”,它会删除损坏的行、重建索引,甚至丢掉一些页面。如果是测试库,闭眼跑;如果是生产库,务必先备份,哪怕备份是个坏库,也比没有强。而且这个命令有概率把整个文件改得更乱,所以我建议先跑只做检查,看清楚错误数量和位置,再决定动不动手。
光靠DBCC不够,很多场景下你需要专门的MDF数据库修复工具。市面上的工具五花八门,但真正能打的也就那么几款。Stellar Repair for MS SQL,老牌厂商,界面清爽,操作逻辑是“附加MDF文件→扫描→预览→导出”,对普通用户友好,但价格不便宜,个人版几百美元,企业版更贵。另一款叫SysTools SQL Recovery,扫描速度挺快,支持批量修复多个MDF,适合那种手里攒了一堆坏库的运维老哥。还有Aryson SQL Database Recovery,这货有个亮点是能修复加密数据库,但免费版只让你看修复结果,导出数据得付费。选工具别光看宣传,先下载试用版,拿一个已知损坏的MDF试跑一遍,看预览数据是否完整,再决定掏不掏钱。
工具修完,数据导出来了,是不是就完事了?没那么简单。你得把修复出来的表、存储过程、视图全部导回新建的数据库里。这里有个坑:很多工具导出的是“数据”,不是“结构”,尤其是带外键约束的表,导回时顺序错了直接报错。我的做法是,先导所有表结构,再导数据,加约束和索引。如果MDF里有视图或者自定义函数,得单独核对定义语句,有时候工具导出的脚本里会莫名多出几个引号,跑不通,得手动改。别嫌麻烦,这一步漏了,后面上线跑业务,天天报错,更头疼。
另外,工具不是万能神药,有些物理损伤它真搞不定。比如硬盘坏道导致MDF部分扇区无法读取,工具扫描半天,卡在某个进度条死活不动。这时候别硬扛,先试试把MDF复制到另一块干净硬盘上,再跑修复。如果复制过程中系统提示“无法读取源文件”,说明坏道已经啃到文件本身了,那就得考虑用磁盘镜像工具,比如ddrescue或者HDD Raw Copy Tool,先把整个分区镜像出来,再对镜像文件跑修复工具。这个过程很慢,但能保住大部分数据,比直接放弃强得多。
还有一类情况大家容易忽略——日志文件LDF丢了,或者LDF和MDF不匹配。SQL Server启动数据库时,如果找不到LDF,它会尝试重建日志,但有时候重建失败,数据库就卡在“恢复挂起”状态。这时候可以试试把MDF附加到另一个实例,用命令,只附加主文件,让系统自动生成新日志。很多老鸟用这招救回过不少库,但前提是MDF本身没有严重逻辑错误。如果附加时报“日志文件大小不匹配”,别慌,先备份MDF,然后用最小化恢复模式启动服务器,再执行附加,成功率能高一些。
修复工作做完,还有件事得干——验证数据完整性。别以为工具显示“修复成功”就万事大吉,你拿几条关键记录对一下,比如订单表的总额、用户表的手机号格式,跑几个聚合查询,看看有没有明显异常值。更严格的做法是,把修复后的数据库和最近的备份做数据对比,找几条主键一样的记录,逐字段比对,发现不一致就说明修复过程中有数据丢失。这时候如果丢失量不大,可以接受;如果丢得太多,就得考虑回到备份,用日志文件做时间点恢复。说实话,修复工具只能“尽量还原”,永远替代不了日常备份。
说句实在话,MDF修复工具是术,备份策略才是道。我见过太多人,平时不备份,出事了抱着工具哭。与其天天研究哪个工具修复率高,不如花半小时把SQL Server的维护计划配好,每天全备、每小时日志备份,再定期做恢复演练。真到了数据库崩盘那天,你掏出备份文件,三分钟恢复完,那才叫本事。工具是拿来兜底的,不是拿来当救命稻草的。这篇文章里提到的每款工具,你都去官网下个试用版,拿测试库练手,搞清楚它们的脾气,真到生产环境出问题那天,你心里才有底。


