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的小朋友我真的要抓起來吊打一頓!

最後總算是完美解決這個問題

相關文章
相關標籤/搜索