最近产品一直在这个错

Can't create more than max_prepared_stmt_count statements (current value: 16382) MYSQL预编译SQL数量超过限制问题

当缓存的预编译SQL数量超过默认最大值时 就会产生如上错误 导致数据库直接无法使用 线上出现这个问题真是愁死人

话不多说 直接上解决思路:

当时发现这个问题的时候  查了下数据库预编译SQL创建次数

show global status like 'com_stmt%';

Can't create more than max_prepared_stmt_count statements (current value: 16382) MYSQL预编译SQL数量超过限制问题

发现close 永远是0 这个问题源于vertx 以下是我在vertx官方提交的issue 在下个版本会做修复

https://github.com/vert-x3/issues/issues/444

但这仍然不是导致该问题最主要的原因  主要问题是为什么会创建了将近5万次的预编译SQL

Can't create more than max_prepared_stmt_count statements (current value: 16382) MYSQL预编译SQL数量超过限制问题

在同一连接下 相同结构的预编译SQL是不会再被创建的  那么正常情况是不可能创建出5w个预编译SQL

所以目前可以猜测  肯定是在某个地方出现了动态的预编译SQL

SELECT * FROM PERFORMANCE_SCHEMA .prepared_statements_instances;

执行以上SQL查询出已经缓存的预编译SQL

Can't create more than max_prepared_stmt_count statements (current value: 16382) MYSQL预编译SQL数量超过限制问题

如果查出来数据为空 说明performance_schema参数值为OFF  未开启  将其开启 并重启数据库即可

为了方便查看

SELECT
    count() AS 重复数,
    GROUP_CONCAT(STATEMENT_ID SEPARATOR ',') as STATEMENT_IDS,
    t.

FROM
    PERFORMANCE_SCHEMA .prepared_statements_instances t
GROUP BY
    SQL_TEXT;

使用去重查询

Can't create more than max_prepared_stmt_count statements (current value: 16382) MYSQL预编译SQL数量超过限制问题

终于找到了“真凶”

Can't create more than max_prepared_stmt_count statements (current value: 16382) MYSQL预编译SQL数量超过限制问题

Can't create more than max_prepared_stmt_count statements (current value: 16382) MYSQL预编译SQL数量超过限制问题

这条预编译SQL居然有个值是动态的 而不是使用?占位 这就导致了每一次insert 都会缓存一个不同结构的预编译SQL 这才致使预编译SQL创建数量超过MAX值。。。

写这条SQL的小朋友我真的要抓起来吊打一顿!

最后总算是完美解决这个问题

相关文章: