mysql max_prepared_stmt_count_max_prepared_stmt_count 问题与Sysbench 工具简介
最近一直在做关于MySQL InnoDB Cluster的压力测试,下面就我使用的压测工具sysbench与压测过程中遇到的FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"进行分析。
问题引入
在做压力测试的时候,我使用了sysbench 1.1.0-faaff4f版本,测试命令如下:
sysbench oltp_read_only.lua --mysql-host=*.*.*.* --mysql-port=3306 --mysql-user=root --mysql-password=1234 --tables=10 --table-size=10000000 --time=600 --report-interval=10 --threads=1024 prepare
问题主要出现在这个--threads身上,我的压测线程数增长是从 1,2,4,8,16,32,64,128,256,512,1024,在1024前压测都是没有问题了,但当线程数增长到了1024后,sysbench 报错了。
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
这个问题很好解决,上网一查就知道怎么解决,登录mysql,调整这个变量值的大小即可。mysql> show global status like 'com_stmt%';
查看如下3个参数值:
Com_stmt_close prepare语句关闭的次数
Com_stmt_execute prepare语句执行的次数
Com_stmt_prepare prepare语句创建的次数
Com_stmt_prepare 减去 Com_stmt_close 大于 max_prepared_stmt_count 就会出现这种错误。那么我们手动调高max_prepared_stmt_count(取值范围:0 - 1048576,默认16382)即可解决mysql> set global max_prepared_stmt_count=500000;
那这里就容易再次引发一个问题,我们设置max_prepared_stmt_count为50万,但是我们其实现在是知其然不知其所以然,max_prepared_stmt_count是干什么的,为什么会超过默认值这个才是我们真正应该关心的。
max_prepared_stmt_count基本介绍
这个参数是MySQL的一个基本参数,其是用来限制一个session内最多可以有多少条预编译语句,什么是sql的预编译,下面这篇文章讲得很好,网上也有很多参考,大家可以直接查。MySQL的SQL预处理(Prepared) - GeaoZhang - 博客园www.cnblogs.com
那为什么我们会超过max_prepared_stmt_count的默认大小16382呢?下面我们就先来介绍一下sysbench工具中关于压测数据库的lua脚本。
sysbench 压测数据库的lua脚本个人理解
sysbench官方默认帮我们配置了默认压测数据库的脚本:
这几个脚本里面的功能我们简单说明一下:
oltp_common.lua 脚本是提供给其他脚本如oltp_read_only.lua调用的,是基本的一系列函数。oltp_read_only.lua 主要的工作根据压测需求来调用oltp_common.lua中的函数。
sysbench 的基本工作流程:prepare:
sysbench oltp_read_only.lua --mysql-host=x.x.x.x --mysql-port=3306 --mysql-user=root --mysql-password=password --tables=10 --table-size=10000000 --threads=1024 prepare
这个语句的基本作用就是调用建表语句,建立十张表,每张表大小1千万行。
run:
sysbench oltp_read_only.lua --mysql-host=10.191.1.235 --mysql-port=6446 --mysql-user=root --mysql-password=vm000 --tables=10 --table-size=10000000 --threads=1024 --time=600 --report_interval=10 run
这个的过程实际是:建立数据库连接-->预编译SQL语句-->执行预编译语句
cleanup:
sysbench oltp_read_only.lua --mysql-host=x.x.x.x --mysql-port=3306 --mysql-user=root --mysql-password=password --tables=10 --table-size=10000000 --threads=1024 cleanup
这里的实际过程是:直接将数据库的表drop掉。
从第二步run 我们就可以知道我们为什么会出现超过max_prepared_stmt_count的默认大小16382的报错了。我们先来看一下oltp_read_only.lua代码内容:
这里面函数 function prepare_statements()中的两个if判断结果均为true,这个是因为在默认情况下oltp_common.lua中已经指定skip_trx=false, range_selects=trueoltp_common.lua
所以这里一共需要调用7个预编译函数:
prepare_point_selects()
prepare_begin()
prepare_commit()
prepare_simple_ranges()
prepare_sum_ranges()
prepare_order_ranges()
prepare_distinct_ranges()
因为我们一共有10张表,相对于每一张表都需要执行7个预编译语句,所以我们可以计算:
在512个线程并发下,每一个线程我们可以视之为一个用户,每一个用户需要在每一张表上预编译7条SQL语句,所以一共prepare的语句是:
Com_stmt_prepare = 512 * 10 * 7 = 35840 > 16382(max_prepared_stmt_count statements 默认16382)
所以就出现上面的错误:
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
这个是一个大概的推测值,因为实际执行时还会有出入。这个数字可以方便我们在出现上面问题后,设置max_prepared_stmt_count_statements的值有一个参考的方向,而不是盲目地设置成最大。
以上仅是个人的见解,如果有什么出错的,请大佬们指正,谢谢。
mysql max_prepared_stmt_count_max_prepared_stmt_count 问题与Sysbench 工具简介相关推荐
- sysbench压力测试工具简介和使用(一)
sysbench压力测试工具安装和参数介绍 一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据 ...
- 详解 MySQL 基准测试和 sysbench 工具
前 言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处 ...
- sysbench mysql_通过sysbench工具实现MySQL数据库的性能测试
1.背景 sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试.sysbench 支持的测试有CPU运算性能测试.内存分配及传输速度测试.磁盘IO性能测试.POS ...
- mysql 实例名_不为人知的MySQL高可用复制管理工具——Orchestrator简介
背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:O ...
- sysbench工具使用
sysbench工具使用 简介 第一个 sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试.sysbench 支持的测试有CPU运算性能测试.内存分配及传输速度 ...
- 测试 MySQL 性能的几款工具
有一些有用的工具可以测试MySQL 和基于MySQL 的系统的性能.这里将演示如何利用这些工具进行测试. mysqlslap mysqlslap可以模拟服务器的负载,并输出计时信息.它包含在MySQL ...
- MySQL查看SQL语句执行效率和mysql几种性能测试的工具
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...
- mysql 压力测试知乎_MySQL查看SQL语句执行效率和mysql几种性能测试的工具
网络中整理,记录下,朋友们应该用得到! Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮 ...
- 静态代码检查工具简介
静态代码检查工具简介 在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷.传统的代码复审.同行评审,通过人工方式来检查缺陷仍然是一件耗时耗力的事情.Java 静态代码分 ...
最新文章
- 某程序员感叹自己学历虽低,却能进入阿里!虽然只是p6,却面过不少清北毕业生!清北毕业生也没什么了不起,水货一抓一大把!...
- Func与Action
- CentOS7系统ifconfig无法使用的解决方法
- 很强的PHP图片处理类
- 指尖检测的几种新方法
- css文字下滑,CSS3 文本下落渐变动效
- C++ primer 笔记(二)
- gpgga格式读取MATLAB,GPS编码格式及读取.doc
- 案例解析|从数据规划、业务分析到管理决策的数据治理方案
- Android手机编程初学遇到的问题及解决方法
- css选择器_css入门必学,基础重难点,css选择器
- 商业智能BI系统对企业有什么好处
- c语言位运算知乎,07-C语言运算符-指趣学院
- dtft性质及证明_数字信号处理1 时域分析和DTFT.pptx
- JavaScript 全栈工程师培训教程
- 格林公式求圆并的面积及重心
- 转:诺贝尔经济学奖得主与数学
- Linux who命令用法详解命令用法详解
- C语言制作通讯录(新手练习推荐)
- 什么是混合移动App开发?
热门文章
- Wireshark TCP数据包跟踪 还原图片 WinHex应用
- 河北单招计算机英语,2020年河北单招英语冲刺试题(含答案)
- Docker Desktop卸载后Hyper-V服务驻留与第三方虚拟机产生冲突
- vue 移入显示_vue 鼠标移入移出事件执行多次(尤其ie)
- 【javascript基础——系列10】js中隐藏元素的几种方法以及代码
- cors java跨域解决方案
- 调用智能Ai画图在线生成图片生成视频的工具集API说明等
- 智能客服机器人如何帮助公司更好地管理客户
- sql内连接中,等值连接与自然连接的区别
- C# winform textbox 水印效果