MySQL 報 Can't create more than max_prepared_stmt_count statements


    • 前言

      • 最近壓測完畢以后, MySQL 報 Can't create more than max_prepared_stmt_count statements. 正常情況下是程序沒有關閉 stmt 導致. 也不排除並發量很大, MySQL 沒機會去關閉. 這種情況我們系統來說出現概率較少, 並發量還沒有那么大. 以下為定位問題的過程.

    • 操作

      • 1、出現此類問題, 如果是線上應立即執行 set global max_prepared_stmt_count = 1048576,先控制住錯誤。然后進行定位代碼。它的取值范圍為“0 - 1048576”,默認為16382。show variables like '%prepared%' 查看當前max_prepared_stmt_count的最大值。

      • 2、以下為在測試環境的操作,首先開啟mysql日志,容易定位錯誤。  set global general_log = on; 

      • 3、查看mysql日志存放路徑,show variables where Variable_name like "general_log%" 結果中會顯示。

      • 4、set global max_prepared_stmt_count = 1000 設置小點, 容易復現錯誤. 靜待錯誤發生.(也可以直接看日志, 但是日志太多, 不是很方便)

      • 5、錯誤爆發后,SHOW GLOBAL STATUS LIKE 'com_stmt%'。查看數據庫 prepare 的情況。如果Com_stmt_close與Com_stmt_prepare之間的差過大就會報錯。


      • 6、查看日志。正常情況日志由prepare、execute、close stmt組成,如果發現有很多prepare與execute組成,而沒有close stmt則基本定位到這條sql沒有close stmt。查看sql,定位源碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM