-
前言
-
最近壓測完畢以后, 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,定位源碼。
-