0.前言
最近在做数据选型(支持mysql驱动的国产数据库),所以头痛怎么做压力测试,由于没有资源找业务系统来帮忙做压测,所以就想偷懒找一款TPCC基准测试工具来做此事,由于我司主力是使用IBM的DB2,所以优先考虑支持DB2的基准测试工具(如果不是因为DB2事实上选择没这么难)。
其实,以前也并非没有研究过,奈何真的不太容易,在此简单的说明一下我之前测试过的基准工具:
sysbench:最简单易用的基准测试工具,只能支持Oracle、MySQL、PostgresSQL,现在大多所谓的国产数据库均支持mysql或pg的驱动,sysben支持度高,可惜不支持DB2,被我pass掉了,但我会用它来做磁盘的IO测试;
HammerDB:支持主流的Oracle、MySQL及非主流的DB2,但在测试一些支持mysql协议的国产数据库时会遇到一些问题,语法不兼容还好一点可以修改tcl的脚本对应,由于它会用到很多DB本身的管理类API(如ob上很多variables是没有的),如果DB本身不提供那就没辙了,因此也被我passr掉了。而且,HammerDB在LOAD数据时比较容易出错,而且界面输出log的话非常卡顿。
BenchmarkSQL:使用JDBC驱动,兼容性各类DB是最好的,经多次碰壁后我选择了bmsql,但问题是网上并没有找到怎么修改源码以适应DB2的测试,于是潜心研究多天后发现其实也并不难,在此贡献全网首篇BenchmakSQL for DB2的部署教程。
1.参考网址
(1)源码的下载
https://github.com/wieck/benchmarksql
(2)官网文档说明
https://benchmarksql.readthedocs.io/en/latest/
2.编译jar包
由于bmsql并不直接支持DB2,故需要修改相关的源码,再编译为jar包,此操作对非Oracle、postgresSQL的关系型数据库同样式,包括mysql及其衍生的数据库。bmsql对数据库的操作是通过JDBC执行,没有使用DB内部的函数或监控API,通用性更强,故在修改源码主要关注一些SQL语法的少量调整即可。
以下是针对DB2修改的部分:
2.1 修改jTPCC.java
修改benchmarksql-master\src\main\java\com\github\pgsqlio\benchmarksql\jtpcc\jTPCC.java,的以下部分,添加支持DB2的db类型:
if (iDBType.equals("oracle"))
dbType = jTPCCConfig.DB_ORACLE;
else if (iDBType.equals("postgres"))
dbType = jTPCCConfig.DB_POSTGRES;
else if (iDBType.equals("firebird"))
dbType = jTPCCConfig.DB_FIREBIRD;
else if (iDBType.equals("mariadb"))
dbType = jTPCCConfig.DB_MARIADB;
else if (iDBType.equals("transact-sql"))
dbType = jTPCCConfig.DB_TSQL;
else if (iDBType.equals("babelfish"))
dbType = jTPCCConfig.DB_BABELFISH;
// ## add codes,for DB2
else if (iDBType.equals("db2"))
dbType = jTPCCConfig.DB_UNKNOWN;
// ##
else {
log.error("Unknown database type '{}'", iDBType);
return;
}
2.2 修改pom.xml
以下属性对应的是JDK的版本,但我使用JDK11的环境编译异常,所以我将11修改为1.8,并使用了1.8的JDK环境编译成功。
<!-- TODO To change when this project use github pages -->
<url>https://github.com/pgsql-io/benchmarksql</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
2.3 编译
进入 在目录benchmarksql-master下,执行mvn命令,编译成功后可以生成target目录。
//可以提前mvn clean
mvn
*maven编译环境自行搭建
3.修改脚本
3.1 修改funcs.sh
benchmarksql-master\target\run目录下的funcs.sh,修改内容如下:
function setCP()
{
case "$(getProp db)" in
oracle)
cp="../lib/*"
if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; then
cp="${cp}:${ORACLE_HOME}/lib/*"
fi
cp="${cp}:../lib/*"
;;
postgres)
cp="../lib/*"
;;
firebird)
cp="../lib/*"
;;
mariadb)
cp="../lib/*"
;;
transact-sql)
cp="../lib/*"
;;
babelfish)
cp="../lib/*"
;;
db2)
cp="../lib/*"
;;
esac
myCP="./:../BenchmarkSQL.jar:${cp}"
export myCP
}
# ----
# Make sure that the properties file does have db= and the value
# is a database, we support.
# ----
db=$(getProp db)
case "${db}" in
oracle|postgres|firebird|mariadb|transact-sql|babelfish|db2)
;;
"") echo "ERROR: missing db= config option in ${PROPS}" >&2
exit 1
;;
*) echo "ERROR: unsupported database type db=${db} in ${PROPS}" >&2
exit 1
;;
esac
3.2 修改sql
如果是非官方支持的数据库,Build过程主要执行以下目录的脚本:benchmarksql-master\target\run\sql.common。其中tableCreates.sql中的建表语句不符DB2的语法,只需要在primary key前加上not null即可如下:
create table bmsql_config (
cfg_name varchar(30) NOT NULL primary key,
cfg_value varchar(50)
);
3.3 添加DB2驱动jar包
将DB2的驱动jar包拷贝至目录下:benchmarksql-master\target\lib,驱动主要有以下:
db2jcc.jar
db2jcc4.jar
db2jcc_license_cu.jar
*可能只需要其中一两个而已,但我懒得测试~~
3.4 修改配置文件
在\benchmarksql-master\target\run目录下,将sample.transact-sql.properties(其他文件也可以的)拷贝文件为sample.db2.properties,主要修改的内容为以下:
# General Driver and connection parameters
#
# db={ postgres | oracle | firebird | mariadb | transact-sql }
# driver=<JDBC_DRIVER_CLASS>
# application={ Generic | PostgreSQLStoredProc | OracleStoredProc }
# conn=<JDBC_URI>
# user=<USERNAME>
# password=<PASSWORD>
db=db2
driver=com.ibm.db2.jcc.DB2Driver
application=Generic
conn=jdbc:db2://192.168.1.11:59900/TPCC
user=tpcc
password=AAaa11__
4.执行测试
上述修改完成后,可以开始进行运行测试,如下:
## 创建测试数据
./runDatabseBuild.sh sample.db2.properties
## 运行压力测试
./runBenchmark.sh sample.db2.properties
*具体测试方法作业另行章节介绍