MySQL-tpcc测试 tpcc使用说明

说明:文章内容起源于网络并结合自己的实验而得;但参考的文章地址当时没记录下来,如果发现有侵权问题,请留言。

一、介绍

压力测试是指在MySQL上线前,需要进行大量的压力测试,从而达到交付的标准。压力测试不仅可以测试MySQL服务的稳定性,还可以测试出MySQL和系统的瓶颈。

TPCC测试:Transaction Processing Performance Council,要熟练使用TPC是一系列事务处理和数据库基准测试的规范。其中TPC-C是针对OLTP的基准测试模型,一方面可以衡量数据库的性能,另一方面可以衡量硬件性价比,也是广泛应用并关注的一种测试模型。

TPC-C测试模型给基准测试提供了一种统一的测试标准,并非实际应用系统中的真实测试结果,但通过测试结果,可以大体观察出MySQL数据库服务稳定性、性能以及系统性能等一系列问题。TPC-C仅仅是一个测试模型,而在实际测试中,需要参考和使用一些测试工具,对系统和MySQL数据库进行压力测试、稳定性测试。

TPC-C模型是以一个在线零售业为例,设计的一种模型,具体架构图参考
tpcc测试库数据比例图
MySQL-tpcc测试
tpcc使用说明

tpcc测试库数据表关系图
MySQL-tpcc测试
tpcc使用说明

二、编译安装

1、下载地址

https://github.com/Percona-Lab/tpcc-mysql

2、修改程序,以实现对MGR的支持

如果是测试MGR模式,则需要手动修改与history表相关内容,因为该表没有主键,而MGR却要求表必须有主键:否则,可跳过。

# unzip tpcc-mysql-master.zip

1)在建表语句中,新增主键列:

# vim tpcc-mysql-master/create_table.sql 

大约在62行处为history表的建表语句;在其中添加建立主键id的语句:

create table history (
id bigint not null auto_increment,  -- 新增id自增列
h_c_id int,
h_c_d_id tinyint,
h_c_w_id smallint,
h_d_id tinyint,
h_w_id smallint,
h_date datetime,
h_amount decimal(6,2),
h_data varchar(24),
PRIMARY KEY (id) -- 新增主键(注意与上一行的逗号分隔)
) Engine=InnoDB;

2)修改INSERT语句

# vim tpcc-mysql-master/src/load.c

大约在234行处为history表的INSERT语句,修改为如下内容:

"INSERT INTO history values(null,?,?,?,?,?,?,?,?)",  48) ) goto Error_SqlCall_close; 

修改说明:
对主键列id在插入时新增null值,以便id自增;
将记录原INSERT语句字符数校验的数字从43改为48;

以上2不修改完成后可以继续,执行编译了。

## 创建数据库及导入表结构

create  database tpcc  charset=utf8mb4

mysql -h192.16.1.100 -uroot -p123456 tpcc <create_table.sql

表关系如下:

tpcc创建了九张测试表:
客 户:customer 表
地 区:district 表
商 品:item 表
历史订单:history 表
新订单 :new_orders 表
订单状态:order_line 表
订 单:orders 表
库存状态:stock 表
仓 库:warehouse 表

tpcc-mysql的业务逻辑及其相关的几个表作用如下:
New-Order==>新订单,一次完整的订单事务,几乎涉及到全部表
Payment ==>支付,主要对应 orders、history 表
Order-Status==>订单状态,主要对应 orders、order_line 表
Delivery ==>发货,主要对应 order_line 表
Stock-Level==>库存,主要对应 stock 表

## 导入数据

./tpcc_load -h 192.168.1.100 -P 3306 -d tpcc -u root -p '123456' -w 5 

并行导入数据,修改load.sh

export LD_LIBRARY_PATH=/usr/local/mysql/lib/mysql/
DBNAME=$1
WH=$2
HOST=192.168.1.100
user=root
password=123456
STEP=50

./tpcc_load $HOST $DBNAME $user $password $WH 1 1 $WH >> 1.out &

x=1

while [ $x -le $WH ]
do
 echo $x $(( $x + $STEP - 1 ))
./tpcc_load $HOST $DBNAME $user $password $WH 2 $x $(( $x + $STEP - 1 ))  >> 2_$x.out &
./tpcc_load $HOST $DBNAME $user $password $WH 3 $x $(( $x + $STEP - 1 ))  >> 3_$x.out &
./tpcc_load $HOST $DBNAME $user $password $WH 4 $x $(( $x + $STEP - 1 ))  >> 4_$x.out &
 x=$(( $x + $STEP ))
done

## 模拟压测

./tpcc_start -h192.168.1.100 -P 3306 -tpcc -uroot -p '123456' -w 5 -c 32 -r 10 -l 30 -i 10 -f tpcc_mysql.log -t tpcc_mysql.rtx

-h:测试主机
-d:测试的数据库
-u:测试的用户
-p:测试用户的密码
-w:测试的warehouse数
-c:测试的连接线程数
-r:预热时间,warmup_time,以秒为单位,默认是10秒,目的是为了将数据加载到内存
-l:测试时间,默认为20秒
-i:report_interval指定生成报告的间隔时间
-f:report_file将测试中各项操作的记录输出到指定文件内保存
-t:trx_file输出更详细的操作信息到指定文件内保存

备注:
真实测试场景中,建议预热时间不小于3分钟,持续压测时长不小于20分钟,否则测试数据可能不具参考意义。