上周帮一个老客户迁移数据库,对方还用的是SQL Server 2000,想升级到2008。一听到这个需求,我心里就咯噔一下——这两个版本差了整整八年,中间还隔着一个SQL Server 2005。说实话,这种跨版本的还原操作,稍不留神就会掉坑里,轻则报错,重则数据全废。但这种事又不能推,毕竟老系统跑得好好的,客户不想动代码,只想换个新环境继续跑。所以今天就把这套操作流程和注意事项掰开了揉碎了讲一遍,省得大家到时候手忙脚乱。

先说一个最关键的认知:SQL Server 2000的备份文件(.bak)不能直接还原到SQL Server 2008,这个结论可能会让很多人意外。因为微软官方文档写得明明白白,SQL Server 2008支持从SQL Server 2005及以上版本直接还原,但不支持从2000版本直接还原。你能看到的是,当你试图在2008里还原一个2000的备份文件时,系统会弹出“数据库备份集与现有数据库不兼容”的错误提示。这不是你的操作有问题,而是微软故意设置的限制。所以第一步就是要把这个2000的备份先还原到一个中间版本——通常我选SQL Server 2005,因为绝大多数2000的备份都能被2005兼容。
具体怎么做呢?你需要在服务器上同时安装SQL Server 2005和SQL Server 2008,或者找一台装了2005的临时机器。先把2000的备份文件还原到2005里,还原过程很简单:打开SQL Server Management Studio(2005版本),右键点击“数据库”,选择“还原数据库”,选择“源设备”找到你的.bak文件,然后一路“确定”。这里有个细节,还原时要注意目标数据库的文件路径,2005默认的数据文件路径和2000不一样,如果路径不存在会报错,所以建议手动设置到一个你已知的目录,比如C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLData。还原成功后,你就能在2005里看到这个数据库了,表、视图、存储过程应该都在。
接下来要做的是升级兼容级别。2005还原成功后,数据库的兼容级别还是80(对应SQL Server 2000),你需要在数据库属性里把它改成90(对应SQL Server 2005)。这一步很重要,不改的话,后续在2008里还原可能还会遇到问题。改兼容级别的方法:在数据库上右键选择“属性”,找到“选项”页,在“兼容级别”下拉框里选择“SQL Server 2005(90)”。改完之后,建议执行一下DBCC CHECKDB命令,检查数据库的完整性,别让隐藏的损坏带到下一步。这一步虽然费时间,但值得做,我见过太多人跳过检查,结果在2008里还原失败,回头又要重新导数据。
然后就是备份这个2005版本的数据库。在2005里对数据库做一次完整备份,生成一个新的.bak文件。这个备份文件就是我们要丢给2008的“合法”备份。备份的时候注意选择“完整”备份类型,目标文件名最好加上版本标记,比如“mydb2005.bak”,方便后面识别。备份完成后,把这个文件复制到安装SQL Server 2008的服务器上。现在你就可以在2008里还原这个备份文件了,操作和前面一样,但这次应该不会报错。还原成功后,数据库的兼容级别是90(SQL Server 2005),你可以在2008里把它改成100(SQL Server 2008),或者继续保留90也行,看你的应用需求。
你以为这样就完了?远没有。很多老系统用的是SQL Server 2000特有的功能,比如系统表直接修改、老式的全文索引、或者某些不标准的T-SQL语法。这些功能在2008里可能已经被废弃或者行为发生了变化。举个例子,2000里允许用SELECT * INTO temp FROM table这种临时表操作,2008虽然支持,但如果你在2000里用了很多像SET ROWCOUNT这样的老语法,到2008下可能就会报错。所以数据库还原成功之后,一定要跑一遍应用程序的功能测试,看看存储过程、触发器、函数有没有异常。我上次帮一个客户迁移,所有表都还原正常,但一个用了十年的存储过程报错,原因是2008对字符串截断的规则更严格了,2000里能容忍的写法在2008里直接抛异常。
还有个容易被忽略的事:SQL Server 2000和2008的排序规则可能不一样。如果你的2000数据库用的是中文PRCCIAS,而2008服务器默认是Latin1GeneralCI_AS,那还原后查询中文数据时可能会出现乱码或者排序异常。解决方法是,在2008里还原时显式指定排序规则,或者在2008服务器上修改实例级别的排序规则(这个操作比较麻烦,建议提前规划)。最简单的办法是,在2005还原后,检查一下数据库的排序规则,确保和2008的目标环境一致,不一致的话可以通过ALTER DATABASE命令修改,但注意修改排序规则可能会影响索引和约束,操作前一定要备份。
说一个实战中的小技巧:如果你的2000数据库文件(.mdf)直接附加到2008里,而不是通过备份还原,那更麻烦。因为2008不支持附加2000的数据文件,你需要先用2005附加,再分离,再附加到2008。步骤更多,风险也更大。所以我强烈建议走备份还原这条路。另外,如果你没有条件装SQL Server 2005,还有一个备选方案:用SQL Server 2008的“导入导出数据”功能,把2000的数据逐表复制到2008的新数据库里。这个方法不需要中间版本,但缺点是只能迁移表结构和数据,索引、触发器、存储过程、视图、用户权限这些对象都需要手动重建,工作量巨大。对于小系统或许可行,生产环境千万别这么干。
总的来说,从SQL Server 2000还原到2008,核心就是三步走:2000备份还原到2005,2005备份再还原到2008。每一步都要做完整性检查和兼容性调整。别嫌麻烦,也别想走捷径。我见过太多人图省事,直接用第三方工具导数据,结果数据是过去了,但业务跑起来各种问题,返工的成本远远高于正规操作的时间。数据库迁移这事,慢就是快,稳就是快。


