tpcc-mysql介绍
TPC(Tracsaction Processing Performance Council) 事务处理性能协会是一个评价大型数据库系统软硬件性能的非盈利的组织,TPC-C是TPC协会制定的,用来测试典型的复杂OLTP系统的性能。Tpcc-mysql是percona基于tpcc衍生出来的产品,专用于mysql基准测试.
安装与使用
官网地址:https://github.com/Percona-Lab/tpcc-mysql
实验环境:阿里云轻量应用服务器
步骤:
1)下载源代码
git clone https://github.com/Percona-Lab/tpcc-mysql.git
2)编译
在编译之前需要安装mysql和mysql编译时链接的库
sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev
cd tpcc-mysql/src
make
编译完成后会生成两个可执行文件,tpcc_load是导入数据的脚本,tpcc_start是执行测试的脚本.
3) 加载数据
- 创建数据库
mysqladmin -u root -p passwd create tpcc1000
- 创建表
mysql tpcc1000 < create_table.sql
- 创建相关索引和主外键(这一步也可以在加载数据之后完成)
mysql tpcc1000 < add_fkey_idx.sql
- 填充数据
- 简单的步骤是
./tpcc_load -h127.0.0.1 -d tpcc1000 -u root -p passwd -w 100
,可以通过tpcc_load --help
查看所有的选项,最后一个参数是仓库的个数,例如创建100个仓库(warehouse)并填充数据 - 加载数据比较慢(20分钟),可用loah.sh 脚本并行加载,后面有写
- 简单的步骤是
显示一下创建的表:
$mysql -uroot -p -e "show tables from TPCC" +--------------------+ | Tables_in_tpcctest | +--------------------+ | customer | | district | | history | | item | | new_orders | | order_line | | orders | | stock | | warehouse | +--------------------+
4)开始基准测
./tpcc_start -h 127.0.0.1 -p 3306 -d tpcc1000 -u root -p "123123" -w 100 -c 10 -r 100 -l 300 -i 20 -f /var/log/tpcc_mysql.log -t /var/log/tpcc_mysql.rtx
- |hostname| |port| |dbname| |user| |WAREHOUSES| |CONNECTIONS| |WARMUP TIME| |BENCHMARK TIME|
pcc_start --help
查看所有选项
参数说明:
-w warehouse 仓库;
-c 连接数;
-r warmup_time:指定预热时间,以秒为单位,默认是10秒,主要目的是为了将数据加载到内存;
-l running_time:指定测试执行时间,以秒为单位,默认是20秒;
-i report_interval:指定生产报告的时间间隔,默认是10秒,我这里设置了20秒;
-f report_file:将测试中各项操作的记录输出到指定文件内保存;
-t trx_file:输出更详细的操作信息到指定文件内保存;
结果解读
见下一篇博客 tpcc-mysql运行结果解读
至此基本的已经完成,没有遇到问题不用往下看了
并发加载数据
单进程加载
./tpcc_load -h127.0.0.1 -d tpcc1000 -u root -p passwd -w 100
并发加载
需要根据你的实际情况修改一下(主要是改密码
方法一
./load.sh tpcc1000 100
通过load.sh并发加载数据(创建100个warsehouse)
造数据成功后,会提示:…DATA LOADING COMPLETED SUCCESSFULLY.
方法二
GitHub上另一个并行加载脚本: https://gist.github.com/sh2/3458844
根据实际情况情况修改用户名、密码、数据库名,初始仓库为10个。
由于最新版本tpcc_load使用方法需要显示使用参数,修改脚本如下
vim tpcc_load_parallel.sh
1 #!/bin/bash 2 3 # Configration 4 5 MYSQL=/usr/bin/mysql 6 TPCCLOAD=./tpcc_load 7 TABLESQL=./create_table.sql 8 CONSTRAINTSQL=./add_fkey_idx.sql 9 DEGREE=`getconf _NPROCESSORS_ONLN` 10 11 SERVER=localhost 12 DATABASE=tpcc1000 13 USER=root 14 PASS=123123 15 WAREHOUSE=10 16 17 # Load 18 19 set -e 20 $MYSQL -u $USER -p$PASS -e "DROP DATABASE IF EXISTS $DATABASE" 21 $MYSQL -u $USER -p$PASS -e "CREATE DATABASE $DATABASE" 22 $MYSQL -u $USER -p$PASS $DATABASE < $TABLESQL 23 $MYSQL -u $USER -p$PASS $DATABASE < $CONSTRAINTSQL 24 25 echo 'Loading item ...' 26 $TPCCLOAD -h $SERVER -d $DATABASE -u $USER -p $PASS -w $WAREHOUSE 1 1 -n $WAREHOUSE > /dev/null 27 28 set +e 29 STATUS=0 30 trap 'STATUS=1; kill 0' INT TERM 31 32 for ((WID = 1; WID <= WAREHOUSE; WID++)); do 33 echo "Loading warehouse id $WID ..." 34 35 ( 36 set -e 37 38 # warehouse, stock, district 39 $TPCCLOAD -h $SERVER -d $DATABASE -u $USER -p $PASS -w $WAREHOUSE 2 -m $WID -n $WID > /dev/null 40 41 # customer, history 42 $TPCCLOAD -h $SERVER -d $DATABASE -u $USER -p $PASS -w $WAREHOUSE 3 -m $WID -n $WID > /dev/null 43 44 # orders, new_orders, order_line 45 $TPCCLOAD -h $SERVER -d $DATABASE -u $USER -p $PASS -w $WAREHOUSE 4 -m $WID -n $WID > /dev/null 46 ) & 47 48 PIDLIST=(${PIDLIST[@]} $!) 49 50 if [ $((WID % DEGREE)) -eq 0 ]; then 51 for PID in ${PIDLIST[@]}; do 52 wait $PID 53 54 if [ $? -ne 0 ]; then 55 STATUS=1 56 fi 57 done 58 59 if [ $STATUS -ne 0 ]; then 60 exit $STATUS 61 fi 62 63 PIDLIST=() 64 fi 65 done 66 67 for PID in ${PIDLIST[@]}; do 68 wait $PID 69 70 if [ $? -ne 0 ]; then 71 STATUS=1 72 fi 73 done 74 75 if [ $STATUS -eq 0 ]; then 76 echo 'Completed.' 77 fi 78 79 exit $STATUS
遇到的几个问题
1. 需要安装mysql,对应的链接库也要安装,makefile中需要(不然make命令报错)
!sudo apt-get install mysql-server //服务端 !sudo apt-get install mysql-client //客户端 !sudo apt-get install libmysqlclient-dev //程序编译时链接的库
2. 执行 tpcc_load -h127.0.0.1 -d tpcc1000 -u root -p "" -w 100时,报错ERROR 1698 (28000): Access denied for user 'root'@'localhost' (using password: NO)
解决方法:
方法很简单,查看一下user表,错误的起因就是在这里, root的plugin被修改成了auth_socket,用密码登陆的plugin应该是mysql_native_password。(由于可以用sudo mysql -uroot -p进入,所以并不需要以安全模式启动)
mysql> select user, plugin from mysql.user; +-----------+-----------------------+ | user | plugin | +-----------+-----------------------+ | root | auth_socket | | mysql.sys | mysql_native_password | | dev | mysql_native_password | +-----------+-----------------------+ 3 rows in set (0.01 sec)
只要把auth_socket改成mysql_native_password就行了:
mysql> update mysql.user set authentication_string=PASSWORD('mima'), plugin='mysql_native_password' where user='root'; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
之后退出mysql,重启一下,就可以了.
原因应该是安装时没有给root设置密码,但是步骤3的前三个命令默认无密码...,直接运行会报错:
root@iZj6c9c6vaqj1i0a9j7h78Z:/home/admin/tpcc-mysql# mysqladmin create tpcc1000
mysqladmin: connect to server at 'localhost' failed
只需再后面加上 -p密码 ,警告不安全可不管。
参考链接:
1. https://www.jianshu.com/p/2b63c65caf6a