当前分析针对版本:MariaDB 10.5

线上出现报错:can't create more than max_prepared_stmt_count statements。造成这个错误的直接原因就是同时开启了 prepare 句柄太多导致的,所以比较直接的方式是调大参数,首先查看设置的值:

show global variables like 'max_prepared_stmt_count';

如果这个值比较小,我们需要手动调大:

set global max_prepared_stmt_count=1048576;

或者也可以修改配置文件,不过需要重启。

配置好之后我们注意观察下面几个参数的变化:

show global status like 'com_stmt%';

主要涉及下面的 3 个参数:

  1. Com_stmt_close 表示 prepare 语句关闭的次数
  2. Com_stmt_execute 表示 prepare 语句执行的次数
  3. Com_stmt_prepare 表示语句 prepare 的次数

注意这些参数,正常来说 3 者应该差不多,如果打开的和关闭的差距越来越大,那说明可能存在很多 statement 没有关闭,如果一直增长直到出现上面的报错,那说明肯定有程序存在 bug,忘记的关闭 statement 最终导致超出了限制。

如果程序比较少,应该很容易排查,但是如果操作当前 MySQL 实例的程序比较多,就需要从数据库角度来分析了。

第一种方法可以开启日志追踪打印所有 SQL 执行的情况:

set global general_log = 'ON';

这样所有的 SQL 执行情况都会打印出来,我们需要从日志中找到没有 close 的 prepare 从而定位问题,但是如果 SQL 特别多同时日志中有没有客户端来源,看日志会非常麻烦,不容易分析问题。

然后第二种方法就是开启性能追踪,首先需要确认性能追踪模式是否开启:

SHOW VARIABLES LIKE 'performance_schema';

如果没有开启,这个参数是无法直接动态开启的,因为这个是只读的变量,必须通过配置文件修改:

[mysqld]
performance_schema=ON

保存配置后,确定在不影响生产环境的前提下重启数据库:

systemctl restart mariadb

重启后我们需要开启下面这些性能追踪相关的表:

use performance_schema;
show tables like '%statement%';

我们主要用到下面这几个表:

  1. events_statements_current 当前正在执行查询的表
  2. events_statements_history 最近的10个完成的查询,通过 performance_schema_events_statements_history_size 可以调整大小,限制在 1024 之内
  3. events_statements_history_long 最近的1万个完成的查询,具体通过参数 performance_schema_events_statements_history_long_size 配置大小,限制在 1048576 之内

表结构参考:https://mariadb.com/kb/en/performance-schema-events_statements_current-table/

我们需要确认 setup_instruments 和 setup_consumers 中是否开启采集:

select * from setup_instruments where name like "statement/%";
-- 如果 enabled 是 NO 则可以开启
update setup_instruments set enabled="YES" where name like "statement/%";

确认 setup_consumers 中是否开启:

select * from setup_consumers;
-- 开启参数
update setup_consumers set enabled='YES' where name in ('events_statements_current', 'events_statements_history', 'events_statements_history_long');

表结构参考:https://mariadb.com/kb/en/performance-schema-setup_consumers-table/

开启后如果有查询我们在对应的事件表中应该可以查询到结果,也可以编写一个程序执行 prepare 单不要关闭,此时我们就可以通过 events_statements_current 表查询到具体的 SQL。

那么最后我们应该怎么找到是哪个客户端发起的查询呢?我们注意到上面的查询事件表中都有 THREAD_ID 字段,如果想看到具体正在进行的查询可以查询 processlist 表,那么这时候 threads 表就可以将 THREAD_ID 和 PROCESSLIST_ID 给关联起来,也就是说我们此时应该通过 threads 表通过 THREAD_ID 查询得到 PROCESSLIST_ID。

threads 表结构参考:https://mariadb.com/kb/en/performance-schema-threads-table/

然后我们查询具体的任务来源:

show processlist;
select * from information_schema.processlist where ID=<PROCESSLIST_ID>;

这样就可以找到具体查询来源的客户端了,processlist 表结构参考:https://mariadb.com/kb/en/information-schema-processlist-table/

我们可以通过 join 实现组合查询,快速找到出现问题的 SQL 来源,然后就可以基于机器和端口号进一步找到客户端进程的具体位置,从而方面定位问题。

Reference:

  1. https://stackoverflow.com/questions/26660763/mysql-performance-schema-not-working-properly
  2. https://www.cnblogs.com/Courage129/p/14188422.html

