最近一直在做关于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 工具简介相关推荐

  1. sysbench压力测试工具简介和使用(一)

    sysbench压力测试工具安装和参数介绍 一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据 ...

  2. 详解 MySQL 基准测试和 sysbench 工具

    前 言 作为一名后台开发,对数据库进行基准测试,以掌握数据库的性能情况是非常必要的.本文介绍了MySQL基准测试的基本概念,以及使用sysbench对MySQL进行基准测试的详细方法. 文章有疏漏之处 ...

  3. sysbench mysql_通过sysbench工具实现MySQL数据库的性能测试

    1.背景 sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试.sysbench 支持的测试有CPU运算性能测试.内存分配及传输速度测试.磁盘IO性能测试.POS ...

  4. mysql 实例名_不为人知的MySQL高可用复制管理工具——Orchestrator简介

    背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:O ...

  5. sysbench工具使用

    sysbench工具使用 简介 第一个 sysbench是一款压力测试工具,可以测试系统的硬件性能,也可以用来对数据库进行基准测试.sysbench 支持的测试有CPU运算性能测试.内存分配及传输速度 ...

  6. 测试 MySQL 性能的几款工具

    有一些有用的工具可以测试MySQL 和基于MySQL 的系统的性能.这里将演示如何利用这些工具进行测试. mysqlslap mysqlslap可以模拟服务器的负载,并输出计时信息.它包含在MySQL ...

  7. MySQL查看SQL语句执行效率和mysql几种性能测试的工具

    Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...

  8. mysql 压力测试知乎_MySQL查看SQL语句执行效率和mysql几种性能测试的工具

    网络中整理,记录下,朋友们应该用得到! Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮 ...

  9. 静态代码检查工具简介

    静态代码检查工具简介 在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷.传统的代码复审.同行评审,通过人工方式来检查缺陷仍然是一件耗时耗力的事情.Java 静态代码分 ...

最新文章

  1. 某程序员感叹自己学历虽低,却能进入阿里!虽然只是p6,却面过不少清北毕业生!清北毕业生也没什么了不起,水货一抓一大把!...
  2. Func与Action
  3. CentOS7系统ifconfig无法使用的解决方法
  4. 很强的PHP图片处理类
  5. 指尖检测的几种新方法
  6. css文字下滑,CSS3 文本下落渐变动效
  7. C++ primer 笔记(二)
  8. gpgga格式读取MATLAB,GPS编码格式及读取.doc
  9. 案例解析|从数据规划、业务分析到管理决策的数据治理方案
  10. Android手机编程初学遇到的问题及解决方法
  11. css选择器_css入门必学,基础重难点,css选择器
  12. 商业智能BI系统对企业有什么好处
  13. c语言位运算知乎,07-C语言运算符-指趣学院
  14. dtft性质及证明_数字信号处理1 时域分析和DTFT.pptx
  15. JavaScript 全栈工程师培训教程
  16. 格林公式求圆并的面积及重心
  17. 转:诺贝尔经济学奖得主与数学
  18. Linux who命令用法详解命令用法详解
  19. C语言制作通讯录(新手练习推荐)
  20. 什么是混合移动App开发?

热门文章

  1. Wireshark TCP数据包跟踪 还原图片 WinHex应用
  2. 河北单招计算机英语,2020年河北单招英语冲刺试题(含答案)
  3. Docker Desktop卸载后Hyper-V服务驻留与第三方虚拟机产生冲突
  4. vue 移入显示_vue 鼠标移入移出事件执行多次(尤其ie)
  5. 【javascript基础——系列10】js中隐藏元素的几种方法以及代码
  6. cors java跨域解决方案
  7. 调用智能Ai画图在线生成图片生成视频的工具集API说明等
  8. 智能客服机器人如何帮助公司更好地管理客户
  9. sql内连接中,等值连接与自然连接的区别
  10. C# winform textbox 水印效果