haoweishow Blog

ESB/Java

DB2 表状态异常SQL20054N

DB2 表状态异常SQL20054N

背景

测试环境的一张表在前线库和后线库中进行了分区处理. 前线库存放当天和未来的分区, 后线库存放昨天和过去N天的数据. 该表的消息ID字段是主键.

现象

在日终批量的时候,从前线库卸载下来的分区数据,可以导入后线库,但是该表的状态异常,不能删除更早的历史分区(手动执行也报错) DB2错误码: SQL20054N reeasoncode:29

原因

消息ID出现重复,前线库中有一条记录与后线库的历史分区里某一天的数据重复.因为消息ID可以保证在前线库唯一,但是无法保证两个库唯一.
出现异常的流程:
* 前线库:分区卸载
* 前线库:数据导出ixf文件
* 后线库:关闭约束检查db2 "set integrity for tabname check immediate unchecked"
* 后线库:从ixf文件中import数据(正常)
* 后线库:开启约束检查db2 "set integrity for tabname immediate checked"(异常,该语句报错,导致后面删除分区也未能执行)

解决

临时解决

  • 删除后线库该表的数据(也可以只删除重复的数据)
  • 开启约束检查
  • 删除多余的分区

    永久方案

  • 前线库采用唯一约束,保证逻辑处理不会产生重复.
  • 后线库删除该表的唯一约束,仅保存相应的索引即可