开始之前先做个小实验
今天登录一台测试机,发现MySQL服务起不来,查看日志发现报错
刚开始认为mysql库中的几个关键表损坏了,想着去修复一下呢,结果并不是,更狠
也不知道它经历了啥,里面的系统库都没有了。后来我想系统库大部分表啥的都一样,可能就里面的数据有不一样的。如果把同版本的msyql sys performance_schema 移动过来并授权,应该就能启动,于是从隔壁同版本的mysql scp系统库导data目录
查看下
启动 ,没有问题
Ok 正常运转。
下面要对MySQL 进行压测。
使用sysbench 工具进行压测
Sysbench 简介
sysbench是一款开源的多线程工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试,数据库目前支持MySQL/Oracle/PostgreSQL。
对于大多数版本Linux 可以直接yum 安装
yum -y installsysbench
也可以编译安装
默认支持MySQL,如果需要测试Oracle/PostgreSQL,则在configure时需要加上–with-oracle或者–with-pgsql参数
./configure--prefix=/u01/sysbench --with-mysql-includes=/opt/mysql/include/mysql--with-mysql-libs=/opt/mysql/lib/mysql
make &&make install
安装
yum install -y automake libtool 依赖包
ln -sf /usr/local/mysql/lib/libmysql*/usr/lib64
ln -sf /usr/local/mysql/lib/libmysqlclient.so/usr/lib64/libmysqlclient_r.so
wgethttp://imysql.com/wp-content/uploads/2014/09/sysbench-0.4.12-1.1.tgz
tar zxf sysbench-0.4.12-1.1.tgz
cd sysbench-0.4.12-1.1/
./autogen.sh
./configure--with-mysql-includes=/usr/local/mysql/include/ --with-mysql-libs=/usr/local/mysql/lib/
make
make install
sysbench –help
说明没有问题 安装成功
需要关注的事项
MySQL oltp 测试脚本
1 准备数据(如果没有做全局变量,需要在绝对路径下执行)
./sysbench --mysql-host=192.168.193.128 --mysql-port=3306 --mysql-user=root--mysql-password=123456--test=/root/sysbench-0.4.12-1.1/sysbench/tests/db/oltp.lua --oltp-table-size=10000--oltp_tables_count=50 --rand-init=on --mysql-table-engine=innodb prepare
--test=tests/db/oltp.lua表示调用 tests/db/oltp.lua 脚本进行 oltp 模式测试,
oltp --oltp_tables_count=50 表示会生成 50个测试表
--oltp-table-size=10000
表示每个测试表填充数据量为10000行
--rand-init=on 表示每个测试表都是用随机数据来填充的
2 执行测试
./sysbench --mysql-host=192.168.193.128--mysql-port=3306 --mysql-user=root --mysql-password=123456--test=/root/sysbench-0.4.12-1.1/sysbench/tests/db/oltp.lua --oltp-table-size=10000--oltp_tables_count=50 --mysql-table-engine=innodb --num-threads=100 --oltp-read-only=off--report-interval=10 --rand-type=uniform --max-time=1800 --max-request=0--percentile=99 run >> /root/test.log
--num-threads=1024
表示发起1024个并发连接
--oltp-read-only=off
表示不要进行只读测试,也就是会采用读写混合模式测试
--report-interval=10
表示每10秒输出一次测试进度报告
--rand-type=uniform
表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托)
--max-time=1800
表示最大执行时长为1800秒,测试将在这个时间后结束
--max-requests=0
表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长
--percentile=99 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值
3 数据删除
./sysbench --mysql-host=192.168.193.128--mysql-port=3306 --mysql-user=root --mysql-password=123456--test=/root/sysbench-0.4.12-1.1/sysbench/tests/db/oltp.lua --oltp-table-size=1000--oltp_tables_count=20 --mysql-table-engine=innodb --num-threads=100 --oltp-read-only=off--report-interval=10 --rand-type=uniform --max-time=600 --max-request=0 --percentile=99 cleanup
4 看测试报告
当然测试的结果跟测试的数据量是有关的,本次测试量50*10000,50万行数据。其实没有多少,所以测试结果看着很好,其实没有太大参考价值。因为数据量还不到100m。所以,加大数据量才有价值。
如果加大数据量的话,比如上亿数据,是需要时间的。有没有可以快速压测的方法呢。有的,MySQL自带mysqlslap工具。mysqlslap是mysql自带的基准测试工具。
优点:查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。
常用的选项
--concurrency
并发数量,多个可以用逗号隔开
--engines
要测试的引擎,可以有多个,用分隔符隔开,如--engines=myisam,innodb
--iterations
要运行这些测试多少次
--auto-generate-sql
用系统自己生成的SQL脚本来测试
--auto-generate-sql-load-type
要测试的是读还是写还是两者混合的(read,write,update,mixed)
--number-of-queries
总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算
--number-int-cols
创建测试表的int型字段数量
--number-char-cols
创建测试表的chat型字段数量
--create-schema
测试的database
--query
自己的SQL 脚本执行测试
--only-print
如果只想打印看看SQL语句是什么,可以用这个选项
--auto-generate-sql-add-autoincrement
代表对生成的表自动添加auto_increment列,从5.1.18版本开始
mysqlslap--concurrency=200,300,500,650 --iterations=3 --number-int-cols=20--number-char-cols=30 --auto-generate-sql --auto-generate-sql-add-autoincrement--auto-generate-sql-load-type=mixed --engine=innodb --number-of-queries=2000--verbose -udzyd -p123456
模拟并发200,300,500,600客户端 表int20 char30混合查询 每次2000查询,执行3次
mysqlslap --concurrency=200,250 --iterations=2--create-schema=dzyd -e innodb --query="/root/query.sql" -uroot-p123456
使用自建的sql来测试,这样比较准确,本次自建的sql来自该项目原数据库的慢查询日志中sql