老张前天晚上给我打电话,说他们公司那台跑了快十年的老服务器,SQL2000的数据库文件突然打不开了。客户资料、订单记录全在里面,备份还是上个月的。电话那头他的声音都在抖。这种情况我见得太多了,SQL2000这老伙计虽然稳定,但架不住硬盘坏道、非法关机、病毒攻击这些意外。今天就把这些年攒下的修复经验和操作步骤,一五一十全写出来。

先说最基础的一步,也是最重要的——千万别慌,更别手贱去反复重启SQL服务。数据库文件损坏分两种:逻辑损坏和物理损坏。逻辑损坏通常是断电、强制杀进程导致的,数据页没有完全写入,文件头信息乱了。物理损坏就麻烦,硬盘坏道直接啃掉了文件的一部分。你第一步要做的,是找到SQL2000的安装目录,默认在C:Program FilesMicrosoft SQL ServerMSSQLData下面,看看mdf和ldf文件的大小。如果mdf文件大小还在,但ldf文件变成0KB,那多半是日志文件崩了,这种情况修复成功率很高。如果两个文件都不见了,那先找找有没有备份策略,没有的话,后面我会说一个土办法。
接下来讲最常规的修复操作——利用SQL Server自带的DBCC CHECKDB命令。在查询分析器里连上master数据库,执行一句:DBCC CHECKDB('你的数据库名', REPAIRREBUILD)。这个命令会扫描所有数据页,检查分配错误、一致性错误,然后重建索引。但这里有个坑,SQL2000的DBCC修复是有风险的,如果报错提示需要REPAIRALLOWDATALOSS,那意味着要删除一些损坏的数据行。执行之前,你一定要做好心理准备,并且先把mdf文件复制一份到别处,万一修坏了还能退回去。另外,如果数据库状态是“置疑”或者“挂起”,你连DBCC都用不了,这时候得先把数据库改成紧急模式,SQL2000没有在线改状态的命令,得用sp_dboption或者直接改系统表,这个操作比较硬核,网上教程多,但你要注意版本兼容性。
如果DBCC修复失败,或者数据库连附加都不让,那就得用第三方工具了。市面上针对SQL2000的修复工具不少,但真正靠谱的没几个。我用过好几款,最稳的还是俄罗斯人写的那个Ariang Data Recovery for SQL Server,界面丑得跟上世纪似的,但人家底层算法确实牛,能直接扫描mdf文件里的数据页,把还能读出来的记录导成脚本,再重建一个新库把数据灌进去。不过这玩意儿收费不便宜,而且老版本对中文支持一般,导出数据时可能乱码。还有个土办法,用记事本打开mdf文件,搜一下你的表名或者字段名,如果能看到明文,说明数据页还在,只是文件头坏了,这时候用十六进制编辑器手工修文件头,理论上可行,但只适合高手,新手别碰,容易把文件彻底搞废。
说到日志文件,很多人忽略了一个关键点——SQL2000的日志和主数据文件是配套的,如果ldf损坏但mdf完整,你可以尝试把ldf文件改名,然后启动数据库,SQL会自动创建一个新的日志文件。具体操作:先把数据库设置为脱机,把损坏的ldf文件改名成.ldf.bak,再启动数据库,SQL Server会提示找不到日志,这时候执行ALTER DATABASE你的库名SET ONLINE,系统会自动重建日志。这个方法我试过多次,成功率在七成左右。但有个前提,你的mdf文件必须处于正常状态,不能有页级错误。如果mdf也有问题,那就得用前面说的DBCC先修mdf,修好再重建日志。
再分享一个实战中总结出来的技巧——利用SQL2000的“数据导出向导”做抢救性恢复。有时候数据库整体打不开,但某些表还能读出来。你可以在企业管理器里新建一个空白数据库,然后用DTS导入数据,源数据库选那个损坏的库,如果向导能列出可用的表,就一个个导过去,导不进去的表也别急,先导那些能读的,至少保住大部分数据。这个方法特别适合那种只有单个大表损坏、其他表完好的情况。我帮人修过一个案例,一个库里有200多张表,只有3张表读不了,用DTS导了16个小时,救回了97%的数据,客户差点哭出来。
说点实在的——修复完成之后,千万别直接上线接着用。你要做三件事:第一,马上用DBCC CHECKDB再跑一遍,确认没有任何一致性错误;第二,把数据库的恢复模式改成简单模式,减少日志文件膨胀的风险;第三,也是最关键的,立刻配置一个完整的备份计划,至少每天一次全备,每两小时一次差异备份。SQL2000这老东西虽然皮实,但毕竟二十年前的技术了,文件结构简单,经不起折腾。如果你手里还有几台老服务器在跑SQL2000,建议趁早规划迁移到SQL2008或更高版本,兼容性没你想的那么难,我上次把SQL2000的库直接附加到SQL2014上,跑了个把月,除了几个语法不兼容的存储过程,其他都正常。
写这篇文章的时候,我又想起老张那天电话里颤抖的声音。他的库修好了吗?修好了,用了我说的第三个方法,日志文件重建加DBCC修复,折腾了整整一个晚上,数据一个没丢。其实SQL2000数据库文件修复,说到底就八个字:冷静判断,备份先行。你的数据没你想的那么脆弱,但也没那么坚强。如果你现在正对着屏幕发愁,不妨先把这篇文章收藏了,按步骤来,一步步操作,大部分问题都能解决。要是实在搞不定,评论区把你的报错信息发出来,我看到都会回。