MySQL 分析查询与来源机器的更多相关文章

  1. mysql慢查询日志分析工具 mysqlsla(转)

    mysql数据库的慢查询日志是非常重要的一项调优辅助日志,但是mysql默认记录的日志格式阅读时不够友好,这是由mysql日志记录规则所决定的,捕获一条就记录一条,虽说记录的信息足够详尽,但如果将浏览 ...

  2. Linux下MySQL慢查询分析mysqlsla安装使用

    说明: 操作系统:CentOS 5.X 64位 MySQL版本:mysql-5.5.35 MySQL配置文件:/etc/my.cnf MySQL 数据库存放目录:/data/mysql 实现目的:开启 ...

  3. Mysql慢查询和慢查询日志分析

     Mysql慢查询和慢查询日志分析   众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的.下面总结一些使用过或者研究过的经验,从配置以 ...

  4. MySQL 慢查询日志分析及可视化结果

    MySQL 慢查询日志分析及可视化结果 MySQL 慢查询日志分析 pt-query-digest分析慢查询日志 pt-query-digest --report slow.log 报告最近半个小时的 ...

  5. mysqlsla 分析mysql慢查询日志

    发现有一个工具mysqlsla,分析查询日志比 mysqldumpslow分析的会更清晰明了! 安装mysqlsla: 下载mysqlsla-2.03.tar.gz [root@yoon export ...

  6. mysql慢查询分析工具 mysqlsla 安装

    概述 mysqlsla 是一款很不错的mysql慢查询日志分析工具,而且简单易用.mysqlsla 是用perl编写的脚本,运行需要perl-DBI和per-DBD-Mysql两模块的支持.mysql ...

  7. 企业级中带你ELK如何实时收集分析Mysql慢查询日志

    什么是Mysql慢查询日志? 当SQL语句执行时间超过设定的阈值时,便于记录到指定的日志文件中或者表中,所有记录称之为慢查询日志 为什么要收集Mysql慢查询日志? 数据库在运行期间,可能会存在这很多 ...

  8. mysql死锁-查询锁表进程-分析锁表原因【转】

    查询锁表进程: 1.查询是否锁表 show OPEN TABLES where In_use > 0;   2.查询进程     show processlist   查询到相对应的进程===然 ...

  9. MySQL慢查询日志总结 日志分析工具mysqldumpslow

    MySQL慢查询日志总结 - 潇湘隐者 - 博客园 https://www.cnblogs.com/kerrycode/p/5593204.html 2016-06-17 10:32 by 潇湘隐者, ...

  10. Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解

    Mysql优化_慢查询开启说明及Mysql慢查询分析工具mysqldumpslow用法讲解   Mysql慢查询开启 Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应 ...

随机推荐

  1. iVCam 可以当电脑的摄像头 同一个wifi

    iVCam 可以当电脑的摄像头 同一个wifi

  2. finger 单词学习 词源通 five (penkwe)

    印欧语penkwe - finger p通f 元音i通e 或者说从e降级到i (aeiou) n保持不变 k通g we 怎么转的 er 我也不知道,不嫌麻烦就是 w -> m -> n - ...

  3. manjaroLinux-xfce4设置显示桌面快捷键

    1.打开窗口快捷键 2.寻找显示桌面 3.设置快捷键 啊!简单的我都不想写了,这不是为让像以前的"我"--小白,食用性更好一点吗?

  4. day10-面向对象

    面向对象 1.什么是面向对象? 1.1面向过程&&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么-- 面对过程适合处理一些较为简单地问题 面向对象思想 物以类聚,分 ...

  5. 项目升级到Android31版本dlopen找不到系统so库文件

    简介 最近有个海外项目需要把之前项目从30版本升级到31版本,升级后发现就发现一个问题: 因为我们的项目是系统签名的apk,所以集成到系统中后是没有任何问题的,但是当我们手动安装后就会出现使用dlop ...

  6. Linux Subreaper 机制及内核态逃离方法(PR_SET_CHILD_SUBREAPER, prctl, systemed)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   无 前言   由于某些其他的原因,我们在测试另外一 ...

  7. 记录--封装一个通过js调用的全局vue组件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在使用vue项目编写的时候,不可避免的会碰到需要时js api来调用组件进行显示的情况 例如饿了么element ui 的 Noti ...

  8. 记录--vue打印插件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 网页实现打印 可以选择性的打印某一部分 的vue组件 1.引入 把print.js 下载到本地,然后放在src 下面添加文件夹里. pri ...

  9. WPF 模仿微信顶部断网提示气泡

    直接看顶部气泡的效果吧 顶部气泡主要要做三个工作 1.定位到顶部居中 2.气泡需要跟随窗体 3.气泡不可以遮挡住其他程序界面 原生的WPF Poupu控件不会跟随目标移动且在Z轴上会置顶,所以存在打开 ...

  10. 8分钟搞懂Java中的各种锁

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/f9fc66cb.html 前言 你好,我是测试蔡坨坨. 在前几篇Redis相关文章中都说到了锁,同时我们在参加设计评审或者c ...