昨天谈到卷是DBA行业的主旋律,确实如此,在我的职业生涯中,对DB2数据库一直是有些排斥的,24年前我们的一个银行客户使用DB2数据库,DB2锁的问题和Logfilesiz的问题把我搞得焦头烂额,从此对DB2敬而远之,提不起认真学习的兴趣来。
最近D-SMART开始接入DB2,我也被迫开始再次接触DB2。说实在的D-SMART开发到了第八个年头了,我们支持了ORACLE和SQL SERVER,但是一直没有支持DB2,主要原因是我们团队里没有对DB2有兴趣的专家。最近我们参与一些客户的信创数据库运维工具选型测试,很多客户提出需要我们支持DB2,因为他们的存量DB2还是挺多的。于是有点讽刺意味的事情开始了,在马上要去DB2的前夜,我们开始研究起DB2了,这是不是有些人说的49年参军的时候非要选择当国军的意思啊。
要想适配DB2,首先需要给数据库加点压,了解DB2的哪些指标对数据库的负载和并发敏感。于是想把BenchmarkSQL配起来,希望这个工具能够给DB2加些负载。网上关于DB2跑BenchmarkSQL的文档不多。Git上有一个开源项目,支持DB2。

不过我也不想太麻烦了,就想直接利用那个公司目前已经安装好的BenchmarkSQL 5.0来简单地能接入DB2。受到这个开源项目的启发,我就直接用postgres这个数据库类型来接入DB2数据库。实际上BenchmarkSQL里的数据库类型配置项只是区分建表脚本等有限的个性化配置,把Oracle数据库设置成Postgres也是可以通过一些调整来解决不兼容的问题的。
db=postgres
driver= com.ibm.db2.jcc.DB2Driver
conn=jdbc:db2://xxx.xxx.xxx.xxx:50000/MYDB
user=db2inst1
password=db2inst1
想要搞定DB2,把DB2数据库的sqllib/java下的几个和db2jcc相关的JAR包(db2jcc4.jar,db2jcc.jar,db2jcc_license_cu.jar)拷贝到BenchmarkSQL的lib目录下就可以了。在跑runDatabaseBuild.sh之前,我们需要对建表的脚本做一些兼容性的改造 ,因为DB2有一些比较特殊的语法限制。run/sql.postgres下面的几个脚本需要修改一下。

对于DB2来说,primary key必须是not Null的,而且不能省略NOT NULL,这地方是需要修改的。另外extraHistID.sql也需要做一下修改,否则在添加外键的时候会报错。如果不能正确添加外键,会影响压测的性能。我刚开始没发现这个问题的时候,TPMC不到100,改了这个地方之后提升了数百倍。

改完之后我们就可以尝试创建BenchmarkSQL的测试数据了。不过如果想要尝试的朋友先别急着跑runDatabaseBuild.sh,因为如果是你默认安装的DB2,不做logfilesiz等参数的修改,在装载数据的时候肯定会遇到报错:

SQLCODE=-1476, SQLSTATE=40506, SQLERRMC=-964 这个错误通常与事务日志满相关,导致事务回滚。SQLERRMC=-964 表示事务日志已满。-964错误也是二十多年前经常被虐的问题,至今还有点印象。DB2默认安装的logfilesiz是1024,日志块大小是4K,也就是4M。我们可以把它调整为4096。同时加大logprimary/logsecond参数,因为DB2的数据库最大事务日志为(logprimary+logsecond)*logfilesiz*4K,如果超过这个限制,救会出现SQLERRMC=-964事务日志满的报错。

经过一番折腾,终于把BENCHARKSQL跑起来了,我也尝试了一些简单的调整,TPMC提升了差不多10%。目前我的目的也不是用于做极限测试,而是为了看看我们采集到的DB2的一些指标数据是否有价值。目前Oracle的可观测性能力是极强的,默认参数下都可以采集到大量的指标数据,而非Oracle数据库的很多指标都是需要开启某些参数后才能采集到的,默认情况下并不开启这些指标的采集。

从默认参数上看,指标监控都是很基础的。Mon_act_metrics设置为extended会有更多的指标被采集。

我们采集的关键指标中大半都是没有采集到值的,看样子这个清单需要做调整。从目前的适配情况来看,因为可观测性能力的差别,要想在DB2上做到类似Oracle的功能还是有些困难。当然,我们对DB2数据库方面的经验不足也限制了D-SMART在DB2上的功能实现,运维知识自动化系统,没有专家知识的接入是做不好的。我想今后会在客户现场,依托客户在DB2方面的运维经验与运维案例,来进一步优化这方面的能力。
作为一个Oracle DBA,我是一直对DB2有点敬畏的,因为和Oracle相比,确实不大好用,我这句话可能会让广大DB2 DBA感到不适。不过说句实在话,用惯了Oracle再去用其他数据库,确实会发现其他数据库与它都有不小的差距。不过不管Oracle多好用,今后接Oracle的活肯定会越来越少,而对于国产数据库,我们都必须去积极面对,饭碗面前,你不得不如此啊,你还有其他的选择吗?




