干这行十年了,每次听到“数据库迁移”这四个字,后背还是会条件反射地一紧。尤其是SQL Server,从2000年用到2022版,这玩意儿就像个脾气古怪的老伙计,平时跑得好好的,你一动它,各种幺蛾子全冒出来了。今天不聊那些官方的白皮书,就说说咱们一线DBA和开发兄弟踩过的坑,聊聊SQL Server数据迁移里那些最实在的事儿。

先说说最基础也最容易翻车的场景:跨服务器迁移。很多人图省事,直接右键数据库——任务——分离,然后把MDF和LDF文件拷到新机器上,再附加。这套流程对付小库没问题,但库一旦上了200G,或者业务是7×24小时跑着的,这么干就是灾难。你想想,分离的瞬间,连接全断,用户那边直接开骂。更麻烦的是,附加的时候如果版本不一致,比如从2012往2019迁,很多时候附加完直接报“数据库无法打开,版本xxx”,那感觉就像你拿着老房子的钥匙去开新房的锁,拧断了也白搭。
所以正经的迁移,第一个要分清楚:你是要挪活数据,还是要搬整个库的物理文件?如果是前者,用生成脚本或者SSMS里的“导出数据”功能,把表结构和数据导成SQL文件再执行,听着简单,但坑在数据类型上。比如datetime和datetime2的精度差异,decimal的精度差异,还有那些带默认值、约束、触发器的表,光靠导出向导,大概率会丢掉一部分对象定义。我有次迁移一个老系统,里面有个字段是text类型,导出到新库后,查询速度慢得跟蜗牛爬一样,后来才发现是索引策略在text上根本不起作用,这就是复制结构时没考虑版本特性惹的祸。
真正靠谱的做法,是分三步走。第一步,先在目标服务器上把数据库结构完整地创建出来,别用向导,用脚本——右键数据库,生成脚本,选“架构和数据”都行,但更推荐只生成架构,然后单独处理数据。第二步,数据搬运用BCP或者BULK INSERT,这玩意儿速度比SSMS的图形化导入快好几个数量级。我见过一个10亿行的日志表,用SSMS导要跑十几个小时,换成BCP加并行,两小时搞定。但注意,BCP对中文和特殊字符的编码处理有讲究,导出时记得指定代码页,不然后面数据全是乱码,哭都来不及。
再说说迁移过程中最容易忽略的权限问题。很多人把数据和结构弄过去了,发现应用连不上,报错“用户登录失败”。为啥?因为SQL Server的登录名和数据库用户是两套体系,登录名存在master库里,数据库用户存在各自库里。你光把业务库迁过去,登录名没跟着走,新服务器上根本没有那个登录账号,或者SID对不上。解决办法是迁移前,在源库用系统存储过程把登录名的SID和密码哈希导出来,然后在目标库重建,或者干脆用“包含数据库”功能,把用户定义放在数据库内部,这样迁过去就自带用户了。这条经验,是用无数个加班的夜晚换来的。
还有个大家爱踩的坑是日志文件的处理。很多库因为平时没做定期收缩,日志文件膨胀到几十个G。迁移的时候,如果直接复制日志文件,新服务器上加载会特别慢,甚至可能因为日志里记录了大量旧事务而无法恢复。我的习惯是,迁移前先把恢复模式改成简单,然后收缩日志文件到最小,再切回完整模式,重新做一次完整备份。这样迁移过去的日志文件干净利落,启动快,后续做日志备份也不会出幺蛾子。别心疼那几分钟收缩的时间,跟迁移后出问题比起来,太划算了。
然后,版本升级的场景得单独拎出来说。从SQL Server 2008往2019迁,或者从2016往2022迁,这不是简单的数据拷贝,还涉及兼容级别的问题。新版本默认的兼容级别可能跟旧库不一样,导致某些查询计划变化,性能反而下降。我有次帮客户从2012迁到2019,应用上线后有个报表查询从原来的2秒变成了30秒,查了半天,发现是兼容级别还是2012的,新版本的一些优化器特性没启用。改完兼容级别,重新编译存储过程,性能就回来了。迁移后一定要记得跑一遍所有关键查询,对比执行计划,别以为数据对了就万事大吉。
说个很多人不知道的小技巧:迁移前先在目标机器上做一次全库备份,然后恢复到新环境里,用DBCC CHECKDB检查一遍完整性。这比直接复制文件靠谱得多,因为备份文件自带校验信息,能发现页级损坏。我有次迁移一个财务系统,就是靠这个检查发现源库有个索引页已经坏了,但平时没影响到查询所以没暴露。如果直接复制文件过去,坏数据也跟着过去了,到时候对账对不上,那才叫一个头大。备份恢复的方式还有个好处,就是可以指定恢复到某个时间点,万一迁移过程中出问题,还能退回去。
说到底,SQL Server数据迁移这件事,技术文档里写的都是标准流程,但实战中每个库都有自己的脾气。有的表没主键,有的触发器写得跟屎山一样,有的字段名是关键字,这些都得提前摸排。我的经验是,别急着动手,先在测试环境完整演练一遍,记录每一步的耗时和报错,然后优化流程,再上生产。迁移这事儿,没有捷径,只有细心和耐心。你把这个过程当成一次外科手术,术前评估、术中操作、术后观察,一个环节都不能省。数据库里的数据,是公司的命根子,咱们这些动手的,得对得起这份信任。


