最近产品一直在这个错git
当缓存的预编译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的小朋友我真的要抓起来吊打一顿!
最后总算是完美解决这个问题