我最近跟一个做金融系统的朋友聊天,他公司刚完成了一次 DB2 数据库的迁移,从老旧的 AIX 平台搬到 Linux 上的新环境。他跟我说,整个过程比想象中复杂得多,光准备工作就花了两个月。这让我想起十年前我第一次接触 DB2 迁移时的狼狈——当时以为只是简单的数据拷贝,结果因为字符集配置问题,项目延期了两周。DB2 数据库迁移这事,说难不难,说简单也不简单,关键在于你怎么踩坑。

第一步其实是弄清楚自己要干什么。很多人一上来就想着怎么搬数据,结果搬完后发现应用程序连不上,或者性能还不如原来。我见过最离谱的案例,有人直接把 DB2 表空间从 32K 页大小迁到 4K 页,结果所有索引都要重建,数据量还翻了一倍。所以迁移前,你得先弄清楚三件事:源库和目标库的版本差异、操作系统平台是否一致、字符集和排序规则有没有变化。DB2 从 9.7 到 11.5 中间隔了好几个大版本,每个版本在 SQL 语法、存储过程、甚至内置函数上都有细微差别。我建议先跑一次 命令,把源库版本记下来,然后去 IBM 官网查官方迁移兼容性文档,别想当然。
准备工作做好后,下一步是评估工具。DB2 官方提供了几条路:最传统的是 export/import,把数据导出成 IXF 或 DEL 格式再导入目标库;稍快一点的是 db2move,能批量处理表、索引、视图;更快的是 db2look 与 db2batch 组合,把 DDL 和数据分开处理。但如果要搞大项目,比如几十 TB 的数据量,就得考虑 CDC 实时复制或 IBM 的 InfoSphere Data Replication。我的经验是:小于 100 GB 的库,用 db2move 最省心;大于 1 TB 的,别折腾,直接上逻辑复制工具,否则光导出数据就要跑三天。去年有个电商客户,用 export/import 迁移一个 5 TB 的 DB2 库,结果导出阶段卡在一个大表上,后来改用 CDC,两天搞定。
接下来是最容易出问题的环节:字符集和编码。DB2 默认用 UTF‑8,但很多老系统用的是 GBK 或 ISO‑8859‑1。如果源库是 GBK,目标库设成 UTF‑8,迁移过程中不指定字符集转换,中文就会变成乱码。我有一次血的教训:给一家医院迁移 DB2,迁移完后病历中的“张三”变成了“???”。查了半天,原来是 db2move 命令没加 参数,导致字符集映射错误。正确的做法是先用 查看源库的 codepage 和 territory,然后在创建目标库时通过 指定相同的编码设置。如果实在搞不定,可以在迁移前跑一个字符集检测脚本,把超出 ASCII 范围的数据单独标记出来。
数据搬完了,你以为就结束了?大错特错。接下来是存储过程和触发器的迁移。DB2 的 SQL PL(过程化语言)和 Oracle 的 PL/SQL 不一样,很多语法细节都有差异。比如 DB2 的游标处理、异常捕获、甚至日期函数,都与其他数据库大相径庭。我见过最坑的情况是,有人把 DB2 的 语句直接迁到目标库,结果语法报错,因为目标库版本不支持这种写法。正确的做法是先用 db2look 导出所有存储过程的 DDL 脚本,然后在目标库上执行,看看哪些报错。对于报错的部分,手动修改语法,尤其是使用了 DB2 特有函数(如 RAND、SNAPSHOT)的地方。建议在测试环境先跑一轮存储过程,模拟真实业务请求,确保所有过程都能正常执行。
别忘了性能调优这一步。迁移完的数据库,统计信息可能是空的或已经过时。DB2 的查询优化器依赖统计信息来选择执行计划,如果统计信息不准,原本跑 1 秒的查询可能变成跑 1 分钟。我有个客户,迁移后核心报表查询从 3 秒变成了 30 秒,原因是目标库没有执行 RUNSTATS,表的分布统计全部丢失。正确的做法是:在数据迁移完成后,立刻对所有表执行 RUNSTATS 命令;对大表建议使用 ,这样能生成更精确的统计信息。另外,别忘了检查缓冲池大小、日志文件大小、表空间页大小等配置参数,它们直接影响性能。
别忘了数据验证。很多人迁移完只看行数是否一致,却忽略了数据内容的完整性。我推荐用哈希校验的方法:对每个表的所有字段做 MD5 或 SHA1 哈希,然后对比源库和目标库的哈希值。如果哈希值一致,说明数据完全一致;如果不一致,即使只有一行数据,也要查清是字符集问题还是精度丢失。还有一点容易被忽视:DB2 的浮点数精度在不同平台上有细微差异,比如 x86 和 PowerPC 上的存储格式不同,迁移后可能导致计算结果出现微小偏差。对金融、医疗等对数据精度敏感的场景,建议在迁移前使用数值比较工具逐字段对比。
整个 DB2 数据库迁移,表面上是技术活,实际上是项目管理活。你需要把每个步骤拆解清楚,预留足够的时间给测试和回滚。我见过太多项目因为前期准备不足,导致迁移后应用崩溃,最终不得不回滚到旧环境。所以我的建议是:别贪快,别省步骤,每一步都做好验证。毕竟,数据库迁移这种事,成功了没人记得,失败了所有人都会记得。


