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

最近产品一直在这个错git

image

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

话很少说 直接上解决思路:数据库

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

show global status like 'com_stmt%';orm

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

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

但这仍然不是致使该问题最主要的缘由  主要问题是为何会建立了将近5万次的预编译SQL产品

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

因此目前能够猜想  确定是在某个地方出现了动态的预编译SQL编译

SELECT * FROM PERFORMANCE_SCHEMA .prepared_statements_instances;

执行以上SQL查询出已经缓存的预编译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;

使用去重查询

终于找到了“真凶”

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

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

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

相关文章
相关标签/搜索