DB2升级这件事,很多人只盯着版本号和安装步骤,真正出问题的往往是升级前没有做兼容性核验。无论从 11.1 升到 11.5,还是向更高版本迁移,数据库升级都不等同于单纯替换二进制文件。它涉及实例元数据更新、数据库目录结构迁移、内置例程重编以及执行计划变化。升级前把检查工作做细,升级后把验证动作做全,风险可以降低一大半。

版本升级通常不只是装上新代码,还会改变优化器行为、内置函数实现以及部分默认参数。很多升级失败案例都能追溯到同一类原因:源版本不在支持路径上、存在未发现的无效对象、升级后没有重绑包导致执行计划异常。按操作阶段拆开说明,能更清楚地看到哪些环节最容易遗漏。
一、升级前:完成三层兼容性检查
第一层是版本支持路径核验。DB2不同版本之间并非都能直接升级,例如部分较老版本需要先升级到中间版本,才能继续升级到目标版本。动手之前应查阅 IBM 官方兼容性矩阵,确认当前版本与目标版本之间的支持关系。可以先执行 db2level 查看当前构建号,再用 db2licm -l 确认许可类型是否支持目标版本。曾经有团队从 10.5 直接升到 11.5,结果在实例更新阶段报出版本跨度不合法,最后只能回退重做。
第二层是检查已废弃或行为变更的特性。新版本可能移除某些旧参数、旧存储过程或旧管理工具,也可能调整默认值。例如部分兼容参数在新版中不再生效,或者某些内置函数返回精度发生变化。升级前应重点核对应用是否依赖这些行为。第三层是对象级检查,需要把库中的存储过程、自定义函数、触发器、序列、MQT、临时表以及外部例程全部梳理一遍。外部例程尤其容易被忽略,因为它们依赖操作系统中的动态库文件,升级后如果没有重新编译,或者库路径发生变化,可能直接导致调用失败。
可以借助 db2ckupgrade 工具提前暴露问题,它能检查数据库是否满足升级条件。执行前最好先做一次离线备份,避免检查工具本身对元数据造成意外影响。检查命令示例如下:
db2level db2ckupgrade DBNAME -l upgrade_check.log db2 backup db DBNAME offline to C:\DB2\backup compress without prompting
其中备份路径如果位于 Windows,必须写完整,例如 C:\DB2\backup,不能省略反斜杠。备份文件建议保留两份以上,一份放在生产主机,另一份复制到独立存储。升级前如果连备份都没有验证过可恢复性,那回滚方案就只是纸面上的。
二、升级中:严格执行实例与数据库升级顺序
升级过程通常分为三个阶段:更新实例二进制、升级数据库、重新绑定包。顺序不能颠倒。很多失败是因为先执行了数据库升级命令,但实例二进制仍然是旧版本,导致内部元数据不一致。正式升级前一定要停止应用连接,确认没有活跃事务,然后执行离线备份。对于配置了 HADR 的环境,还需要先评估是否要暂时切换主备,避免复制链路在升级期间产生冲突。
在 Linux 和 Unix 平台,安装完新版本产品包后,需要使用 db2iupdt 更新实例,而不是手工替换关键文件。Windows 平台通常由安装向导自动完成实例更新,但仍需检查实例是否成功更新到目标版本。实例更新后启动数据库,再执行 UPGRADE DATABASE 命令升级数据库目录。升级数据库期间不要中断命令,也不要开启其他会话,否则可能产生部分升级的中间状态。数据库升级完成后,及时运行 db2rbind 重新绑定所有包,避免旧包继续引用已经不兼容的 SQL 路径。
一套常见的命令顺序如下:
db2 terminate db2stop force # 安装新版本后更新实例 db2iupdt inst1 db2start db2 upgrade database DBNAME db2rbind DBNAME -l rbind.log all
执行 db2rbind 时建议把日志重定向到文件,方便后续检查哪些包绑定失败。如果库中包数量较多,重绑时间可能较长,维护窗口要留足余量。只重绑不重新收集统计信息,仍然无法避免执行计划异常,这一点要在下一步继续处理。
三、升级后:重绑包、统计信息与执行计划核对
升级后第一件事是确认数据库可正常连接,表空间状态正常。可以先执行 db2 connect to DBNAME 和 db2 list tablespaces show detail,查看是否有异常状态表空间。没有问题后再处理统计信息。优化器版本升级后,旧统计信息可能不再适合新的估算模型,尤其是分布统计信息和列组统计信息,建议对核心业务表重新执行 runstats。如果表数据变更量较大,可以先执行一次 reorg,再收集统计信息。
执行 db2rbind 之后,还需要查询 SYSCAT.PACKAGES 中的无效包。无效包不一定报错,但在调用对应语句时可能触发隐式重新编译,消耗额外时间。可以用下面的 SQL 快速定位无效包:
SELECT PKGSCHEMA, PKGNAME, VALID FROM SYSCAT.PACKAGES WHERE VALID = 'N';
执行计划核对也不能省。升级前和升级后分别用 db2exfmt 导出关键 SQL 的执行计划,对比访问路径是否发生明显变化。如果发现原本走索引的查询突然变成全表扫描,就要检查统计信息是否完整、重绑是否成功,或者优化器参数是否需要调整。权限变化同样要重点核对,尤其是外部例程、DLL 路径和可执行文件访问权限。升级后部分目录的属主或权限位可能被安装程序修改,导致例程无法加载。
四、回滚预案与高发问题
回滚不是简单卸载新版本。通常需要先用升级前的离线备份恢复数据库,再将实例和产品组件回退到旧版本,最后重启并验证。这个过程比升级本身更耗时,所以升级前一定要把回滚条件写进操作清单。如果升级后出现核心表无法访问、执行计划大面积退化、外部例程全部失效,而且短时间无法修复,就应该立即触发回滚。维护窗口至少要包含升级时间和回滚时间之和,不能只按顺利升级的时间计算。
常见升级后报错中,SQL0443N 通常与例程不兼容有关,SQL0440N 多与权限不足有关。还有一类问题是许可失效,新版本可能改变许可策略,升级完发现实例无法启动或数据库被限制。先用 db2licm -l 检查许可状态,再继续后续操作。除此之外,还要留意以下问题:
- 包的
VALID字段为N,但应用没有感知,导致第一次调用变慢。 - 旧版本中的自定义设置没有被全新的
db2set变量继承。 - 外部例程对应的动态库路径变化,升级后加载失败。
- HADR 主备版本不一致,复制链路无法启动。
- 统计信息未更新,执行计划退化导致 CPU 飙升。
升级前后保留完整的 db2support 信息收集结果,能在出现问题时快速对比环境差异。把这套检查、执行、验证和回滚流程固化下来,后续再升级其他环境时就能少走很多弯路。