db2 -4229错误 sql执行及数据加工报错信息的坑们-db2开发系列(二)

自从工作之后接触的关系型数据库有oracle、mysql、db2、greenplum、hive 。nosql有hbase、mongodb。

nosql暂且不提,关系型里面oracle mysql 等都挺好用,,就报错信息内部机制 db2却是与众不同 感觉很不好用。

1 先说说内部机制吧

因为只是了解所以就简要的说下自己知道的,oracle的锁机制,一般别人在对表进行DML操作的时候,你同时查询是不会有影响的。你查的是提交前的数据。而db2 的锁机制默认的很严格,别人在对表进行DML操作时,你同时查询的话可能会阻塞DML操作,因为db2认为事物应该是严格的,你查询的数据就应该是数据库里的,而此时不应该被修改,如果被修改了那查询数据就不问题,不准确。所以像select * from table 这种操作 会加行锁,如果此时有会话任务在对此表在做删除操作那么这个任务会hang住或者报错,这种现象常见于数据仓库。

数仓每日都会有很多 对表数据的DML操作的存储过程定时执行任务,且数仓每日的查询操作会很多,而如果你在任务执行的时候查询表 ,那就会影响任务的正常及时执行。

为了解决上述问题 ,一般执行查询sql的时候会在结尾加上 with ur fetch first 10 rows only。

with ur 未提交读

fetch first 10 rows only 只读10行

这就不会加行锁 可以一定程度解决问题。


2 sql执行及数据加工报错信息的坑

    1 用etl工具kettle 从mongdb抽取一张表数据到db2时,报错 错误日志 里面见-4229错误

先搜了下错误码 基本上是db2字段长度不够的问题。由于以前对clob字段的认知是其没有上限(即使有 也很大)
所以第一时间是觉得其他字段的问题 ,然后就慢慢调 调了好几次不对 于是就采用排除法,一次只插入一个字段,废了大劲,才发现是 clob字段有问题,觉得没有办法解决了。
一开始觉得是clob里面内容太大触发了bug什么的。
后来因为问题没解决,还是硬着头皮找原因 ,一开始搜的都是说clob字段最大值可以支持2G。
又仔细看了看 每个表的clob字段可以单独设置大小,默认是1M,于是才明白问题所在。
发现的两个语句

alter table tablename modify column columnname clob(3mb)

alter table tablename alter column columnname clob(3mb)

试了这两个都报错 不行,因为这边用的不是dba权限,所以没有仔细看问题。就重新找资料

发现可以在建表的时候指定 于是就重新了表 试下 就可以了。
CREATE TABLE TEST_CLOB
(
CLOB_DATA CLOB(3M)

);

   

    2 报错信息的不友好 除了字段长度不够不提示哪个不够之外 ,像一些缺少关键字、缺少括号的报错信息提示的是别的错误的错误代码 这个要注意 ,当使用db2 sql运行的错误提示 找不到语句的原因时 需要自己走读一下sql

   

    3 avg函数

一般的数据库avg函数都是忽略null的记录的,像mysql oracle hive mongodb都是的(亲自 验证过),而db2是不忽略,这也体现了其 “规范性”,具体说明以mysql为例见图:

db2 -4229错误 sql执行及数据加工报错信息的坑们-db2开发系列(二)

忽略了cc这条记录,所以2/2 均值是1 。而db2 是2/3 。截图不太方便 就不提供了。