最近产品一直在这个错
当缓存的预编译SQL数量超过默认最大值时 就会产生如上错误 导致数据库直接无法使用 线上出现这个问题真是愁死人
话不多说 直接上解决思路:
当时发现这个问题的时候 查了下数据库预编译SQL创建次数
show global status like 'com_stmt%';
发现close 永远是0 这个问题源于vertx 以下是我在vertx官方提交的issue 在下个版本会做修复
https://github.com/vert-x3/issues/issues/444
但这仍然不是导致该问题最主要的原因 主要问题是为什么会创建了将近5万次的预编译SQL
在同一连接下 相同结构的预编译SQL是不会再被创建的 那么正常情况是不可能创建出5w个预编译SQL
所以目前可以猜测 肯定是在某个地方出现了动态的预编译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的小朋友我真的要抓起来吊打一顿!
最后总算是完美解决这个问题