DB2表回滚UOW后标记不可用(Pentaho ETL场景)求助
问题分析与解决方案
问题核心现象
DB2表在回滚UOW后被标记为不可用,通过Pentaho ETL处理CSV文件时触发该问题,关键错误信息如下:
- ETL报错:
DB2 SQL Error: SQLCODE=-1476, SQLSTATE=40506, SQLERRMC=-407 - DB2日志提示:
ADM5530W(NLI表提交处理启动)、ADM5571W(表数据对象被标记为不可用)、SQLCODE=-407(指定列不能为NULL,对应COLNO=2)
完整日志:
Could not insert SQL : DB2 SQL Error: SQLCODE=-1476, SQLSTATE=40506, SQLERRMC=-407, DRIVER=3.69.24 2023-08-30-02.53.08.702450+120 E709905392E671 LEVEL: Warning PID : 29183 TID : 140232523507456 PROC : db2sysc 0 INSTANCE: NODE : 000 DB : APPHDL : 0-56243 APPID: 10.1.198.57.38305.230830005314 AUTHID : HOSTNAME: EDUID : 6442 EDUNAME: db2agent 0 FUNCTION: DB2 UDB, data management, sqldEndNoLogList, probe:1 MESSAGE : ADM5530W The COMMIT processing of table " " that used NOT LOGGED INITIALLY has been initiated. It is recommended that you take a backup of this table's table space(s). 2023-08-30-02.53.10.218215+120 I709906064E598 LEVEL: Warning PID : 29183 TID : 140231772727040 PROC : db2sysc 0 INSTANCE: NODE : 000 DB : APPHDL : 0-56247 APPID: 10.1.198.57.38310.230830005312 AUTHID : HOSTNAME: EDUID : 6440 EDUNAME: db2agent 0 FUNCTION: DB2 UDB, relation data serv, sqlrr_rollback_with_sqlcode, probe:100 MESSAGE : NLI or DMS force ROLLBACK DATA #1 : Hexdump, 8 bytes 0x00007F8A1B29FDB8 : 2000 0000 0000 0000 ....... 2023-08-30-02.53.10.225134+120 I709906663E916 LEVEL: Warning PID : 29183 TID : 140231772727040 PROC : db2sysc 0 INSTANCE: NODE : 000 DB : APPHDL : 0-56247 APPID: 10.1.198.57.38310.230830005312 AUTHID : HOSTNAME: EDUID : 6440 EDUNAME: db2agent 0 FUNCTION: DB2 UDB, relation data serv, sqlrr_rollback_with_sqlcode, probe:220 DATA #1 : SQLCA, PD_DB2_TYPE_SQLCA, 136 bytes sqlcaid : SQLCA sqlcabc: 136 sqlcode: -407 sqlerrml: 35 sqlerrmc: TBSPACEID=37, TABLEID=1350, COLNO=2 sqlerrp : sqldFmt1 sqlerrd : (1) 0x8016001C (2) 0x0000001C (3) 0x00000000 (4) 0x00000000 (5) 0xFFFFFB1F (6) 0x00000000 sqlwarn : (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) sqlstate: 2023-08-30-02.53.10.228076+120 E709907580E599 LEVEL: Warning PID : 29183 TID : 140231772727040 PROC : db2sysc 0 INSTANCE: NODE : 000 DB : APPHDL : 0-56247 APPID: 10.1.198.57.38310.230830005312 AUTHID : HOSTNAME: EDUID : 6440 EDUNAME: db2agent 0 FUNCTION: DB2 UDB, data management, sqldMarkObjInErr, probe:1 MESSAGE : ADM5571W The "DATA" object with ID "1350" in table space "37" for table " " is being marked as unavailable.
根本原因
- 目标表启用了
NOT LOGGED INITIALLY (NLI)模式,该模式下DB2不记录事务日志以提升性能,但若事务回滚,DB2无法恢复到一致状态,只能将表标记为不可用。 - 插入操作触发
SQLCODE=-407错误:对应表的第2列被设置为NOT NULL,但CSV数据中存在NULL值,导致事务回滚,进而触发NLI表的不可用标记。
紧急恢复步骤
要恢复表的可用性,执行以下SQL命令(此操作会清空表中所有数据):
ALTER TABLE <你的表名> ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;
- 执行完成后,立即对该表所在的表空间进行备份,避免后续故障无法恢复:
BACKUP TABLESPACE <表空间名> TO <备份路径>;
- 若有最近的表备份,也可通过备份恢复表数据,无需执行清空命令。
预防措施
- 校验ETL数据:在Pentaho ETL流程中添加数据校验步骤,过滤掉第2列的NULL值,或为NULL值设置符合业务规则的默认值,避免插入失败导致回滚。
- 调整表结构:若业务允许,可修改表结构允许第2列存储NULL值:
ALTER TABLE <你的表名> ALTER COLUMN <列名> SET NULL;
- 谨慎使用NLI:若业务场景存在事务回滚风险,建议禁用NLI模式,改用常规日志模式(牺牲部分性能换取数据安全性)。
- 规范NLI使用:若必须使用NLI,确保事务能成功提交,且提交后立即备份表空间,遵循
ADM5530W的提示要求。
内容的提问来源于stack exchange,提问作者Krishna Murthy
相关产品推荐
相关产品推荐

